From 97fae36910cca244436c1a3553af5c07f93a531e Mon Sep 17 00:00:00 2001 From: pgleeson Date: Thu, 21 Mar 2024 15:12:04 +0000 Subject: [PATCH 1/4] Onnx function docs updated --- docs/MDF_function_specifications.json | 42 +-- docs/MDF_function_specifications.md | 226 +++++++++-------- docs/MDF_function_specifications.yaml | 239 ++++++++++-------- .../source/api/MDF_function_specifications.md | 226 +++++++++-------- 4 files changed, 395 insertions(+), 338 deletions(-) diff --git a/docs/MDF_function_specifications.json b/docs/MDF_function_specifications.json index af079e18..ddab64cc 100644 --- a/docs/MDF_function_specifications.json +++ b/docs/MDF_function_specifications.json @@ -110,7 +110,7 @@ "expression_string": "actr.match_production(production,context)" }, "onnx::Abs": { - "description": "\nAbsolute takes one input data (Tensor) and produces one output data\n(Tensor) where the absolute is, y = abs(x), is applied to\nthe tensor elementwise.\n", + "description": "\nAbsolute takes one input data (Tensor) and produces one output data\n(Tensor) where absolute value, y = abs(x), is applied to\nthe tensor elementwise.\n", "arguments": [ "X" ], @@ -190,7 +190,7 @@ "expression_string": "onnx_ops.atanh(input)" }, "onnx::AveragePool": { - "description": "\n AveragePool consumes an input tensor X and applies average pooling across\n the tensor according to kernel sizes, stride sizes, and pad lengths.\n average pooling consisting of computing the average on all values of a\n subset of the input tensor according to the kernel size and downsampling the\n data into the output tensor Y for further processing. The output spatial shape will be following:\n ```\n output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1)\n ```\n or\n ```\n output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1)\n ```\n if ceil_mode is enabled\n\n ```\n * pad_shape[i] is sum of pads along axis i\n ```\n\n `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following:\n ```\n VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i])\n ```\n And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`:\n ```\n pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i]\n ```\n The output of each pooling window is divided by the number of elements (exclude pad when attribute count_include_pad is zero).\n ", + "description": "\n AveragePool consumes an input tensor X and applies average pooling across\n the tensor according to kernel sizes, stride sizes, and pad lengths.\n average pooling consisting of computing the average on all values of a\n subset of the input tensor according to the kernel size and downsampling the\n data into the output tensor Y for further processing. The output spatial shape will be following:\n ```\n output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1)\n ```\n or\n ```\n output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1)\n ```\n if ceil_mode is enabled\n\n ```\n * pad_shape[i] is sum of pads along axis i\n ```\n\n `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following when ceil_mode is enabled:\n ```\n VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i])\n ```\nor when ceil_mode is disabled:\n ```\n VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = floor(input_spatial_shape[i] / strides_spatial_shape[i])\n ```\n\n And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`:\n ```\n pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i]\n ```\n The output of each pooling window is divided by the number of elements (exclude pad when attribute count_include_pad is zero).\n ", "arguments": [ "X" ], @@ -385,14 +385,14 @@ "expression_string": "onnx_ops.dropout(data, ratio, training_mode, seed)" }, "onnx::DynamicQuantizeLinear": { - "description": "\nA Function to fuse calculation for Scale, Zero Point and FP32->8Bit convertion of FP32 Input data.\nOutputs Scale, ZeroPoint and Quantized Input for a given FP32 Input.\nScale is calculated as:\n```\ny_scale = (max(x) - min(x))/(qmax - qmin)\n```\n\n* where qmax and qmin are max and min values for quantization range .i.e [0, 255] in case of uint8\n* data range is adjusted to include 0.\n\nZero point is calculated as:\n```\nintermediate_zero_point = qmin - min(x)/y_scale\ny_zero_point = cast(round(saturate(itermediate_zero_point)))\n```\n\n* where qmax and qmin are max and min values for quantization range .i.e [0, 255] in case of uint8\n* for saturation, it saturates to [0, 255] if it's uint8, or [-127, 127] if it's int8. Right now only uint8 is supported.\n* rounding to nearest ties to even.\n\nData quantization formula is:\n```\ny = saturate (round (x / y_scale) + y_zero_point)\n```\n\n* for saturation, it saturates to [0, 255] if it's uint8, or [-127, 127] if it's int8. Right now only uint8 is supported.\n* rounding to nearest ties to even.\n", + "description": "\nA Function to fuse calculation for Scale, Zero Point and FP32->8Bit conversion of FP32 Input data.\nOutputs Scale, ZeroPoint and Quantized Input for a given FP32 Input.\nScale is calculated as:\n```\ny_scale = (maximum(0, max(x)) - minimum(0, min(x))) / (qmax - qmin)\n```\n\n* where qmax and qmin are max and min values for quantization range i.e. [0, 255] in case of uint8\n* data range is adjusted to include 0.\n\nZero point is calculated as:\n```\nintermediate_zero_point = qmin - min(x)/y_scale\ny_zero_point = cast(round(saturate(itermediate_zero_point)))\n```\n\n* where qmax and qmin are max and min values for quantization range .i.e [0, 255] in case of uint8\n* for saturation, it saturates to [0, 255] if it's uint8, or [-127, 127] if it's int8. Right now only uint8 is supported.\n* rounding to nearest ties to even.\n\nData quantization formula is:\n```\ny = saturate (round (x / y_scale) + y_zero_point)\n```\n\n* for saturation, it saturates to [0, 255] if it's uint8, or [-127, 127] if it's int8. Right now only uint8 is supported.\n* rounding to nearest ties to even.\n", "arguments": [ "x" ], "expression_string": "onnx_ops.dynamicquantizelinear(x)" }, "onnx::Einsum": { - "description": "\nAn einsum of the form `term1, term2 -> output-term` produces an output tensor using the following equation\n\n```\noutput[output-term] = reduce-sum( input1[term1] * input2[term] )\n```\n\nwhere the reduce-sum performs a summation over all the indices occurring in the input terms (term1, term2)\nthat do not occur in the output-term.\n\nThe Einsum operator evaluates algebraic tensor operations on a sequence of tensors, using the Einstein summation\nconvention. The equation string contains a comma-separated sequence of lower case letters. Each term corresponds to\nan operand tensor, and the characters within the terms correspond to operands dimensions.\n\nThis sequence may be followed by \"->\" to separate the left and right hand side of the equation.\nIf the equation contains \"->\" followed by the right-hand side, the explicit (not classical) form of the Einstein\nsummation is performed, and the right-hand side indices indicate output tensor dimensions. In other cases,\noutput indices are (implicitly) set to the alphabetically sorted sequence of indices appearing exactly once in the\nequation.\n\nWhen a dimension character is repeated in the left-hand side, it represents summation along the dimension.\n\nThe equation may contain ellipsis (\"...\") to enable broadcasting. Ellipsis must indicate a fixed number of dimensions.\nSpecifically, every occurrence of ellipsis in the equation must represent the same number of dimensions.\nThe right-hand side may contain exactly one ellipsis. In implicit mode, the ellipsis dimensions are set to the\nbeginning of the output. The equation string may contain space (U+0020) character.\n", + "description": "\nAn einsum of the form `term1, term2 -> output-term` produces an output tensor using the following equation\n\n```\noutput[output-term] = reduce-sum( input1[term1] * input2[term2] )\n```\n\nwhere the reduce-sum performs a summation over all the indices occurring in the input terms (term1, term2)\nthat do not occur in the output-term.\n\nThe Einsum operator evaluates algebraic tensor operations on a sequence of tensors, using the Einstein summation\nconvention. The equation string contains a comma-separated sequence of lower case letters. Each term corresponds to\nan operand tensor, and the characters within the terms correspond to operands dimensions.\n\nThis sequence may be followed by \"->\" to separate the left and right hand side of the equation.\nIf the equation contains \"->\" followed by the right-hand side, the explicit (not classical) form of the Einstein\nsummation is performed, and the right-hand side indices indicate output tensor dimensions. In other cases,\noutput indices are (implicitly) set to the alphabetically sorted sequence of indices appearing exactly once in the\nequation.\n\nWhen a dimension character is repeated in the left-hand side, it represents summation along the dimension.\n\nThe equation may contain ellipsis (\"...\") to enable broadcasting. Ellipsis must indicate a fixed number of dimensions.\nSpecifically, every occurrence of ellipsis in the equation must represent the same number of dimensions.\nThe right-hand side may contain exactly one ellipsis. In implicit mode, the ellipsis dimensions are set to the\nbeginning of the output. The equation string may contain space (U+0020) character.\n", "arguments": [ "Inputs" ], @@ -485,7 +485,7 @@ "expression_string": "onnx_ops.gatherelements(data, indices, axis)" }, "onnx::GatherND": { - "description": "\nGiven `data` tensor of rank `r` >= 1, `indices` tensor of rank `q` >= 1, and `batch_dims` integer `b`, this operator gathers\nslices of `data` into an output tensor of rank `q + r - indices_shape[-1] - 1 - b`.\n\n`indices` is an q-dimensional integer tensor, best thought of as a `(q-1)`-dimensional tensor of index-tuples into `data`,\nwhere each element defines a slice of `data`\n\n`batch_dims` (denoted as `b`) is an integer indicating the number of batch dimensions, i.e the leading `b` number of dimensions of\n`data` tensor and `indices` are representing the batches, and the gather starts from the `b+1` dimension.\n\nSome salient points about the inputs' rank and shape:\n\n1) r >= 1 and q >= 1 are to be honored. There is no dependency condition to be met between ranks `r` and `q`\n\n2) The first `b` dimensions of the shape of `indices` tensor and `data` tensor must be equal.\n\n3) b < min(q, r) is to be honored.\n\n4) The `indices_shape[-1]` should have a value between 1 (inclusive) and rank `r-b` (inclusive)\n\n5) All values in `indices` are expected to be within bounds [-s, s-1] along axis of size `s` (i.e.) `-data_shape[i] <= indices[...,i] <= data_shape[i] - 1`.\n It is an error if any of the index values are out of bounds.\n\nThe output is computed as follows:\n\nThe output tensor is obtained by mapping each index-tuple in the `indices` tensor to the corresponding slice of the input `data`.\n\n1) If `indices_shape[-1] > r-b` => error condition\n\n2) If `indices_shape[-1] == r-b`, since the rank of `indices` is `q`, `indices` can be thought of as `N` `(q-b-1)`-dimensional tensors\n containing 1-D tensors of dimension `r-b`, where `N` is an integer equals to the product of 1 and all the elements in the batch dimensions\n of the indices_shape. Let us think of each such `r-b` ranked tensor as `indices_slice`. Each *scalar value* corresponding to `data[0:b-1,indices_slice]`\n is filled into the corresponding location of the `(q-b-1)`-dimensional tensor to form the `output` tensor (Example 1 below)\n\n3) If `indices_shape[-1] < r-b`, since the rank of `indices` is `q`, `indices` can be thought of as `N` `(q-b-1)`-dimensional tensor\n containing 1-D tensors of dimension `< r-b`. Let us think of each such tensors as `indices_slice`. Each *tensor slice* corresponding\n to `data[0:b-1, indices_slice , :]` is filled into the corresponding location of the `(q-b-1)`-dimensional tensor\n to form the `output` tensor (Examples 2, 3, 4 and 5 below)\n\nThis operator is the inverse of `ScatterND`.\n\n`Example 1`\n\n batch_dims = 0\n\n data = [[0,1],[2,3]] # data_shape = [2, 2]\n\n indices = [[0,0],[1,1]] # indices_shape = [2, 2]\n\n output = [0,3] # output_shape = [2]\n\n`Example 2`\n\n batch_dims = 0\n\n data = [[0,1],[2,3]] # data_shape = [2, 2]\n\n indices = [[1],[0]] # indices_shape = [2, 1]\n\n output = [[2,3],[0,1]] # output_shape = [2, 2]\n\n`Example 3`\n\n batch_dims = 0\n\n data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2]\n\n indices = [[0,1],[1,0]] # indices_shape = [2, 2]\n\n output = [[2,3],[4,5]] # output_shape = [2, 2]\n\n`Example 4`\n\n batch_dims = 0\n\n data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2]\n\n indices = [[[0,1]],[[1,0]]] # indices_shape = [2, 1, 2]\n\n output = [[[2,3]],[[4,5]]] # output_shape = [2, 1, 2]\n\n`Example 5`\n\n batch_dims = 1\n\n data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2]\n\n indices = [[1],[0]] # indices_shape = [2, 1]\n\n output = [[2,3],[4,5]] # output_shape = [2, 2]\n\n\n", + "description": "\nGiven `data` tensor of rank `r` >= 1, `indices` tensor of rank `q` >= 1, and `batch_dims` integer `b`, this operator gathers\nslices of `data` into an output tensor of rank `q + r - indices_shape[-1] - 1 - b`.\n\n`indices` is an q-dimensional integer tensor, best thought of as a `(q-1)`-dimensional tensor of index-tuples into `data`,\nwhere each element defines a slice of `data`\n\n`batch_dims` (denoted as `b`) is an integer indicating the number of batch dimensions, i.e the leading `b` number of dimensions of\n`data` tensor and `indices` are representing the batches, and the gather starts from the `b+1` dimension.\n\nSome salient points about the inputs' rank and shape:\n\n1) r >= 1 and q >= 1 are to be honored. There is no dependency condition to be met between ranks `r` and `q`\n\n2) The first `b` dimensions of the shape of `indices` tensor and `data` tensor must be equal.\n\n3) b < min(q, r) is to be honored.\n\n4) The `indices_shape[-1]` should have a value between 1 (inclusive) and rank `r-b` (inclusive)\n\n5) All values in `indices` are expected to be within bounds [-s, s-1] along axis of size `s` (i.e.) `-data_shape[i] <= indices[...,i] <= data_shape[i] - 1`.\n It is an error if any of the index values are out of bounds.\n\nThe output is computed as follows:\n\nThe output tensor is obtained by mapping each index-tuple in the `indices` tensor to the corresponding slice of the input `data`.\n\n1) If `indices_shape[-1] > r-b` => error condition\n\n2) If `indices_shape[-1] == r-b`, since the rank of `indices` is `q`, `indices` can be thought of as `N` `(q-b-1)`-dimensional tensors\n containing 1-D tensors of dimension `r-b`, where `N` is an integer equals to the product of 1 and all the elements in the batch dimensions\n of the indices_shape. Let us think of each such `r-b` ranked tensor as `indices_slice`. Each *scalar value* corresponding to `data[0:b-1,indices_slice]`\n is filled into the corresponding location of the `(q-b-1)`-dimensional tensor to form the `output` tensor (Example 1 below)\n\n3) If `indices_shape[-1] < r-b`, since the rank of `indices` is `q`, `indices` can be thought of as `N` `(q-b-1)`-dimensional tensor\n containing 1-D tensors of dimension `< r-b`. Let us think of each such tensors as `indices_slice`. Each *tensor slice* corresponding\n to `data[0:b-1, indices_slice , :]` is filled into the corresponding location of the `(q-b-1)`-dimensional tensor\n to form the `output` tensor (Examples 2, 3, 4 and 5 below)\n\nThis operator is the inverse of `ScatterND`.\n\n**Example 1**\n\n```\nbatch_dims = 0\ndata = [[0,1],[2,3]] # data_shape = [2, 2]\nindices = [[0,0],[1,1]] # indices_shape = [2, 2]\noutput = [0,3] # output_shape = [2]\n```\n\n**Example 2**\n\n```\nbatch_dims = 0\ndata = [[0,1],[2,3]] # data_shape = [2, 2]\nindices = [[1],[0]] # indices_shape = [2, 1]\noutput = [[2,3],[0,1]] # output_shape = [2, 2]\n```\n\n**Example 3**\n\n```\nbatch_dims = 0\ndata = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2]\nindices = [[0,1],[1,0]] # indices_shape = [2, 2]\noutput = [[2,3],[4,5]] # output_shape = [2, 2]\n```\n\n**Example 4**\n\n```\nbatch_dims = 0\ndata = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2]\nindices = [[[0,1]],[[1,0]]] # indices_shape = [2, 1, 2]\noutput = [[[2,3]],[[4,5]]] # output_shape = [2, 1, 2]\n```\n\n**Example 5**\n\n```\nbatch_dims = 1\ndata = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2]\nindices = [[1],[0]] # indices_shape = [2, 1]\noutput = [[2,3],[4,5]] # output_shape = [2, 2]\n```\n", "arguments": [ "data", "indices" @@ -687,7 +687,7 @@ "expression_string": "onnx_ops.max(data_0)" }, "onnx::MaxPool": { - "description": "\n MaxPool consumes an input tensor X and applies max pooling across\n the tensor according to kernel sizes, stride sizes, and pad lengths.\n max pooling consisting of computing the max on all values of a\n subset of the input tensor according to the kernel size and downsampling the\n data into the output tensor Y for further processing. The output spatial shape will be following:\n ```\n output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1)\n ```\n or\n ```\n output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1)\n ```\n if ceil_mode is enabled `pad_shape[i]` is the sum of pads along axis `i`.\n\n `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following:\n ```\n VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i])\n ```\n And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`:\n ```\n pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i]\n ```\n The output of each pooling window is maximum number of elements exclude pad. \n ", + "description": "\n MaxPool consumes an input tensor X and applies max pooling across\n the tensor according to kernel sizes, stride sizes, and pad lengths.\n max pooling consisting of computing the max on all values of a\n subset of the input tensor according to the kernel size and downsampling the\n data into the output tensor Y for further processing. The output spatial shape is calculated differently\n depending on whether explicit padding is used, where pads is employed, or auto padding is used, where auto_pad is utilized.\n With explicit padding (https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html?highlight=maxpool#torch.nn.MaxPool2d):\n ```\n output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1)\n ```\n or\n ```\n output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1)\n ```\n if ceil_mode is enabled. `pad_shape[i]` is the sum of pads along axis `i`.\n\n `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following when ceil_mode is enabled:\n ```\n VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i])\n ```\n or when ceil_mode is disabled (https://www.tensorflow.org/api_docs/python/tf/keras/layers/AveragePooling2D):\n ```\n VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i]) + 1\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = floor((input_spatial_shape[i] - 1) / strides_spatial_shape[i]) + 1\n ```\n And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`:\n ```\n pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i]\n ```\n The output of each pooling window is maximum number of elements exclude pad. \n ", "arguments": [ "X" ], @@ -702,7 +702,7 @@ "expression_string": "onnx_ops.maxroipool(X, rois, pooled_shape, spatial_scale)" }, "onnx::MaxUnpool": { - "description": "\nMaxUnpool essentially computes the partial inverse of the MaxPool op.\n The input information to this op is typically the output information from a MaxPool op. The first\n input tensor X is the tensor that needs to be unpooled, which is typically the pooled tensor (first output)\n from MaxPool. The second input tensor, I, contains the indices to the (locally maximal) elements corrsponding\n to the elements in the first input tensor X. Input tensor I is typically the second output of the MaxPool op.\n The third (optional) input is a tensor that specifies the output size of the unpooling operation.\n\nMaxUnpool is intended to do 'partial' inverse of the MaxPool op. 'Partial' because all the non-maximal\n values from the original input to MaxPool are set to zero in the output of the MaxUnpool op. Pooling\n the result of an unpooling operation should give back the original input to the unpooling op.\n\nMaxUnpool can produce the same output size for several input sizes, which makes unpooling op ambiguous.\n The third input argument, output_size, is meant to disambiguate the op and produce output tensor of\n known/predictable size.\n\nIn addition to the inputs, MaxUnpool takes three attributes, namely kernel_shape, strides, and pads,\n which define the exact unpooling op. The attributes typically have the same values as the corrsponding\n pooling op that the unpooling op is trying to invert.\n", + "description": "\nMaxUnpool essentially computes the partial inverse of the MaxPool op.\n The input information to this op is typically the output information from a MaxPool op. The first\n input tensor X is the tensor that needs to be unpooled, which is typically the pooled tensor (first output)\n from MaxPool. The second input tensor, I, contains the indices to the (locally maximal) elements corresponding\n to the elements in the first input tensor X. Input tensor I is typically the second output of the MaxPool op.\n The third (optional) input is a tensor that specifies the output size of the unpooling operation.\n\nMaxUnpool is intended to do 'partial' inverse of the MaxPool op. 'Partial' because all the non-maximal\n values from the original input to MaxPool are set to zero in the output of the MaxUnpool op. Pooling\n the result of an unpooling operation should give back the original input to the unpooling op.\n\nMaxUnpool can produce the same output size for several input sizes, which makes unpooling op ambiguous.\n The third input argument, output_size, is meant to disambiguate the op and produce output tensor of\n known/predictable size.\n\nIn addition to the inputs, MaxUnpool takes three attributes, namely kernel_shape, strides, and pads,\n which define the exact unpooling op. The attributes typically have the same values as the corresponding\n pooling op that the unpooling op is trying to invert.\n", "arguments": [ "X", "I", @@ -951,63 +951,63 @@ "expression_string": "onnx_ops.reciprocal(X)" }, "onnx::ReduceL1": { - "description": "\nComputes the L1 norm of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the L1 norm of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields 0.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data" ], "expression_string": "onnx_ops.reducel1(data, axes, keepdims)" }, "onnx::ReduceL2": { - "description": "\nComputes the L2 norm of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the L2 norm of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields 0.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data" ], "expression_string": "onnx_ops.reducel2(data, axes, keepdims)" }, "onnx::ReduceLogSum": { - "description": "\nComputes the log sum of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the log sum of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields minus infinity (if supported by the datatype) or undefined otherwise.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data" ], "expression_string": "onnx_ops.reducelogsum(data, axes, keepdims)" }, "onnx::ReduceLogSumExp": { - "description": "\nComputes the log sum exponent of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the log sum exponent of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields minus infinity (if supported by the datatype) or undefined otherwise.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data" ], "expression_string": "onnx_ops.reducelogsumexp(data, axes, keepdims)" }, "onnx::ReduceMax": { - "description": "\nComputes the max of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the max of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields minus infinity (if supported by the datatype) or the minimum value of the data type otherwise.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data" ], "expression_string": "onnx_ops.reducemax(data, axes, keepdims)" }, "onnx::ReduceMean": { - "description": "\nComputes the mean of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the mean of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields undefined.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data" ], "expression_string": "onnx_ops.reducemean(data, axes, keepdims)" }, "onnx::ReduceMin": { - "description": "\nComputes the min of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the min of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields plus infinity (if supported by the datatype) or the maximum value of the data type otherwise.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data" ], "expression_string": "onnx_ops.reducemin(data, axes, keepdims)" }, "onnx::ReduceProd": { - "description": "\nComputes the product of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the product of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields 1.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data" ], "expression_string": "onnx_ops.reduceprod(data, axes, keepdims)" }, "onnx::ReduceSum": { - "description": "\nComputes the sum of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the sum of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields 0.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data", "axes" @@ -1015,7 +1015,7 @@ "expression_string": "onnx_ops.reducesum(data, axes, keepdims, noop_with_empty_axes)" }, "onnx::ReduceSumSquare": { - "description": "\nComputes the sum square of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid.\n\nThe above behavior is similar to numpy, with the exception that numpy defaults keepdims to\nFalse instead of True.", + "description": "\nComputes the sum square of the input tensor's elements along the provided axes. The resulting\ntensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then\nthe resulting tensor has the reduced dimension pruned. Input tensors of rank zero are\nvalid. Reduction over an empty set of values yields 0.\n\n\nThe above behavior is similar to numpy, with the exception that numpy defaults `keepdims`\nto `False` instead of `True`.", "arguments": [ "data" ], @@ -1064,7 +1064,7 @@ "expression_string": "onnx_ops.roialign(X, rois, batch_indices, mode, output_height, output_width, sampling_ratio, spatial_scale)" }, "onnx::Round": { - "description": "\nRound takes one input Tensor and rounds the values, element-wise, meaning\nit finds the nearest integer for each value.\nIn case of halfs, the rule is to round them to the nearest even integer.\nIf input x is integral, +0, -0, NaN, or infinite, x itself is returned.\nThe output tensor has the same shape and type as the input.\n\nExamples:\n```\nround([0.9]) = [1.0]\nround([2.5]) = [2.0]\nround([2.3]) = [2.0]\nround([1.5]) = [2.0]\nround([-4.5]) = [-4.0]\n```\n", + "description": "\nRound takes one input Tensor and rounds the values, element-wise, meaning\nit finds the nearest integer for each value.\nIn case of halves, the rule is to round them to the nearest even integer.\nIf input x is integral, +0, -0, NaN, or infinite, x itself is returned.\nThe output tensor has the same shape and type as the input.\n\nExamples:\n```\nround([0.9]) = [1.0]\nround([2.5]) = [2.0]\nround([2.3]) = [2.0]\nround([1.5]) = [2.0]\nround([-4.5]) = [-4.0]\n```\n", "arguments": [ "X" ], @@ -1198,7 +1198,7 @@ "expression_string": "onnx_ops.size(data)" }, "onnx::Slice": { - "description": "\nProduces a slice of the input tensor along multiple axes. Similar to numpy:\nhttps://numpy.org/doc/stable/user/basics.indexing.html?highlight=slice#slicing-and-striding\n\nSlice uses the `starts`, `ends`, `axes` and `steps` inputs to select a sub-tensor\nof its input `data` tensor.\n\nAn effective `start[i]`, `end[i]`, and `step[i]` must be computed for each `i`\nin `[0, ... r-1]` where `r = rank(input)` as follows:\n\nIf `axes` are omitted, they are set to `[0, ..., r-1]`.\nIf `steps` are omitted, they are set to `[1, ..., 1]` of length `len(starts)`\n\nThe effective values are initialized as `start[i] = 0`, `end[i] = dims[i]` where\n`dims` are the dimensions of `input` and `step[i] = `1.\n\nAll negative elements of `axes` are made non-negatve by adding `r` to them, where\n`r =rank(input)`.\n\nAll negative values in `starts[i]` and `ends[i]` have `dims[axes[i]]` added to them,\nwhere `dims` are the dimensions of `input`. Then `start[axes[i]]` is the adjusted\n`starts[i]` is clamped into the range `[0, dims[axes[i]]]` for positive stepping\nand `[0, dims[axes[i]]-1]` for negative stepping.\n\nThe clamping for the adjusted `ends[i]` depends on the sign of `steps[i]` and must\naccommodate copying 0 through `dims[axes[i]]` elements, so for positive stepping\n`end[axes[i]]` is clamped to `[0, dims[axes[i]]]`, while for negative stepping it\nis clamped to `[-1, dims[axes[i]]-1]`.\n\nFinally, `step[axes[i]] = steps[i]`.\n\nFor slicing to the end of a dimension with unknown size, it is recommended to pass\nin `INT_MAX` when slicing forward and 'INT_MIN' when slicing backward.\n\nExample 1:\n\n```\ndata = [\n [1, 2, 3, 4],\n [5, 6, 7, 8],\n]\naxes = [0, 1]\nstarts = [1, 0]\nends = [2, 3]\nsteps = [1, 2]\nresult = [\n [5, 7],\n]\n```\n\nExample 2:\n\n```\ndata = [\n [1, 2, 3, 4],\n [5, 6, 7, 8],\n]\nstarts = [0, 1]\nends = [-1, 1000]\nresult = [\n [2, 3, 4],\n]\n```\n", + "description": "\nProduces a slice of the input tensor along multiple axes. Similar to numpy:\nhttps://numpy.org/doc/stable/user/basics.indexing.html?highlight=slice#slicing-and-striding\n\nSlice uses the `starts`, `ends`, `axes` and `steps` inputs to select a sub-tensor\nof its input `data` tensor.\n\nAn effective `starts[i]`, `ends[i]`, and `steps[i]` must be computed for each `i`\nin `[0, ... r-1]` where `r = rank(input)` as follows:\n\nIf `axes` are omitted, they are set to `[0, ..., r-1]`.\nIf `steps` are omitted, they are set to `[1, ..., 1]` of length `len(starts)`\n\nThe effective values are initialized as `start[i] = 0`, `ends[i] = dims[i]` where\n`dims` are the dimensions of `input` and `steps[i] = 1`.\n\nAll negative elements of `axes` are made non-negative by adding `r` to them, where\n`r =rank(input)`.\n\nAll negative values in `starts[i]` and `ends[i]` have `dims[axes[i]]` added to them,\nwhere `dims` are the dimensions of `input`. Then `start[axes[i]]` is the adjusted\n`starts[i]` is clamped into the range `[0, dims[axes[i]]]` for positive stepping\nand `[0, dims[axes[i]]-1]` for negative stepping.\n\nThe clamping for the adjusted `ends[i]` depends on the sign of `steps[i]` and must\naccommodate copying 0 through `dims[axes[i]]` elements, so for positive stepping\n`ends[axes[i]]` is clamped to `[0, dims[axes[i]]]`, while for negative stepping it\nis clamped to `[-1, dims[axes[i]]-1]`.\n\nFinally, `steps[axes[i]] = steps[i]`.\n\nFor slicing to the end of a dimension with unknown size, it is recommended to pass\nin `INT_MAX` when slicing forward and 'INT_MIN' when slicing backward.\n\nExample 1:\n\n```\ndata = [\n [1, 2, 3, 4],\n [5, 6, 7, 8],\n]\naxes = [0, 1]\nstarts = [1, 0]\nends = [2, 3]\nsteps = [1, 2]\nresult = [\n [5, 7],\n]\n```\n\nExample 2:\n\n```\ndata = [\n [1, 2, 3, 4],\n [5, 6, 7, 8],\n]\nstarts = [0, 1]\nends = [-1, 1000]\nresult = [\n [2, 3, 4],\n]\n```\n", "arguments": [ "data", "starts", @@ -1216,7 +1216,7 @@ "expression_string": "onnx_ops.softmax(input, axis)" }, "onnx::SoftmaxCrossEntropyLoss": { - "description": "Loss function that measures the softmax cross entropy\nbetween 'scores' and 'labels'.\nThis operator first computes a loss tensor whose shape is identical to the labels input.\nIf the input is 2-D with shape (N, C), the loss tensor may be a N-element vector L = (l_1, l_2, ..., l_N).\nIf the input is N-D tensor with shape (N, C, D1, D2, ..., Dk),\nthe loss tensor L may have (N, D1, D2, ..., Dk) as its shape and L[i,][j_1][j_2]...[j_k] denotes a scalar element in L.\nAfter L is available, this operator can optionally do a reduction operator.\n\n* shape(scores): (N, C) where C is the number of classes, or (N, C, D1, D2,..., Dk),\n with K >= 1 in case of K-dimensional loss.\n* shape(labels): (N) where each value is 0 <= labels[i] <= C-1, or (N, D1, D2,..., Dk),\n with K >= 1 in case of K-dimensional loss.\n\nThe loss for one sample, l_i, can caculated as follows:\n```\nl[i][d1][d2]...[dk] = -y[i][c][d1][d2]..[dk], where i is the index of classes.\n```\nor\n```\nl[i][d1][d2]...[dk] = -y[i][c][d1][d2]..[dk] * weights[c], if 'weights' is provided.\n```\n\nloss is zero for the case when label-value equals ignore_index.\n```\nl[i][d1][d2]...[dk] = 0, when labels[n][d1][d2]...[dk] = ignore_index\n```\n\nwhere:\n```\np = Softmax(scores)\ny = Log(p)\nc = labels[i][d1][d2]...[dk]\n```\n\nFinally, L is optionally reduced:\n\n* If reduction = 'none', the output is L with shape (N, D1, D2, ..., Dk).\n* If reduction = 'sum', the output is scalar: Sum(L).\n* If reduction = 'mean', the output is scalar: ReduceMean(L), or if weight is provided: `ReduceSum(L) / ReduceSum(W)`,\n where tensor W is of shape `(N, D1, D2, ..., Dk)` and `W[n][d1][d2]...[dk] = weights[labels[i][d1][d2]...[dk]]`.\n", + "description": "Loss function that measures the softmax cross entropy\nbetween 'scores' and 'labels'.\nThis operator first computes a loss tensor whose shape is identical to the labels input.\nIf the input is 2-D with shape (N, C), the loss tensor may be a N-element vector L = (l_1, l_2, ..., l_N).\nIf the input is N-D tensor with shape (N, C, D1, D2, ..., Dk),\nthe loss tensor L may have (N, D1, D2, ..., Dk) as its shape and L[i,][j_1][j_2]...[j_k] denotes a scalar element in L.\nAfter L is available, this operator can optionally do a reduction operator.\n\n* shape(scores): (N, C) where C is the number of classes, or (N, C, D1, D2,..., Dk),\n with K >= 1 in case of K-dimensional loss.\n* shape(labels): (N) where each value is 0 <= labels[i] <= C-1, or (N, D1, D2,..., Dk),\n with K >= 1 in case of K-dimensional loss.\n\nThe loss for one sample, l_i, can calculated as follows:\n```\nl[i][d1][d2]...[dk] = -y[i][c][d1][d2]..[dk], where i is the index of classes.\n```\nor\n```\nl[i][d1][d2]...[dk] = -y[i][c][d1][d2]..[dk] * weights[c], if 'weights' is provided.\n```\n\nloss is zero for the case when label-value equals ignore_index.\n```\nl[i][d1][d2]...[dk] = 0, when labels[n][d1][d2]...[dk] = ignore_index\n```\n\nwhere:\n```\np = Softmax(scores)\ny = Log(p)\nc = labels[i][d1][d2]...[dk]\n```\n\nFinally, L is optionally reduced:\n\n* If reduction = 'none', the output is L with shape (N, D1, D2, ..., Dk).\n* If reduction = 'sum', the output is scalar: Sum(L).\n* If reduction = 'mean', the output is scalar: ReduceMean(L), or if weight is provided: `ReduceSum(L) / ReduceSum(W)`,\n where tensor W is of shape `(N, D1, D2, ..., Dk)` and `W[n][d1][d2]...[dk] = weights[labels[i][d1][d2]...[dk]]`.\n", "arguments": [ "scores", "labels", @@ -1358,7 +1358,7 @@ "expression_string": "onnx_ops.trilu(input, k, upper)" }, "onnx::Unique": { - "description": "\nFind the unique elements of a tensor. When an optional attribute 'axis' is provided, unique subtensors sliced along the 'axis' are returned.\nOtherwise the input tensor is flattened and unique values of the flattened tensor are returned.\n\nThis operator returns the unique values or sliced unique subtensors of the input tensor and three optional outputs.\nThe first output tensor 'Y' contains all unique values or subtensors of the input.\nThe second optional output tensor 'indices' contains indices of 'Y' elements' first occurance in 'X'..\nThe third optional output tensor 'inverse_indices' contains, for elements of 'X', its corresponding indices in 'Y'. \".\nThe fourth optional output tensor 'counts' contains the count of each element of 'Y' in the input.\n\nOutputs are either sorted in ascending order or optionally in the order of the first occurrence of the values in the input.\n\nhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html\n\nExample 1:\n```\ninput_X = [2, 1, 1, 3, 4, 3]\nattribute_sorted = 0\nattribute_axis = None\noutput_Y = [2, 1, 3, 4]\noutput_indices = [0, 1, 3, 4]\noutput_inverse_indices = [0, 1, 1, 2, 3, 2]\noutput_counts = [1, 2, 2, 1]\n```\n\nExample 2:\n```\ninput_X = [[1, 3], [2, 3]]\nattribute_sorted = 1\nattribute_axis = None\noutput_Y = [1, 2, 3]\noutput_indices = [0, 2, 1]\noutput_inverse_indices = [0, 2, 1, 2]\noutput_counts = [1, 1, 2]\n```\n\nExample 3:\n```\ninput_X = [[1, 0, 0], [1, 0, 0], [2, 3, 4]]\nattribute_sorted = 1\nattribute_axis = 0\noutput_Y = [[1, 0, 0], [2, 3, 4]]\noutput_indices = [0, 2]\noutput_inverse_indices = [0, 0, 1]\noutput_counts = [2, 1]\n```\n\nExample 4:\n```\ninput_x = [[[1., 1.], [0., 1.], [2., 1.], [0., 1.]],\n [[1., 1.], [0., 1.], [2., 1.], [0., 1.]]]\nattribute_sorted = 1\nattribute_axis = 1\n```\n\nintermediate data are presented below for better understanding:\nthere are 4 subtensors sliced along axis 1 of input_x (shape = (2, 4, 2)):\n```\nA: [[1, 1], [1, 1]],\n [[0, 1], [0, 1]],\n [[2, 1], [2, 1]],\n [[0, 1], [0, 1]].\n```\n\nthere are 3 unique subtensors:\n```\n[[1, 1], [1, 1]],\n[[0, 1], [0, 1]],\n[[2, 1], [2, 1]].\n```\n\nsorted unique subtensors:\n```\nB: [[0, 1], [0, 1]],\n [[1, 1], [1, 1]],\n [[2, 1], [2, 1]].\n```\n\noutput_Y is constructed from B:\n```\n[[[0. 1.], [1. 1.], [2. 1.]],\n [[0. 1.], [1. 1.], [2. 1.]]]\n```\n\noutput_indices is to map from B to A:\n```\n[1, 0, 2]\n```\n\noutput_inverse_indices is to map from A to B:\n```\n[1, 0, 2, 0]\n```\n\noutput_counts:\n```\n[2, 1, 1]\n```\n", + "description": "\nFind the unique elements of a tensor. When an optional attribute 'axis' is provided, unique subtensors sliced along the 'axis' are returned.\nOtherwise the input tensor is flattened and unique values of the flattened tensor are returned.\n\nThis operator returns the unique values or sliced unique subtensors of the input tensor and three optional outputs.\nThe first output tensor 'Y' contains all unique values or subtensors of the input.\nThe second optional output tensor 'indices' contains indices of 'Y' elements' first occurrence in 'X'.\nThe third optional output tensor 'inverse_indices' contains, for elements of 'X', its corresponding indices in 'Y'.\nThe fourth optional output tensor 'counts' contains the count of each element of 'Y' in the input.\n\nOutputs are either sorted in ascending order or optionally in the order of the first occurrence of the values in the input.\n\nhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html\n\nExample 1:\n```\ninput_X = [2, 1, 1, 3, 4, 3]\nattribute_sorted = 0\nattribute_axis = None\noutput_Y = [2, 1, 3, 4]\noutput_indices = [0, 1, 3, 4]\noutput_inverse_indices = [0, 1, 1, 2, 3, 2]\noutput_counts = [1, 2, 2, 1]\n```\n\nExample 2:\n```\ninput_X = [[1, 3], [2, 3]]\nattribute_sorted = 1\nattribute_axis = None\noutput_Y = [1, 2, 3]\noutput_indices = [0, 2, 1]\noutput_inverse_indices = [0, 2, 1, 2]\noutput_counts = [1, 1, 2]\n```\n\nExample 3:\n```\ninput_X = [[1, 0, 0], [1, 0, 0], [2, 3, 4]]\nattribute_sorted = 1\nattribute_axis = 0\noutput_Y = [[1, 0, 0], [2, 3, 4]]\noutput_indices = [0, 2]\noutput_inverse_indices = [0, 0, 1]\noutput_counts = [2, 1]\n```\n\nExample 4:\n```\ninput_x = [[[1., 1.], [0., 1.], [2., 1.], [0., 1.]],\n [[1., 1.], [0., 1.], [2., 1.], [0., 1.]]]\nattribute_sorted = 1\nattribute_axis = 1\n```\n\nintermediate data are presented below for better understanding:\nthere are 4 subtensors sliced along axis 1 of input_x (shape = (2, 4, 2)):\n```\nA: [[1, 1], [1, 1]],\n [[0, 1], [0, 1]],\n [[2, 1], [2, 1]],\n [[0, 1], [0, 1]].\n```\n\nthere are 3 unique subtensors:\n```\n[[1, 1], [1, 1]],\n[[0, 1], [0, 1]],\n[[2, 1], [2, 1]].\n```\n\nsorted unique subtensors:\n```\nB: [[0, 1], [0, 1]],\n [[1, 1], [1, 1]],\n [[2, 1], [2, 1]].\n```\n\noutput_Y is constructed from B:\n```\n[[[0. 1.], [1. 1.], [2. 1.]],\n [[0. 1.], [1. 1.], [2. 1.]]]\n```\n\noutput_indices is to map from B to A:\n```\n[1, 0, 2]\n```\n\noutput_inverse_indices is to map from A to B:\n```\n[1, 0, 2, 0]\n```\n\noutput_counts:\n```\n[2, 1, 1]\n```\n", "arguments": [ "X" ], diff --git a/docs/MDF_function_specifications.md b/docs/MDF_function_specifications.md index db58d62b..69848e9c 100644 --- a/docs/MDF_function_specifications.md +++ b/docs/MDF_function_specifications.md @@ -306,7 +306,7 @@ Python version: `actr.match_production(production,context)` ## Abs

Absolute takes one input data (Tensor) and produces one output data -(Tensor) where the absolute is, y = abs(x), is applied to +(Tensor) where absolute value, y = abs(x), is applied to the tensor elementwise.

@@ -452,11 +452,17 @@ Python version: `onnx_ops.anumpy.tanh(input)` * pad_shape[i] is sum of pads along axis i ``` - `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following: + `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following when ceil_mode is enabled: ``` VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i]) SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i]) ``` +or when ceil_mode is disabled: + ``` + VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i]) + SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = floor(input_spatial_shape[i] / strides_spatial_shape[i]) + ``` + And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`: ``` pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i] @@ -889,14 +895,14 @@ Python version: `onnx_ops.dropout(data, ratio, training_mode, seed)` ## DynamicQuantizeLinear

-A Function to fuse calculation for Scale, Zero Point and FP32->8Bit convertion of FP32 Input data. +A Function to fuse calculation for Scale, Zero Point and FP32->8Bit conversion of FP32 Input data. Outputs Scale, ZeroPoint and Quantized Input for a given FP32 Input. Scale is calculated as: ``` -y_scale = (max(x) - min(x))/(qmax - qmin) +y_scale = (maximum(0, max(x)) - minimum(0, min(x))) / (qmax - qmin) ``` -* where qmax and qmin are max and min values for quantization range .i.e [0, 255] in case of uint8 +* where qmax and qmin are max and min values for quantization range i.e. [0, 255] in case of uint8 * data range is adjusted to include 0. Zero point is calculated as: @@ -928,7 +934,7 @@ Python version: `onnx_ops.dynamicquantizelinear(x)` An einsum of the form `term1, term2 -> output-term` produces an output tensor using the following equation ``` -output[output-term] = reduce-sum( input1[term1] * input2[term] ) +output[output-term] = reduce-sum( input1[term1] * input2[term2] ) ``` where the reduce-sum performs a summation over all the indices occurring in the input terms (term1, term2) @@ -1276,57 +1282,50 @@ The output tensor is obtained by mapping each index-tuple in the `indices` tenso This operator is the inverse of `ScatterND`. -`Example 1` - - batch_dims = 0 - - data = [[0,1],[2,3]] # data_shape = [2, 2] - - indices = [[0,0],[1,1]] # indices_shape = [2, 2] - - output = [0,3] # output_shape = [2] - -`Example 2` - - batch_dims = 0 - - data = [[0,1],[2,3]] # data_shape = [2, 2] - - indices = [[1],[0]] # indices_shape = [2, 1] +**Example 1** - output = [[2,3],[0,1]] # output_shape = [2, 2] - -`Example 3` - - batch_dims = 0 - - data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] - - indices = [[0,1],[1,0]] # indices_shape = [2, 2] - - output = [[2,3],[4,5]] # output_shape = [2, 2] - -`Example 4` - - batch_dims = 0 - - data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] - - indices = [[[0,1]],[[1,0]]] # indices_shape = [2, 1, 2] +``` +batch_dims = 0 +data = [[0,1],[2,3]] # data_shape = [2, 2] +indices = [[0,0],[1,1]] # indices_shape = [2, 2] +output = [0,3] # output_shape = [2] +``` - output = [[[2,3]],[[4,5]]] # output_shape = [2, 1, 2] +**Example 2** -`Example 5` +``` +batch_dims = 0 +data = [[0,1],[2,3]] # data_shape = [2, 2] +indices = [[1],[0]] # indices_shape = [2, 1] +output = [[2,3],[0,1]] # output_shape = [2, 2] +``` - batch_dims = 1 +**Example 3** - data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] +``` +batch_dims = 0 +data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] +indices = [[0,1],[1,0]] # indices_shape = [2, 2] +output = [[2,3],[4,5]] # output_shape = [2, 2] +``` - indices = [[1],[0]] # indices_shape = [2, 1] +**Example 4** - output = [[2,3],[4,5]] # output_shape = [2, 2] +``` +batch_dims = 0 +data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] +indices = [[[0,1]],[[1,0]]] # indices_shape = [2, 1, 2] +output = [[[2,3]],[[4,5]]] # output_shape = [2, 1, 2] +``` +**Example 5** +``` +batch_dims = 1 +data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] +indices = [[1],[0]] # indices_shape = [2, 1] +output = [[2,3],[4,5]] # output_shape = [2, 2] +```

Python version: `onnx_ops.gathernd(data, indices, batch_dims)` @@ -1696,21 +1695,28 @@ Python version: `onnx_ops.max(data_0)` the tensor according to kernel sizes, stride sizes, and pad lengths. max pooling consisting of computing the max on all values of a subset of the input tensor according to the kernel size and downsampling the - data into the output tensor Y for further processing. The output spatial shape will be following: + data into the output tensor Y for further processing. The output spatial shape is calculated differently + depending on whether explicit padding is used, where pads is employed, or auto padding is used, where auto_pad is utilized. + With explicit padding (https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html?highlight=maxpool#torch.nn.MaxPool2d): ``` - output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1) + output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1) ``` or ``` - output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1) + output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1) ``` - if ceil_mode is enabled `pad_shape[i]` is the sum of pads along axis `i`. + if ceil_mode is enabled. `pad_shape[i]` is the sum of pads along axis `i`. - `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following: + `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following when ceil_mode is enabled: ``` VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i]) SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i]) ``` + or when ceil_mode is disabled (https://www.tensorflow.org/api_docs/python/tf/keras/layers/AveragePooling2D): + ``` + VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i]) + 1 + SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = floor((input_spatial_shape[i] - 1) / strides_spatial_shape[i]) + 1 + ``` And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`: ``` pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i] @@ -1739,7 +1745,7 @@ Python version: `onnx_ops.maxroipool(X, rois, pooled_shape, spatial_scale)` MaxUnpool essentially computes the partial inverse of the MaxPool op. The input information to this op is typically the output information from a MaxPool op. The first input tensor X is the tensor that needs to be unpooled, which is typically the pooled tensor (first output) - from MaxPool. The second input tensor, I, contains the indices to the (locally maximal) elements corrsponding + from MaxPool. The second input tensor, I, contains the indices to the (locally maximal) elements corresponding to the elements in the first input tensor X. Input tensor I is typically the second output of the MaxPool op. The third (optional) input is a tensor that specifies the output size of the unpooling operation. @@ -1752,7 +1758,7 @@ MaxUnpool can produce the same output size for several input sizes, which makes known/predictable size. In addition to the inputs, MaxUnpool takes three attributes, namely kernel_shape, strides, and pads, - which define the exact unpooling op. The attributes typically have the same values as the corrsponding + which define the exact unpooling op. The attributes typically have the same values as the corresponding pooling op that the unpooling op is trying to invert.

@@ -2402,12 +2408,13 @@ Python version: `onnx_ops.reciprocal(X)` ## ReduceL1

Computes the L1 norm of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 0. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducel1(data, axes, keepdims)` @@ -2417,12 +2424,13 @@ Python version: `onnx_ops.reducel1(data, axes, keepdims)` ## ReduceL2

Computes the L2 norm of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 0. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducel2(data, axes, keepdims)` @@ -2432,12 +2440,13 @@ Python version: `onnx_ops.reducel2(data, axes, keepdims)` ## ReduceLogSum

Computes the log sum of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields minus infinity (if supported by the datatype) or undefined otherwise. -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+ +The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducelogsum(data, axes, keepdims)` @@ -2447,12 +2456,13 @@ Python version: `onnx_ops.reducelogsum(data, axes, keepdims)` ## ReduceLogSumExp

Computes the log sum exponent of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields minus infinity (if supported by the datatype) or undefined otherwise. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducelogsumnumpy.exp(data, axes, keepdims)` @@ -2462,12 +2472,13 @@ Python version: `onnx_ops.reducelogsumnumpy.exp(data, axes, keepdims)` ## ReduceMax

Computes the max of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields minus infinity (if supported by the datatype) or the minimum value of the data type otherwise. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducemax(data, axes, keepdims)` @@ -2477,12 +2488,13 @@ Python version: `onnx_ops.reducemax(data, axes, keepdims)` ## ReduceMean

Computes the mean of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields undefined. -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+ +The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducemean(data, axes, keepdims)` @@ -2492,12 +2504,13 @@ Python version: `onnx_ops.reducemean(data, axes, keepdims)` ## ReduceMin

Computes the min of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields plus infinity (if supported by the datatype) or the maximum value of the data type otherwise. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducemin(data, axes, keepdims)` @@ -2507,12 +2520,13 @@ Python version: `onnx_ops.reducemin(data, axes, keepdims)` ## ReduceProd

Computes the product of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 1. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reduceprod(data, axes, keepdims)` @@ -2522,12 +2536,13 @@ Python version: `onnx_ops.reduceprod(data, axes, keepdims)` ## ReduceSum

Computes the sum of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 0. -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+ +The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducesum(data, axes, keepdims, noop_with_empty_axes)` @@ -2537,12 +2552,13 @@ Python version: `onnx_ops.reducesum(data, axes, keepdims, noop_with_empty_axes)` ## ReduceSumSquare

Computes the sum square of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 0. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducesumsquare(data, axes, keepdims)` @@ -2661,7 +2677,7 @@ Python version: `onnx_ops.roialign(X, rois, batch_indices, mode, output_height,

Round takes one input Tensor and rounds the values, element-wise, meaning it finds the nearest integer for each value. -In case of halfs, the rule is to round them to the nearest even integer. +In case of halves, the rule is to round them to the nearest even integer. If input x is integral, +0, -0, NaN, or infinite, x itself is returned. The output tensor has the same shape and type as the input. @@ -3072,16 +3088,16 @@ https://numpy.org/doc/stable/user/basics.indexing.html?highlight=slice#slicing-a Slice uses the `starts`, `ends`, `axes` and `steps` inputs to select a sub-tensor of its input `data` tensor. -An effective `start[i]`, `end[i]`, and `step[i]` must be computed for each `i` +An effective `starts[i]`, `ends[i]`, and `steps[i]` must be computed for each `i` in `[0, ... r-1]` where `r = rank(input)` as follows: If `axes` are omitted, they are set to `[0, ..., r-1]`. If `steps` are omitted, they are set to `[1, ..., 1]` of length `len(starts)` -The effective values are initialized as `start[i] = 0`, `end[i] = dims[i]` where -`dims` are the dimensions of `input` and `step[i] = `1. +The effective values are initialized as `start[i] = 0`, `ends[i] = dims[i]` where +`dims` are the dimensions of `input` and `steps[i] = 1`. -All negative elements of `axes` are made non-negatve by adding `r` to them, where +All negative elements of `axes` are made non-negative by adding `r` to them, where `r =rank(input)`. All negative values in `starts[i]` and `ends[i]` have `dims[axes[i]]` added to them, @@ -3091,10 +3107,10 @@ and `[0, dims[axes[i]]-1]` for negative stepping. The clamping for the adjusted `ends[i]` depends on the sign of `steps[i]` and must accommodate copying 0 through `dims[axes[i]]` elements, so for positive stepping -`end[axes[i]]` is clamped to `[0, dims[axes[i]]]`, while for negative stepping it +`ends[axes[i]]` is clamped to `[0, dims[axes[i]]]`, while for negative stepping it is clamped to `[-1, dims[axes[i]]-1]`. -Finally, `step[axes[i]] = steps[i]`. +Finally, `steps[axes[i]] = steps[i]`. For slicing to the end of a dimension with unknown size, it is recommended to pass in `INT_MAX` when slicing forward and 'INT_MIN' when slicing backward. @@ -3165,7 +3181,7 @@ After L is available, this operator can optionally do a reduction operator. * shape(labels): (N) where each value is 0 <= labels[i] <= C-1, or (N, D1, D2,..., Dk), with K >= 1 in case of K-dimensional loss. -The loss for one sample, l_i, can caculated as follows: +The loss for one sample, l_i, can calculated as follows: ``` l[i][d1][d2]...[dk] = -y[i][c][d1][d2]..[dk], where i is the index of classes. ``` @@ -3476,8 +3492,8 @@ Otherwise the input tensor is flattened and unique values of the flattened tenso This operator returns the unique values or sliced unique subtensors of the input tensor and three optional outputs. The first output tensor 'Y' contains all unique values or subtensors of the input. -The second optional output tensor 'indices' contains indices of 'Y' elements' first occurance in 'X'.. -The third optional output tensor 'inverse_indices' contains, for elements of 'X', its corresponding indices in 'Y'. ". +The second optional output tensor 'indices' contains indices of 'Y' elements' first occurrence in 'X'. +The third optional output tensor 'inverse_indices' contains, for elements of 'X', its corresponding indices in 'Y'. The fourth optional output tensor 'counts' contains the count of each element of 'Y' in the input. Outputs are either sorted in ascending order or optionally in the order of the first occurrence of the values in the input. diff --git a/docs/MDF_function_specifications.yaml b/docs/MDF_function_specifications.yaml index 2bb9bf08..6bd5aa99 100644 --- a/docs/MDF_function_specifications.yaml +++ b/docs/MDF_function_specifications.yaml @@ -95,7 +95,7 @@ onnx::Abs: Absolute takes one input data (Tensor) and produces one output data - (Tensor) where the absolute is, y = abs(x), is applied to + (Tensor) where absolute value, y = abs(x), is applied to the tensor elementwise. @@ -254,11 +254,15 @@ onnx::AveragePool: \ + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i]\ \ + 1)\n ```\n if ceil_mode is enabled\n\n ```\n * pad_shape[i] is sum of\ \ pads along axis i\n ```\n\n `auto_pad` is a DEPRECATED attribute. If you\ - \ are using them currently, the output spatial shape will be following:\n\ - \ ```\n VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i]\ + \ are using them currently, the output spatial shape will be following when\ + \ ceil_mode is enabled:\n ```\n VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i]\ + \ - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n\ + \ SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i]\ + \ / strides_spatial_shape[i])\n ```\nor when ceil_mode is disabled:\n ```\n\ + \ VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i]\ \ - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n SAME_UPPER or\ - \ SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i])\n\ - \ ```\n And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`:\n\ + \ SAME_LOWER: output_spatial_shape[i] = floor(input_spatial_shape[i] / strides_spatial_shape[i])\n\ + \ ```\n\n And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`:\n\ \ ```\n pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i]\ \ + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i]\n\ \ ```\n The output of each pooling window is divided by the number of elements\ @@ -808,7 +812,7 @@ onnx::Dropout: onnx::DynamicQuantizeLinear: description: ' - A Function to fuse calculation for Scale, Zero Point and FP32->8Bit convertion + A Function to fuse calculation for Scale, Zero Point and FP32->8Bit conversion of FP32 Input data. Outputs Scale, ZeroPoint and Quantized Input for a given FP32 Input. @@ -817,12 +821,12 @@ onnx::DynamicQuantizeLinear: ``` - y_scale = (max(x) - min(x))/(qmax - qmin) + y_scale = (maximum(0, max(x)) - minimum(0, min(x))) / (qmax - qmin) ``` - * where qmax and qmin are max and min values for quantization range .i.e [0, + * where qmax and qmin are max and min values for quantization range i.e. [0, 255] in case of uint8 * data range is adjusted to include 0. @@ -875,7 +879,7 @@ onnx::Einsum: ``` - output[output-term] = reduce-sum( input1[term1] * input2[term] ) + output[output-term] = reduce-sum( input1[term1] * input2[term2] ) ``` @@ -1175,22 +1179,22 @@ onnx::GatherND: \ tensors as `indices_slice`. Each *tensor slice* corresponding\n to `data[0:b-1,\ \ indices_slice , :]` is filled into the corresponding location of the `(q-b-1)`-dimensional\ \ tensor\n to form the `output` tensor (Examples 2, 3, 4 and 5 below)\n\n\ - This operator is the inverse of `ScatterND`.\n\n`Example 1`\n\n batch_dims\ - \ = 0\n\n data = [[0,1],[2,3]] # data_shape = [2, 2]\n\n indices =\ - \ [[0,0],[1,1]] # indices_shape = [2, 2]\n\n output = [0,3] \ - \ # output_shape = [2]\n\n`Example 2`\n\n batch_dims = 0\n\n data = [[0,1],[2,3]]\ - \ # data_shape = [2, 2]\n\n indices = [[1],[0]] # indices_shape = [2,\ - \ 1]\n\n output = [[2,3],[0,1]] # output_shape = [2, 2]\n\n`Example 3`\n\ - \n batch_dims = 0\n\n data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape\ - \ = [2, 2, 2]\n\n indices = [[0,1],[1,0]] # indices_shape\ - \ = [2, 2]\n\n output = [[2,3],[4,5]] # output_shape = [2,\ - \ 2]\n\n`Example 4`\n\n batch_dims = 0\n\n data = [[[0,1],[2,3]],[[4,5],[6,7]]]\ - \ # data_shape = [2, 2, 2]\n\n indices = [[[0,1]],[[1,0]]] #\ - \ indices_shape = [2, 1, 2]\n\n output = [[[2,3]],[[4,5]]] #\ - \ output_shape = [2, 1, 2]\n\n`Example 5`\n\n batch_dims = 1\n\n data \ - \ = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2]\n\n indices =\ - \ [[1],[0]] # indices_shape = [2, 1]\n\n output = [[2,3],[4,5]]\ - \ # output_shape = [2, 2]\n\n\n" + This operator is the inverse of `ScatterND`.\n\n**Example 1**\n\n```\nbatch_dims\ + \ = 0\ndata = [[0,1],[2,3]] # data_shape = [2, 2]\nindices = [[0,0],[1,1]]\ + \ # indices_shape = [2, 2]\noutput = [0,3] # output_shape =\ + \ [2]\n```\n\n**Example 2**\n\n```\nbatch_dims = 0\ndata = [[0,1],[2,3]]\ + \ # data_shape = [2, 2]\nindices = [[1],[0]] # indices_shape = [2,\ + \ 1]\noutput = [[2,3],[0,1]] # output_shape = [2, 2]\n```\n\n**Example\ + \ 3**\n\n```\nbatch_dims = 0\ndata = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape\ + \ = [2, 2, 2]\nindices = [[0,1],[1,0]] # indices_shape\ + \ = [2, 2]\noutput = [[2,3],[4,5]] # output_shape = [2,\ + \ 2]\n```\n\n**Example 4**\n\n```\nbatch_dims = 0\ndata = [[[0,1],[2,3]],[[4,5],[6,7]]]\ + \ # data_shape = [2, 2, 2]\nindices = [[[0,1]],[[1,0]]] # indices_shape\ + \ = [2, 1, 2]\noutput = [[[2,3]],[[4,5]]] # output_shape = [2,\ + \ 1, 2]\n```\n\n**Example 5**\n\n```\nbatch_dims = 1\ndata = [[[0,1],[2,3]],[[4,5],[6,7]]]\ + \ # data_shape = [2, 2, 2]\nindices = [[1],[0]] # indices_shape\ + \ = [2, 1]\noutput = [[2,3],[4,5]] # output_shape = [2,\ + \ 2]\n```\n" arguments: - data - indices @@ -1637,21 +1641,29 @@ onnx::MaxPool: \ the tensor according to kernel sizes, stride sizes, and pad lengths.\n max\ \ pooling consisting of computing the max on all values of a\n subset of the\ \ input tensor according to the kernel size and downsampling the\n data into\ - \ the output tensor Y for further processing. The output spatial shape will\ - \ be following:\n ```\n output_spatial_shape[i] = floor((input_spatial_shape[i]\ - \ + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i]\ - \ + 1)\n ```\n or\n ```\n output_spatial_shape[i] = ceil((input_spatial_shape[i]\ - \ + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i]\ - \ + 1)\n ```\n if ceil_mode is enabled `pad_shape[i]` is the sum of pads along\ - \ axis `i`.\n\n `auto_pad` is a DEPRECATED attribute. If you are using them\ - \ currently, the output spatial shape will be following:\n ```\n VALID: output_spatial_shape[i]\ - \ = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i]\ - \ + 1) + 1) / strides_spatial_shape[i])\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i]\ - \ = ceil(input_spatial_shape[i] / strides_spatial_shape[i])\n ```\n And pad\ - \ shape will be following if `SAME_UPPER` or `SAME_LOWER`:\n ```\n pad_shape[i]\ - \ = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i]\ - \ - 1) * dilations[i] + 1) - input_spatial_shape[i]\n ```\n The output of\ - \ each pooling window is maximum number of elements exclude pad. \n " + \ the output tensor Y for further processing. The output spatial shape is\ + \ calculated differently\n depending on whether explicit padding is used,\ + \ where pads is employed, or auto padding is used, where auto_pad is utilized.\n\ + \ With explicit padding (https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html?highlight=maxpool#torch.nn.MaxPool2d):\n\ + \ ```\n output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i]\ + \ - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] +\ + \ 1)\n ```\n or\n ```\n output_spatial_shape[i] = ceil((input_spatial_shape[i]\ + \ + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i]\ + \ + 1)\n ```\n if ceil_mode is enabled. `pad_shape[i]` is the sum of pads\ + \ along axis `i`.\n\n `auto_pad` is a DEPRECATED attribute. If you are using\ + \ them currently, the output spatial shape will be following when ceil_mode\ + \ is enabled:\n ```\n VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i]\ + \ - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n\ + \ SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i]\ + \ / strides_spatial_shape[i])\n ```\n or when ceil_mode is disabled (https://www.tensorflow.org/api_docs/python/tf/keras/layers/AveragePooling2D):\n\ + \ ```\n VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i]\ + \ - 1) * dilations[i] + 1)) / strides_spatial_shape[i]) + 1\n SAME_UPPER or\ + \ SAME_LOWER: output_spatial_shape[i] = floor((input_spatial_shape[i] - 1)\ + \ / strides_spatial_shape[i]) + 1\n ```\n And pad shape will be following\ + \ if `SAME_UPPER` or `SAME_LOWER`:\n ```\n pad_shape[i] = (output_spatial_shape[i]\ + \ - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i]\ + \ + 1) - input_spatial_shape[i]\n ```\n The output of each pooling window\ + \ is maximum number of elements exclude pad. \n " arguments: - X expression_string: onnx_ops.maxpool(X, auto_pad, ceil_mode, dilations, kernel_shape, @@ -1670,7 +1682,7 @@ onnx::MaxUnpool: \ from a MaxPool op. The first\n input tensor X is the tensor that needs to\ \ be unpooled, which is typically the pooled tensor (first output)\n from\ \ MaxPool. The second input tensor, I, contains the indices to the (locally\ - \ maximal) elements corrsponding\n to the elements in the first input tensor\ + \ maximal) elements corresponding\n to the elements in the first input tensor\ \ X. Input tensor I is typically the second output of the MaxPool op.\n The\ \ third (optional) input is a tensor that specifies the output size of the\ \ unpooling operation.\n\nMaxUnpool is intended to do 'partial' inverse of\ @@ -1683,7 +1695,7 @@ onnx::MaxUnpool: \ output tensor of\n known/predictable size.\n\nIn addition to the inputs,\ \ MaxUnpool takes three attributes, namely kernel_shape, strides, and pads,\n\ \ which define the exact unpooling op. The attributes typically have the same\ - \ values as the corrsponding\n pooling op that the unpooling op is trying\ + \ values as the corresponding\n pooling op that the unpooling op is trying\ \ to invert.\n" arguments: - X @@ -2338,19 +2350,20 @@ onnx::ReduceL1: Computes the L1 norm of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields 0. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data expression_string: onnx_ops.reducel1(data, axes, keepdims) @@ -2360,19 +2373,20 @@ onnx::ReduceL2: Computes the L2 norm of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields 0. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data expression_string: onnx_ops.reducel2(data, axes, keepdims) @@ -2382,19 +2396,21 @@ onnx::ReduceLogSum: Computes the log sum of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields minus infinity (if supported + by the datatype) or undefined otherwise. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data expression_string: onnx_ops.reducelogsum(data, axes, keepdims) @@ -2404,19 +2420,21 @@ onnx::ReduceLogSumExp: Computes the log sum exponent of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields minus infinity (if supported + by the datatype) or undefined otherwise. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data expression_string: onnx_ops.reducelogsumexp(data, axes, keepdims) @@ -2426,19 +2444,21 @@ onnx::ReduceMax: Computes the max of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields minus infinity (if supported + by the datatype) or the minimum value of the data type otherwise. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data expression_string: onnx_ops.reducemax(data, axes, keepdims) @@ -2448,19 +2468,20 @@ onnx::ReduceMean: Computes the mean of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields undefined. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data expression_string: onnx_ops.reducemean(data, axes, keepdims) @@ -2470,19 +2491,21 @@ onnx::ReduceMin: Computes the min of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields plus infinity (if supported + by the datatype) or the maximum value of the data type otherwise. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data expression_string: onnx_ops.reducemin(data, axes, keepdims) @@ -2492,19 +2515,20 @@ onnx::ReduceProd: Computes the product of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields 1. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data expression_string: onnx_ops.reduceprod(data, axes, keepdims) @@ -2514,19 +2538,20 @@ onnx::ReduceSum: Computes the sum of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields 0. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data - axes @@ -2537,19 +2562,20 @@ onnx::ReduceSumSquare: Computes the sum square of the input tensor''s elements along the provided axes. The resulting - tensor has the same rank as the input if keepdims equals 1. If keepdims equals - 0, then + tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` + equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are - valid. + valid. Reduction over an empty set of values yields 0. + The above behavior is similar to numpy, with the exception that numpy defaults - keepdims to + `keepdims` - False instead of True.' + to `False` instead of `True`.' arguments: - data expression_string: onnx_ops.reducesumsquare(data, axes, keepdims) @@ -2680,7 +2706,7 @@ onnx::Round: it finds the nearest integer for each value. - In case of halfs, the rule is to round them to the nearest even integer. + In case of halves, the rule is to round them to the nearest even integer. If input x is integral, +0, -0, NaN, or infinite, x itself is returned. @@ -3069,22 +3095,22 @@ onnx::Slice: description: "\nProduces a slice of the input tensor along multiple axes. Similar\ \ to numpy:\nhttps://numpy.org/doc/stable/user/basics.indexing.html?highlight=slice#slicing-and-striding\n\ \nSlice uses the `starts`, `ends`, `axes` and `steps` inputs to select a sub-tensor\n\ - of its input `data` tensor.\n\nAn effective `start[i]`, `end[i]`, and `step[i]`\ + of its input `data` tensor.\n\nAn effective `starts[i]`, `ends[i]`, and `steps[i]`\ \ must be computed for each `i`\nin `[0, ... r-1]` where `r = rank(input)`\ \ as follows:\n\nIf `axes` are omitted, they are set to `[0, ..., r-1]`.\n\ If `steps` are omitted, they are set to `[1, ..., 1]` of length `len(starts)`\n\ - \nThe effective values are initialized as `start[i] = 0`, `end[i] = dims[i]`\ - \ where\n`dims` are the dimensions of `input` and `step[i] = `1.\n\nAll negative\ - \ elements of `axes` are made non-negatve by adding `r` to them, where\n`r\ - \ =rank(input)`.\n\nAll negative values in `starts[i]` and `ends[i]` have\ + \nThe effective values are initialized as `start[i] = 0`, `ends[i] = dims[i]`\ + \ where\n`dims` are the dimensions of `input` and `steps[i] = 1`.\n\nAll negative\ + \ elements of `axes` are made non-negative by adding `r` to them, where\n\ + `r =rank(input)`.\n\nAll negative values in `starts[i]` and `ends[i]` have\ \ `dims[axes[i]]` added to them,\nwhere `dims` are the dimensions of `input`.\ \ Then `start[axes[i]]` is the adjusted\n`starts[i]` is clamped into the range\ \ `[0, dims[axes[i]]]` for positive stepping\nand `[0, dims[axes[i]]-1]` for\ \ negative stepping.\n\nThe clamping for the adjusted `ends[i]` depends on\ \ the sign of `steps[i]` and must\naccommodate copying 0 through `dims[axes[i]]`\ - \ elements, so for positive stepping\n`end[axes[i]]` is clamped to `[0, dims[axes[i]]]`,\ + \ elements, so for positive stepping\n`ends[axes[i]]` is clamped to `[0, dims[axes[i]]]`,\ \ while for negative stepping it\nis clamped to `[-1, dims[axes[i]]-1]`.\n\ - \nFinally, `step[axes[i]] = steps[i]`.\n\nFor slicing to the end of a dimension\ + \nFinally, `steps[axes[i]] = steps[i]`.\n\nFor slicing to the end of a dimension\ \ with unknown size, it is recommended to pass\nin `INT_MAX` when slicing\ \ forward and 'INT_MIN' when slicing backward.\n\nExample 1:\n\n```\ndata\ \ = [\n [1, 2, 3, 4],\n [5, 6, 7, 8],\n]\naxes = [0, 1]\nstarts = [1,\ @@ -3119,7 +3145,7 @@ onnx::SoftmaxCrossEntropyLoss: \ the number of classes, or (N, C, D1, D2,..., Dk),\n with K >= 1 in case\ \ of K-dimensional loss.\n* shape(labels): (N) where each value is 0 <= labels[i]\ \ <= C-1, or (N, D1, D2,..., Dk),\n with K >= 1 in case of K-dimensional\ - \ loss.\n\nThe loss for one sample, l_i, can caculated as follows:\n```\n\ + \ loss.\n\nThe loss for one sample, l_i, can calculated as follows:\n```\n\ l[i][d1][d2]...[dk] = -y[i][c][d1][d2]..[dk], where i is the index of classes.\n\ ```\nor\n```\nl[i][d1][d2]...[dk] = -y[i][c][d1][d2]..[dk] * weights[c], if\ \ 'weights' is provided.\n```\n\nloss is zero for the case when label-value\ @@ -3512,12 +3538,11 @@ onnx::Unique: \ unique subtensors of the input tensor and three optional outputs.\nThe first\ \ output tensor 'Y' contains all unique values or subtensors of the input.\n\ The second optional output tensor 'indices' contains indices of 'Y' elements'\ - \ first occurance in 'X'..\nThe third optional output tensor 'inverse_indices'\ - \ contains, for elements of 'X', its corresponding indices in 'Y'. \".\nThe\ - \ fourth optional output tensor 'counts' contains the count of each element\ - \ of 'Y' in the input.\n\nOutputs are either sorted in ascending order or\ - \ optionally in the order of the first occurrence of the values in the input.\n\ - \nhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html\n\ + \ first occurrence in 'X'.\nThe third optional output tensor 'inverse_indices'\ + \ contains, for elements of 'X', its corresponding indices in 'Y'.\nThe fourth\ + \ optional output tensor 'counts' contains the count of each element of 'Y'\ + \ in the input.\n\nOutputs are either sorted in ascending order or optionally\ + \ in the order of the first occurrence of the values in the input.\n\nhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html\n\ \nExample 1:\n```\ninput_X = [2, 1, 1, 3, 4, 3]\nattribute_sorted = 0\nattribute_axis\ \ = None\noutput_Y = [2, 1, 3, 4]\noutput_indices = [0, 1, 3, 4]\noutput_inverse_indices\ \ = [0, 1, 1, 2, 3, 2]\noutput_counts = [1, 2, 2, 1]\n```\n\nExample 2:\n\ diff --git a/docs/sphinx/source/api/MDF_function_specifications.md b/docs/sphinx/source/api/MDF_function_specifications.md index db58d62b..69848e9c 100644 --- a/docs/sphinx/source/api/MDF_function_specifications.md +++ b/docs/sphinx/source/api/MDF_function_specifications.md @@ -306,7 +306,7 @@ Python version: `actr.match_production(production,context)` ## Abs

Absolute takes one input data (Tensor) and produces one output data -(Tensor) where the absolute is, y = abs(x), is applied to +(Tensor) where absolute value, y = abs(x), is applied to the tensor elementwise.

@@ -452,11 +452,17 @@ Python version: `onnx_ops.anumpy.tanh(input)` * pad_shape[i] is sum of pads along axis i ``` - `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following: + `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following when ceil_mode is enabled: ``` VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i]) SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i]) ``` +or when ceil_mode is disabled: + ``` + VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i]) + SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = floor(input_spatial_shape[i] / strides_spatial_shape[i]) + ``` + And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`: ``` pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i] @@ -889,14 +895,14 @@ Python version: `onnx_ops.dropout(data, ratio, training_mode, seed)` ## DynamicQuantizeLinear

-A Function to fuse calculation for Scale, Zero Point and FP32->8Bit convertion of FP32 Input data. +A Function to fuse calculation for Scale, Zero Point and FP32->8Bit conversion of FP32 Input data. Outputs Scale, ZeroPoint and Quantized Input for a given FP32 Input. Scale is calculated as: ``` -y_scale = (max(x) - min(x))/(qmax - qmin) +y_scale = (maximum(0, max(x)) - minimum(0, min(x))) / (qmax - qmin) ``` -* where qmax and qmin are max and min values for quantization range .i.e [0, 255] in case of uint8 +* where qmax and qmin are max and min values for quantization range i.e. [0, 255] in case of uint8 * data range is adjusted to include 0. Zero point is calculated as: @@ -928,7 +934,7 @@ Python version: `onnx_ops.dynamicquantizelinear(x)` An einsum of the form `term1, term2 -> output-term` produces an output tensor using the following equation ``` -output[output-term] = reduce-sum( input1[term1] * input2[term] ) +output[output-term] = reduce-sum( input1[term1] * input2[term2] ) ``` where the reduce-sum performs a summation over all the indices occurring in the input terms (term1, term2) @@ -1276,57 +1282,50 @@ The output tensor is obtained by mapping each index-tuple in the `indices` tenso This operator is the inverse of `ScatterND`. -`Example 1` - - batch_dims = 0 - - data = [[0,1],[2,3]] # data_shape = [2, 2] - - indices = [[0,0],[1,1]] # indices_shape = [2, 2] - - output = [0,3] # output_shape = [2] - -`Example 2` - - batch_dims = 0 - - data = [[0,1],[2,3]] # data_shape = [2, 2] - - indices = [[1],[0]] # indices_shape = [2, 1] +**Example 1** - output = [[2,3],[0,1]] # output_shape = [2, 2] - -`Example 3` - - batch_dims = 0 - - data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] - - indices = [[0,1],[1,0]] # indices_shape = [2, 2] - - output = [[2,3],[4,5]] # output_shape = [2, 2] - -`Example 4` - - batch_dims = 0 - - data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] - - indices = [[[0,1]],[[1,0]]] # indices_shape = [2, 1, 2] +``` +batch_dims = 0 +data = [[0,1],[2,3]] # data_shape = [2, 2] +indices = [[0,0],[1,1]] # indices_shape = [2, 2] +output = [0,3] # output_shape = [2] +``` - output = [[[2,3]],[[4,5]]] # output_shape = [2, 1, 2] +**Example 2** -`Example 5` +``` +batch_dims = 0 +data = [[0,1],[2,3]] # data_shape = [2, 2] +indices = [[1],[0]] # indices_shape = [2, 1] +output = [[2,3],[0,1]] # output_shape = [2, 2] +``` - batch_dims = 1 +**Example 3** - data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] +``` +batch_dims = 0 +data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] +indices = [[0,1],[1,0]] # indices_shape = [2, 2] +output = [[2,3],[4,5]] # output_shape = [2, 2] +``` - indices = [[1],[0]] # indices_shape = [2, 1] +**Example 4** - output = [[2,3],[4,5]] # output_shape = [2, 2] +``` +batch_dims = 0 +data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] +indices = [[[0,1]],[[1,0]]] # indices_shape = [2, 1, 2] +output = [[[2,3]],[[4,5]]] # output_shape = [2, 1, 2] +``` +**Example 5** +``` +batch_dims = 1 +data = [[[0,1],[2,3]],[[4,5],[6,7]]] # data_shape = [2, 2, 2] +indices = [[1],[0]] # indices_shape = [2, 1] +output = [[2,3],[4,5]] # output_shape = [2, 2] +```

Python version: `onnx_ops.gathernd(data, indices, batch_dims)` @@ -1696,21 +1695,28 @@ Python version: `onnx_ops.max(data_0)` the tensor according to kernel sizes, stride sizes, and pad lengths. max pooling consisting of computing the max on all values of a subset of the input tensor according to the kernel size and downsampling the - data into the output tensor Y for further processing. The output spatial shape will be following: + data into the output tensor Y for further processing. The output spatial shape is calculated differently + depending on whether explicit padding is used, where pads is employed, or auto padding is used, where auto_pad is utilized. + With explicit padding (https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html?highlight=maxpool#torch.nn.MaxPool2d): ``` - output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1) + output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1) ``` or ``` - output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i] + 1) + output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1) ``` - if ceil_mode is enabled `pad_shape[i]` is the sum of pads along axis `i`. + if ceil_mode is enabled. `pad_shape[i]` is the sum of pads along axis `i`. - `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following: + `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following when ceil_mode is enabled: ``` VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i]) SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i]) ``` + or when ceil_mode is disabled (https://www.tensorflow.org/api_docs/python/tf/keras/layers/AveragePooling2D): + ``` + VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i]) + 1 + SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = floor((input_spatial_shape[i] - 1) / strides_spatial_shape[i]) + 1 + ``` And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`: ``` pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i] @@ -1739,7 +1745,7 @@ Python version: `onnx_ops.maxroipool(X, rois, pooled_shape, spatial_scale)` MaxUnpool essentially computes the partial inverse of the MaxPool op. The input information to this op is typically the output information from a MaxPool op. The first input tensor X is the tensor that needs to be unpooled, which is typically the pooled tensor (first output) - from MaxPool. The second input tensor, I, contains the indices to the (locally maximal) elements corrsponding + from MaxPool. The second input tensor, I, contains the indices to the (locally maximal) elements corresponding to the elements in the first input tensor X. Input tensor I is typically the second output of the MaxPool op. The third (optional) input is a tensor that specifies the output size of the unpooling operation. @@ -1752,7 +1758,7 @@ MaxUnpool can produce the same output size for several input sizes, which makes known/predictable size. In addition to the inputs, MaxUnpool takes three attributes, namely kernel_shape, strides, and pads, - which define the exact unpooling op. The attributes typically have the same values as the corrsponding + which define the exact unpooling op. The attributes typically have the same values as the corresponding pooling op that the unpooling op is trying to invert.

@@ -2402,12 +2408,13 @@ Python version: `onnx_ops.reciprocal(X)` ## ReduceL1

Computes the L1 norm of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 0. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducel1(data, axes, keepdims)` @@ -2417,12 +2424,13 @@ Python version: `onnx_ops.reducel1(data, axes, keepdims)` ## ReduceL2

Computes the L2 norm of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 0. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducel2(data, axes, keepdims)` @@ -2432,12 +2440,13 @@ Python version: `onnx_ops.reducel2(data, axes, keepdims)` ## ReduceLogSum

Computes the log sum of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields minus infinity (if supported by the datatype) or undefined otherwise. -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+ +The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducelogsum(data, axes, keepdims)` @@ -2447,12 +2456,13 @@ Python version: `onnx_ops.reducelogsum(data, axes, keepdims)` ## ReduceLogSumExp

Computes the log sum exponent of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields minus infinity (if supported by the datatype) or undefined otherwise. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducelogsumnumpy.exp(data, axes, keepdims)` @@ -2462,12 +2472,13 @@ Python version: `onnx_ops.reducelogsumnumpy.exp(data, axes, keepdims)` ## ReduceMax

Computes the max of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields minus infinity (if supported by the datatype) or the minimum value of the data type otherwise. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducemax(data, axes, keepdims)` @@ -2477,12 +2488,13 @@ Python version: `onnx_ops.reducemax(data, axes, keepdims)` ## ReduceMean

Computes the mean of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields undefined. -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+ +The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducemean(data, axes, keepdims)` @@ -2492,12 +2504,13 @@ Python version: `onnx_ops.reducemean(data, axes, keepdims)` ## ReduceMin

Computes the min of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields plus infinity (if supported by the datatype) or the maximum value of the data type otherwise. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducemin(data, axes, keepdims)` @@ -2507,12 +2520,13 @@ Python version: `onnx_ops.reducemin(data, axes, keepdims)` ## ReduceProd

Computes the product of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 1. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reduceprod(data, axes, keepdims)` @@ -2522,12 +2536,13 @@ Python version: `onnx_ops.reduceprod(data, axes, keepdims)` ## ReduceSum

Computes the sum of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 0. -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+ +The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducesum(data, axes, keepdims, noop_with_empty_axes)` @@ -2537,12 +2552,13 @@ Python version: `onnx_ops.reducesum(data, axes, keepdims, noop_with_empty_axes)` ## ReduceSumSquare

Computes the sum square of the input tensor's elements along the provided axes. The resulting -tensor has the same rank as the input if keepdims equals 1. If keepdims equals 0, then +tensor has the same rank as the input if `keepdims` equals 1. If `keepdims` equals 0, then the resulting tensor has the reduced dimension pruned. Input tensors of rank zero are -valid. +valid. Reduction over an empty set of values yields 0. + -The above behavior is similar to numpy, with the exception that numpy defaults keepdims to -False instead of True.

+The above behavior is similar to numpy, with the exception that numpy defaults `keepdims` +to `False` instead of `True`.

Python version: `onnx_ops.reducesumsquare(data, axes, keepdims)` @@ -2661,7 +2677,7 @@ Python version: `onnx_ops.roialign(X, rois, batch_indices, mode, output_height,

Round takes one input Tensor and rounds the values, element-wise, meaning it finds the nearest integer for each value. -In case of halfs, the rule is to round them to the nearest even integer. +In case of halves, the rule is to round them to the nearest even integer. If input x is integral, +0, -0, NaN, or infinite, x itself is returned. The output tensor has the same shape and type as the input. @@ -3072,16 +3088,16 @@ https://numpy.org/doc/stable/user/basics.indexing.html?highlight=slice#slicing-a Slice uses the `starts`, `ends`, `axes` and `steps` inputs to select a sub-tensor of its input `data` tensor. -An effective `start[i]`, `end[i]`, and `step[i]` must be computed for each `i` +An effective `starts[i]`, `ends[i]`, and `steps[i]` must be computed for each `i` in `[0, ... r-1]` where `r = rank(input)` as follows: If `axes` are omitted, they are set to `[0, ..., r-1]`. If `steps` are omitted, they are set to `[1, ..., 1]` of length `len(starts)` -The effective values are initialized as `start[i] = 0`, `end[i] = dims[i]` where -`dims` are the dimensions of `input` and `step[i] = `1. +The effective values are initialized as `start[i] = 0`, `ends[i] = dims[i]` where +`dims` are the dimensions of `input` and `steps[i] = 1`. -All negative elements of `axes` are made non-negatve by adding `r` to them, where +All negative elements of `axes` are made non-negative by adding `r` to them, where `r =rank(input)`. All negative values in `starts[i]` and `ends[i]` have `dims[axes[i]]` added to them, @@ -3091,10 +3107,10 @@ and `[0, dims[axes[i]]-1]` for negative stepping. The clamping for the adjusted `ends[i]` depends on the sign of `steps[i]` and must accommodate copying 0 through `dims[axes[i]]` elements, so for positive stepping -`end[axes[i]]` is clamped to `[0, dims[axes[i]]]`, while for negative stepping it +`ends[axes[i]]` is clamped to `[0, dims[axes[i]]]`, while for negative stepping it is clamped to `[-1, dims[axes[i]]-1]`. -Finally, `step[axes[i]] = steps[i]`. +Finally, `steps[axes[i]] = steps[i]`. For slicing to the end of a dimension with unknown size, it is recommended to pass in `INT_MAX` when slicing forward and 'INT_MIN' when slicing backward. @@ -3165,7 +3181,7 @@ After L is available, this operator can optionally do a reduction operator. * shape(labels): (N) where each value is 0 <= labels[i] <= C-1, or (N, D1, D2,..., Dk), with K >= 1 in case of K-dimensional loss. -The loss for one sample, l_i, can caculated as follows: +The loss for one sample, l_i, can calculated as follows: ``` l[i][d1][d2]...[dk] = -y[i][c][d1][d2]..[dk], where i is the index of classes. ``` @@ -3476,8 +3492,8 @@ Otherwise the input tensor is flattened and unique values of the flattened tenso This operator returns the unique values or sliced unique subtensors of the input tensor and three optional outputs. The first output tensor 'Y' contains all unique values or subtensors of the input. -The second optional output tensor 'indices' contains indices of 'Y' elements' first occurance in 'X'.. -The third optional output tensor 'inverse_indices' contains, for elements of 'X', its corresponding indices in 'Y'. ". +The second optional output tensor 'indices' contains indices of 'Y' elements' first occurrence in 'X'. +The third optional output tensor 'inverse_indices' contains, for elements of 'X', its corresponding indices in 'Y'. The fourth optional output tensor 'counts' contains the count of each element of 'Y' in the input. Outputs are either sorted in ascending order or optionally in the order of the first occurrence of the values in the input. From 1bcc11dcd78eab481e65fa544d41eb39faf15fa0 Mon Sep 17 00:00:00 2001 From: pgleeson Date: Thu, 21 Mar 2024 15:33:43 +0000 Subject: [PATCH 2/4] OXXN regenerated with latest onnx lib versions --- examples/ONNX/ab.json | 2 +- examples/ONNX/ab.png | Bin 44513 -> 44145 bytes examples/ONNX/ab.yaml | 2 +- examples/ONNX/abc.json | 6 +- examples/ONNX/abc.yaml | 6 +- examples/ONNX/abcd.json | 2 +- examples/ONNX/abcd.yaml | 2 +- examples/PyTorch/MDF_PyTorch/ABCD.onnx | Bin 13273 -> 13274 bytes examples/PyTorch/MDF_PyTorch/Arrays.onnx | Bin 949 -> 950 bytes examples/PyTorch/MDF_PyTorch/Simple.onnx | Bin 6276 -> 6277 bytes examples/PyTorch/inception.json | 3718 ++++++++++------------ examples/PyTorch/inception.png | Bin 780160 -> 797110 bytes 12 files changed, 1703 insertions(+), 2035 deletions(-) diff --git a/examples/ONNX/ab.json b/examples/ONNX/ab.json index 71bcd02f..1e96f3cf 100644 --- a/examples/ONNX/ab.json +++ b/examples/ONNX/ab.json @@ -3,7 +3,7 @@ "format": "ModECI MDF v0.4", "generating_application": "Python modeci-mdf v0.4.9", "graphs": { - "torch_jit": { + "main_graph": { "nodes": { "/A/Add": { "input_ports": { diff --git a/examples/ONNX/ab.png b/examples/ONNX/ab.png index 9571df211c3c7dfa35a3d3fc46f0081e071d4f7b..3edee23c99e87323807cee59057297354a7b7c53 100644 GIT binary patch literal 44145 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 literal 44513 zcmce;1yq%7yDo~YND2ayGDSd2x{Koj@SLR#KbH^3;>nA58hKWv$j)sPYDItzjKtsFYjfQrq?dE0p zn@z9GI{4$duA~?e?fl}uuhnUxXlVD*B#=)PonuxfoHX!6l33Es2UMvZtdy zcssw-t?gm2?!o7v{xfNO$L>Y7AF;MxKh?7r>@3SldX*pUlJqJ*!M}=p`r+nH#J8Oq zhOvcHz4i)*Zw%kc&}%nnyjJ6kI@yd2n`vY_BO~XSF+|`h(9m3UziwQ*_~A*Ak1PJg z4?DMZX)pd<#M@`t2-1o8^!IagbktO3_L>}3KmGFMOKzTvj}14e2lfp#w6E8KGRT!^ z@&Ek!6A}{Q=jV6%&96VJ_-LOQ7#JEq-eYswn$6d1A|`sJa}^CO?tV4US2+M_k8xOad&0tg@Qs%Y-~7_=JLWq z+C~CgE`NXVE^U0*RE5JzM>N-!%awM2PFa5={j$Vu@Zs(al3f0v-13W8ze4q4TO5-z#Wn z0&3y>UHJFz9kxBLWqA4R6@0f$0{_=7eRK1Z0Tu1?^77NIw#SBshLa;#C>QAu5&x5vz?pv=~WGt_zH#6T6O-4pmT~)OsfPfWAu&>h6R#7R{ zZ~64&-Hkl;QY^M4G+99(oxyBXyZ!ZviApDRRn?`xSC6-J!14Zge`CR#Tiavz?g#nT zX>Yf*hfk09SKJuj?nIUf$g921J*}-bKRuLm=8wbbyZj{l_aEntn&b7u?FBnKyIlbS zIH{k#YS20yx%=zW7ilsBIx=X^7^%|H^Gi$RR#So=*s!Lqh}eOoxw$#m0C_b>bjr(@ z;&@517AVdS#N6H8U0lj*nqcb-1a>a>l$CM6c+qDR@1d-6>(VcqC}y3v85t%T8Zk9D z{`D)fv-%Vi6ilU(TE^&TngMNdM+XN~G&C!2_u;Z<7PHAaIy%U>t-t0LyuoUj+oJF~ z$xlsvmLtHyp+pz9TtZ0C$+_2?A_@DY!glVtThdptD>ty(+uHi}VPAi3>KU;&G%!f1 zuCBf~KuYq(XJ>gpGRI>mSF_NlD~?6a2g@zr2aBvix8cM1xQ3aTnU~kOqv+G1)z#I^ z%*-7Di0nlhdrl!b0)J^~X@@XO`^C{>vyP1wX<6B>_I7@U<s~wsc^{ok{Zl-YPQ>u=@O;>uA07>gmW!*j;rJTgpk&yaH>pC59rE3T zSYk~=!`I=WG5J0FJ0_~#R1hJ~Zf;qeTZbnfKVs}{w}jGoxVzi;uAH476F%00n>4ez zt7Uf)$F2-gFC6UPmPmv=t47`R<>b1Dw7o2JbecQWwuKI7L*brl_D0Q= zl$1>KFndX_p`pEw!`LCud|bE)k4%_1EIFQ(Ubc6`fHb; z8o5fO^tQK4A#CmK_0@+>6fF|rg1hSz$k#e^wW^m_R?KvD6U{?f^m}@GN=ix~)$H!> zcJXgx;QApGZxb@vrw+kBp0nk_RaIB#qVSo&NLV}8>0*_I^KI*pgWz9frKF_9FFu=F zTe@RiF+BBOK9a4ZFtDq;E7knl7o2Nq#xm2>%bYgi;^X5BymcaigM(rJ%Q&pF!Abe} zDzmd!Tf^ufUddMGe*OCO`*+>Kw!goBbP)2Nhs@m`nFv!i##U|&swz0{`%iD+b-`g9+ z8R)w8)^KZkJ5Qs$z_o|3i|ne-{=X$jc;MqXS;rNheL*Qf7BkEz_6Tpxvn zhf7l3QBfJ{?NxxtD2@*vAiY-Y9~h`r>*;|+zW*nVZ?99Vl{^b1Jsfs@G%_|;Nbxz( zu~+b-A`0NGQ@}l=p?L^j#1R_W(fj{z-C35u`1@{}{-ldPzsjax#0}b$c)5!$hW1)8 zf&72-0A)wyPr}pha#UFx@A}SY$8nh_lKaXlDt?ZO6ZAORnNQf-+Jf!%-rIX^th8%* z_~1{FbilHlq@?6y?HUbDO#$m)-y!7e%16&aP{_oxva;-K1_*hHP->`!i03jgoE#iv ztoq`Ffm%bRrlxgub*yY`qKJ@p??h~D^5f&D=<}+258GvDM&L#kO(*O;`@6q?Z*1=! zZ!TJKqzsYdu(IA=9{Bq8YsQPT5+X(>CK*Xd`p1urh*EDq8xqVE>FDaxF3@i&w_E6p z<=dYL67t;X5eo{v3<)I=jBB*e`8O;hC4^D*vf zO)&<7Jk3hS<^Bw9uTuvlr2+5Tgq9N(4?|mcLtnUXlkt(jl})JcXNxg@?C7j2w;cRs zqgm>|k$aU+?eRk>3bJwhhts|k#6(5zK9ED{ovP+ccIkM zt(~3l^EXbH&Um5oRQPnaQD8O6EypdeX)VNk7`wuU7rme@U7$=i13N3gQ6L~>dX`_{_~ ze1~Us4h0zkFWAq<0r=)4;NTxR-Fg8ePmf#nW++wIZ|+WxXzaN=o6T? zZPyutCYjEOmaV=|$CTq`y&`%bQa|#p39sj{awx^NJTl}@`%}F;w>Oyh_Os;Z1U(j_ zLf%Z@7CGtPBPSt&s?OuGr9aSER8;i-{nZ;cZeaPcnGG@+@cGueK+=FM92y$B+z|zN z{no8pm*2eF{PjbxDbRrA(ESW*&_a7;y&)`~9=#AJ9X@(eVj?-e^RLxaevc!2Ha0fI z9X}+EOiTo~jc&Z4M^rp*ae~^*mr@bTPwzR{+piAg#b;$@aV}`6*5k@cOLxTZ*eP!K z7nhbU{Bed3!)v2@pM60>R(7h)CP|#?!^e-aw&fa3DhvdL39nzHAu6ED(9$Bu4Imd# zyN|QD`Cd^;>7wkWr4_mv?Web=QiVOYnyQKY^hwvqXkle#<@fJI431h;Q{S15jj7y1 z2>xz7`})J4nAXG;BQI6Yv(lo1W28L;<59}F$En$PhX1~$C5qQQiFReXJ61@W?@^zn$N~ z6=~-#H9|GFzBe+cGZTExX4F|$UY;N7oekYjcvx8V;e7P`{5+r2y5a;k3kwTGRdVud z6NMMQ=Lz@N!NnFIDKKdL{76enD@!F$&~=A4+Ht8jMJ$NC+Wl~AFh^ZBmUkComQE$q z|HB7pv-rfsnwI*~;)T3C;rA}Td5!Ar>)YR$q97m`{9SG;sHlWd|M~OhgQFu;mw8qA zczb*M6Fycp+uz#y;OA#j$XCz2`Z*bLe|fnJteoTOaK6n0cW!|rduvujEW)03NzGM*Zq&@yho%SInjBC;iHxbB|;*3M3a8t*@WaK0hLi z?-Fv^qQVUz<*}WpaM)hxvhqxf!d8+tH_xuDtX%$>VFA?>QSskL>^YCBE`b;T_H%XeefNJikGo1U$g`zz=vp}#KSICXIPn3v4 z3kQ*0+&p7j4jlr$ayGO-_Y=9M++R4j&8b!S`%79_Fdn-=v+}rV^D?f1p&=_qlEybE zT62G#SJ&d8WANOcaPp&l^a#ocbQ_NzJkaZk6L8yG^$QBx-`UZ(l4WOR-rU}XW~bjU zJyV}m_0_9iAMVl@@mnJx&#KqBAIb`y&d$v_K!sUcG#)U{)2c=-PFB0A8NPsi@e@2N z+pPoWmhq^iUd7k+uH7;TeaTQ`JJ$-U7RCtI_4Xx$p^>_Jr77d`=HD{uS+Q`MWSWvZ zsuCCCCq=2^sT6R?jd>s8>0#jOq^YSXjm)GkL>57a!K3sX$W(&(({}&kU0m$29SC`d zCxP33vD<7Yx8dhcK%lS0)O7jK3~ zp}3!ZGTwsMo4T`OA1P&MY@BYcW0lLuz(5tCl2eWqj|nZzdYW5jkYhv$<}+hoi*kA+D)eN(_8b!v^I~VFNkt|e#RL;G zg`4T?&;I)LUGQ31XlN3#QjKMXrij6{Yu7Ra#Rjw>S4~b%nr`42q|sQIoAU-+j~1CY zIy(AdQ!vree*5-q5%QXUw8Pf>B8db!9C=sQih_pL)(@!RyDp4*#93@cfN8%*KNWb6 z7)dHvdM5t`$waoqAB zZ3b;$EJg}a^7BJH94k3SMn;+f$=v=l5QcT7W!3n-K!nf=8R_ebr}V<@?JxB;egFRI z{Oq*#-r(ryXj}MWGr`Sy5d&`@pF1I2Mkz!-k7#MTV=~Ku7r=cGHLd{_Q35F=Bco<0 zmmZ_V6n?y%l?NT@X^_xagn(PgvLP=&r3EpdL_hcVj?2gRnJO-6&{4Q!S~w*2Stz&-n#h_)sYGr1qHozb#JRLJrSWh zGGm0C#Rphg)l%^MWLsHT`QgKdrnkqTgdi0mU3GVVJ!w7Tzw4F{hu($uDg5(iK<9-$ z5MYPL$8K(JW@V;~tuMeKL&Muq{3%zd^p7V?1}BqsUyq>SaV8*T;fPUnJXIEtDWQJjtq>WV=eDurIb?S zXqhz1n4Q)&90y*~g^>%ob5m14V+yCCrrvU{0^;Q%71h;i*9Ha#IDkD^>Z5t|XbEyT zz)sdkb4c`%S#@-D082sp3S|eX1P3c?6!c3Fw@?3mJUl!g0VpdEW-4Vtaz`~cHKkQm z@e2x`Ee~Y1w6ttgZFj!DbOlAr#&$u~?CtHD7KSlmaq#n>Kn9_E{5a@T5>T%O(?vVQ zP1@NQK+@OO2PYB>B+dAemYZt{nXM^^qN}qrFfcGTJ6ogNHf8x(%x@9Ex2LBk6u<`v z%nVfX=qN889UVWvI}kRl@vaND00_qITeZ02@onNK>l7fxRAFs1*3P?E?7Meib{Z=yjW3AZL z82Ug+=o}!jKLKO!{u9U-zB=~$ko)E3Xe7ZlS{*ey0G0H{A#*fwb(u?g-+aEo&*&g5_w!YbL&Iv|svavEN zo@UNN@eqU#qn;W0bJ`jntuy~5K5tQNy={9x{dVz54!|z)GN~q=cN^ z7^l)Pdve`z6N3AmJ>7*b*TSv!1>btl$ z9F;Ybah#+e?2L_^~&@#GlMK}^q&B9brl$;4WqSU8=!P^ zI}X?OZ4*&F}Qu(Kt?s<8$g98Vc9kwG3}=7T43$8=$z{EvRH@I1ioe2{4(f zP`q0{Jv8mf<)+lkIsCVyS_;r9HSbTL`_nh$h!cCEc+|%IoB~UX>)zi2wxr@nT0Bz9 z5pve&&-e*)Wk3|pg^KVd%*g@2CSctCb&pzBTDrKX$bBK!i8lr~nDnx;16VZ`4<*y^ zxZvEr-~XJ4dz7KyR1fMF^rdm!Himr9Vm{C|Qn zK(qHdAf-!p-x+uc{^aK7mWtya0cLA| z23qIWX*ly@m1+4`(o3&-9MI(O$k<-nWlif<8^uB5odtDLFWHK5Sxufm4y}d%0V<(G z-N)Pe^l$;%)bpzR{67~osk(Yrn++W8`-|JV#``~~yJr*hJ06gbckCy%h%D_IEj5d= z>s>vyBlM)-%zoa@+OwmAf#I+QP75@7k!_>1L&_88_IkjO^H z31PYraboo*W+^isOw8!8>JEJ)qssE~N431Xysi2L$yBkEyzm_~SsMPX{&)T8CL%bI zL_LUef<(xcCMG61yP7rbMt3f#%>CDJW&9r+YXZTvLNWt=eT@oxKhy7qBvJ`|D6V ztDQC`Nvx_^;1^>tFUY$%LsHDP>@`+kkO#63eOp4eV=aXPmmX=vQzfKUU;<{?7l$`ukeNxKJqxg;e>rUApk|2iiLj5q!}XSnk0HeABa@}pg2B%L%# z?xZu_8&hIqtIvUM`P3Mx`Bz5CmOby_;lVQM=;`&1Uf0d%=HhZ1FSCgffn7=?8+Wo< zj}25Fs=01>wLN;p5YsXtJlEanq1+E<3(Lm;RW1`6HwWnupp1ls1aT+?(hgD}g&ea+ zqVQP;7kQa*muv5UR4db=)*XPZU&NaFDNP_B9;~ovYfXIb5(=Q$3 zq=T!utBcUTfy;872yn~jb<+e;hky zi>URS$+87jj~%D2b;)-zOT!LoyXdMBjwLFZ52_2_HDV`Xr@nBeJGGI|3eE%u8>q@b zEPc>Nv9PchePm*|d%C-SO;3k>{;aRBzw_e;1rCJ60jwE5dIM;#z?EZ>^S=ZQ7Jvlk z7NrCQrKLi^Pg+}l^Y?H2!l(|Eu8tkd`I z+3V9)DvOi6ZT^WOIOH<3rK6J`z#nQjbyjtkCjerGqLbh?0{-`c5=8T@I98#2_!;b z(`~t9dXmJt;Qzz^7xBS}1f2u++|m991qn&poUIDbGwz4Bj>1L7!QS2tZ?E0n_eq@(l{$COX6l2`_GgX2useCloY5(U%q@% zONEYpaj)Xs)uS3Ui@w}o)?4=YNS=&mDyUt0v1_q&FEc$&goV9jMczN$Y>bjaIN@8a z1G?yKt4Lm;5I`;`)OP;AlHX0`%y(&LxkzW4VlI3CQHmT1*wod*(P}N#QJDw2_%?1@=8i!AmG`WvN18O z0~H31+dV!t!FVeR3jycNSC|RF$N3?3&CIeYZWq(6xICjqvNz~a9Xp^rrhXsM88r94 z=W1HvLD&|3Q|0-CiTF_C6^+8+mNu2f5*zC+6t%2g>h>*Ki7z@9fMU)~>gqvHRynCp zvL`qSrP{$z42tQ5)P6h#res3ogQy}@iv0=i#9Ut_3AVa9!y;3>ZsDS8SK$8h$5a_H zq}k*S@?W@!g-wNpg;`ly)%d=E-aa}umIc|*4qy|ou4*s&-RYG;XcwolwX=JW2;H)` zFx(}F)g(XSxwtqHk1bVr+W;v7f#o~1w#FDD{@Fpl^5kT@3)D;!E=#IJAlhju41v&$ z=Cn{NG6rMGExv<@hzRhK*m9F%CM++TB3QYsY-#e;9%bx>8R;Wl@ViE5n6@{WpyB>m zq35&Kh{|`Hwr-w?8((V~dUsNj8noXh?nFGhV@(3|EP{@fRxWn^VmnM%cnJ_kNeR^s zB+n@#s^?@WgwE3+7Qar-O{)$GTJFKxxr0KXo|~x?z4Hl<`bT{$U0XZ*6c(nWu712) z*hQzVtEcB@46qsbIXL(gI6hkG^Ke2G>8c%8zHD`hVp1YLiBrKYbQg@*iP-BT23FN^ zYqsTr2CZcRb@ASZ4X8%7ON zg4)xe$t|CwDP@Oxj5dN(I9BoHOK~I!!{O)md~TtmgA{BBf;!_SLsQY#^Z1>2R7zgtqthZ(ReH=SV1Yty}aoG`>wU`Scs^ zg6BYCfZR}1Qxhe^Pu?{$QVyy^y^#c!+m7KeiKyzGa{J`%Cx`;(X+I^b039NpzS+Q= zE|Og0#(B{AMpc=W6cl_y0US_Ug8JW$=dkU{P8AtPF_Qd{!8^OXxn!iC%4?r8@@n>6`z+)|1fTLrqLoy)pJzg0qg^|BH;y_^&;2zWfa&<`Kb_g3J!gT4rPPZ|k= z3hcGjl`kk-4vvA2j-1p~YI^#tVmV!1T_vTvm31KD7?TG9!3Ce63)_B+Af*5z%5+mP z%gD_=1E2<`i)?dT|AxDF@3xA10dbZf2lgoV5D^obf|>>OE<8LuE-sf6iM-$iRo23Y zlM#qJ&l|9v81LYOh*Rs-w&L4HYUG~0Npa2pmcBmy=tH|S`84}$kC2+^uvjEh07Nq7 ze0%ILJTeDeo!FPOM))QC^oR=0PbAvTVho}1j6v=V$)S!8ZA~v&3ToZ@4_JWC>7}Bw zGN^ewAT%}bLzD}=;K~!LkE$tL>Y_cGy`OToyM*~u7XI6ORcx>G?Jnb^S+up<-Vm*a z97PT+0TjsdN!hO41Sh8uj*A3Y%1oEnhrf(L9#jfy5foK1QBg7hS4F09up@O24@aQx z+_^(aMs@?knVU~VK|w)XU0qvyV`*tbZ4ul|pk9HZy}iHB#ms#3=1p$fS(FCT24qLv zYd3Dh3%DseY-BP5M*!f^1qdtqoqFFYkf)1v>aY9g{GOQs^%FMd(>MAhf?;w#r zRx3(hek|gPHGqRitUX<`0s&2>Mj}pI<*=_94{3k4zS}%L+r9cTIQuGM6yI*=sl^Bo zxS&nl)Aa=2f-?Id0x!2G6IFd|>Ft4Avf?@&dtP($=(zucG_Mvje`9;JXZL~UaX7Hw zGn^4d`dgB#Exhs~uYH56%XdkdxF)mcIH!qY1>87USryhcRc%I!?6F(!+SkThu1UF8 z+xIbm{ZRcwS3<|_#i3LukJ;JT_86YfYB4ZZp}maZ)XvXMG3iUq(W-X+{nL-PC6#{3 zo4tRHWmlm>8yEu@Zn>uqM_#h4?hoNCWBBL*y~UAt`L_23;pM)X(GV;}4HVrALFq1L zDNRkXQST z{*+g3^%Xf+P?@3F@2`%`tgenvQ)$xi^17ZL?c(C%9+3ll*$ zYtLe@{iBbZku`S=rC zkp&%g&{nL2gPmOi$cRHAgo}Wc0Q(RrmaoMlCZ^ns443&xqaq=N?mM|aRlK&;@hrlG z7NVo2#e_xw)hlMR!EC6^Mn*=(tx3hfigXiT{pS|`}*zH#Z&_9a=%kt9yDZ(6m4@%Hrt|lKyuutDz zFLn~^056z75&;qgn4h{L*%rpEYQZiu1(K`nm2wR&FdcXZca#6UXsiTs3!wD>Q^Z(w zPk|O6cn2@Y?;u-@zait;2MG@D$zY-{OXV>QO&S!ux$B*soe2pEqcm67rvF}QH=be; z^q2oH2E6d64Gaxsor$T4qysyZn;UpKK0KVR(Mpy0-v)tBIZO-v>rSVq#)`etz)$f+_$R z_6h$=b2U_z zl^uWoyaj$<#1Zh342+Cmz0DkV*d|a0!5C`M1>YrZ!NbA8@Ud&b&DE70+CdHu2k3?^ zeBk5&<-DN%nQsDcAEjCAIRRQoV^#F_c3Qb=EdIm9x8FZy9n+paMpl~ z%|qG=rlt!w7C1jBMSP^<1yA8j0H1>b0zm5n-dd~1orkY!P^}qMydQ6`T~M^Y{U7)C z_Cm)9xStUpJ#4o_-KyHa)HJi=KfzZ_@Bb5g74`x%;rsXRK!bC5EvwcCvg6&ny0o+e z$ydGF)j>@yN|8>p&@fJwzh}?eJ zIwUe#YJt2V3eeTynfpJkc_n$3Jg8~TR!>*=f))LT9R}OyqZg@A0HKR7tE@D`!tFuf zJ^-I=DfoY0{kZ(%#fyQ4ZgA5DPzY%`pmnHUz5D~(7D6TsaU_H*pelayAk2n_2C)DB z0&Aq6SlhyOPEO9q@nw$p=;-L5LPM2Q6vxKpqakO^*&c#o6%XzwxT*^$mk_W~0K}9^ zTiV-!RWQ!46i!GtiycLj_3G8UBqMp}=hyQ2(Tm{#x7}qWdHJVE2(|<{FqHVCsKE>6 zy0bVRxiMZ|2)?Sj^vd5N%}h-}-htGXPNMlYghB-u#P0d_pwhy^?aj^m2=btPP{KVA=fVM>@9ym>TZTqO z@#+HQP^qG*xC)nFJPW;2EZAbyWH|? zACPW-L;J;Z1K$KR`omv9q;QOxSh`4f{E<7VLExkw7#tJ?1l0Ovc=#oPn8Oqw7qnC& z5|Y}jR(j-xwQHhcchYSmKicFbZU_?bh>>w_`w*kPsDyPa3LLI7ar~->J1x*zhb5$^ z)4qA~Yh$C!GvGfUAXGY-O-4s6V2`M+r%OZiVqy7X<#ilg;2mqJ=+TDlW;tS-&2!_1 zFIbV)jsp>PBxhK7srAPXUQtn?{lA7sKV>*fZsrS%h(L5O;M@ccDGKE= zszw5w0BqIFAYm0{Wx9>Eww9LZKh98JkpLyE#>;eGz50IUt1W^;0ms+Be!ssei4*ws z{(*svNe&_k3Rz@kTQ`tc1Ox=FrrFzZ@BLF;FksO^>uv1@46NlmeGMBs2uwDJ-?ruS zD!Eh_hSd2;m?!uc5HQk4724tmtRgeUF@_s< z6Z?T(J1aHS$Abh5HzhT-qP!gHzP^D$F~M^wsqD;5UBV}@n>uFxKxT%|fx93sH0V53 zR7i&nQ$}Dng}^EByTLzy~1|R+Q-;aoh$cRB-6$~-#*aHlP5rbBx zR~C*`I5$BbOqvdxhdeuNTmC>SP|4ygv3e8F(@YyTUJxqk}0QXQBG*(Dc4o<3x$?opp*o?b3uU;@4AZGQY1&{6h5IQuV)wUyKN)K*$1NGpoXB;0x?&!1MedNySP&NQ5@WV))w|orr^j z18A?H>Vm-=jO7=;o`XL#5ZReWZQThX9Pd%h0|QDfL0>ufD%|!hU%k5Twx19MPaC3D zv&{Mj*kd}PIKZ^K>$Xwt1eOG+Nf#r?4Xv&7{TVO7mT;SZp?f67wTduHPmh_6ZLHkR z2>8`p%}PKFT;{{C3=OI8_`#9@zw8Wdb6{v8(PG|XeUE}23-uO~??`)>zC(G@c#>Ogr|F#NEZ+b!?{XY{Gb@-YjoIuOOG*~4Ki|pZ1JrDg} zPIk7UwEBw|Nhcr?A`u~`P4kQvcl;Y#W1tMdXY@Uw)qJq#Ij$|npP!^H{~AjvD6swW zy8%)>*-GxnO!-SPqIyUO7aai9_mdNMfHUSmjl*I>5{15oE-cgW(c{M|r*wDxGPAP6 zX0ibSN%xB6x+yC5!{gw)Pz=6a**QOx2X+a1a2FCxY;AfGaD(kyJSD|y8XZ+T900vL zM{oNJ=RFdV!a|!4-(*U5(|+2$d=d+047|H{i}hRX4E!*Yy^nLjNjRo zyEVzFt4Bvh9yXF#0TG>1U8CrtIc&74l);pWcQF8E8>xQmKPGa~FFXnF^%59ev*C^b zQk#pN9n3kU<@rd&Jq}aFrVn>O90$I8t}T4OXh^oeAby!IDDLXtf~qDgaKwG}>Q#_3 z(rePwIWi0F*BsWz%YkWgT+PXny;!!3*_YzQ3urGBn>kv?+zt(#OuV4Qt5-Mx!*OuB zbEn>JnEpN7=r3lBq);U67-$f7A%q-0VY*WL=&)C9wE(a4{Yh6X?O?U2m{^{6tsnv+ zJay#~%z<3nPTIT*GY4d4d4!Nb;!GnfE@Zs_QS*M$wJ^e5W?L5(qhS1SLJOf!M|C&W z&;_dBJ8d6~U7?rJRJNcs(bV3%D#i*kJQ}ac<2-t%VuV8&cFR&*Kz4&G>b^*l;R_(Tj`gVF-UWDZV1N?MQndP(Ld0W zR5)mR8d@Xs%#m|drH!SYu2bX7qU9df0d)s)%B1rzbb%EK6}Cr}FT<-pvuniXR@uX0 zCvcW~sIPKuMC>^^Xt9Q)S_6F@MXx`j&I?4*AFWwyYJ3=-P4o%A{t>C>B#>f!9I~aS z^Se%=B%hbRgl<)BH)RF8R;xnmu44{0T?p#xBPTn-Gp!!lT=ZIH50*gGPwx~1-*{rq){n~BZ#3M7F(IB@C4jTab|!9YwTX42D}E4kLhYbbMD zMMKEFKG-O=9>ey{=Hv&)FM=YZgw-!eLKTl{w@2Tz%ZVrRv~i7g#m*OPf{!SI&nnwm z``9zDWhVQKlhx?3u`%Wb=Zi+XkOtI`5emy-rJ>y@b|0cf-B~szN){gieypKyt1pdv ztb8$D496!2A0Es2-+qp-E3pA1pTfQ_r8lM$0F8Dt^t5 zgFl!3hgNbYOxcp3o>d5a)Fd-c6_P|^Z5yJ0V%@5l#iRL4sg|| zdzghw_=ZLmM(T?55eNwr@6mr5ETVn0=Y?4FYd?@1h2AC$5vaXRfH^?>48-9uiXUM2w#eEUg-ijo@KAr_MEvIfbUoV-#eL ze)#GSmqe@Hetp-1E%}WwRc;MY6Ul0>dH#8mz4uE67tRl;=C3A^#@(g^#>S?)#+@st z``~N5nekqK6R#M&1iI48>kn@68&H2`g|CYLQu@u+m z#V8cSla&Z_QMR|U>h(qla*GZ0ET4KPRLm_V@V4Aag5Ac4Nr`#2w2&w= zM(-fKpKWPH3YmDr-QxQA`_{?!>gzZmxp7>qwnYySE}HKOM0;qd5rvnQuQ`D;5R4XP zF2Hk`T3O`{5`7V76Js~Qm0UV-sAx-L^QyLNYka%D^@!6yZg=fdrMcc^NxTqrd`DXReLT=<`QH1gQoBqlVW-MIPWv(5pFfr1%6=+g`)H zWjR%R-c&E4YWY|aq2S@1euev)MqqwOeyFC=C)!BvF}oZFMQmvW4H;zWmGSRXKIAJ=oPq|Bq6JTG*0S_Ee(8J7KKRW z6+xDd$wj@%@pfjEn6-SZYZhzFUa1k<%3d=%9Ex~h#%u#!wx0=c@9~YX+%eHSvCxfJ z-W>M%%uxP>mhk31@3&-Wn=-k-2FbjU&yluoBkMBMYqh1MkjLw`fKaX z+WyGlLnh;VXnn_2!Q>X8XWl=rI>7KB)r~;~kG9(5V5z5L!hDl$eUa4IDX1}gB1wQ$ z@~)RyF#cq<)aMV#Mc49OSl^KPWsYlVu~fYFi@~+EwUw2XG6e!Mb4~T=UV`^?G9O;k zTVHEATv@L@ioSQZss3R~Slver6O)wkAvBTgFH@(<9zI&3O&rN{pRf5S`fBCWhFBW6 z;1Pzg1n5FuAr{VA3rA%)y3)T#oCPLrjUHtN6WPdT99LkE`1(psXqqKieJ1DCwqdQa zZD;-+T=w-PC4QtECbMHf7FMP5J<<-h#(MX~@1u((iS9KAg4$X%>D+dz&NM@M^-Vs? z^H4{oF-W4e8J-E$PuWN*tE$@^DQqm^tu7SL}FIGRkD?jU&tXet0k2UKWje~zJDi&Z zFJ_^!wOLrpHGh{_ZBt5vls6ceb!8zul6%Bymh$vVGGTA`Uf!Woc6jfp?I-%?`Zwrw zEscp1ki_dwZDR%$-837C_MLlC1U*;q(@tl6ctFXE_eQnjRr0dwp!6$HO`IME_ zMYOvCwwMEp_B$XkVw3UqpEz9@6e~V=&a#eAQPMCZ)-RG-WiZw>$X& zuY+*G+kOiz=qVD31S>Z{+TFj8{bB~bqO!6pio*^35F_BwV45(z z{yO&?fPiQ&D?n?5tv(q*wN73%I$vr`gLPtBS5RW1OylV+SoXH7Dt7~PkzTwA9zuiSp&de^W@3v ze_mG*)j26NI-a9m3ZrQYi;D-q>|v2`X8Z45Mq2|n6Oe_q@JBB2gy01I=QQ@3FN5yj z{>L{j5HPBNd3n^~`0{H`P(gv2yZ`TRUI+o2rA7>LaCgHlEj<&HC5(UoB?4x2ATi+5 znV6VhzCd=|Z2M9L+240QfCvtC2#=7^36y8hPXX*49Ud;Z8N>2o3k1Sc6h6ABuy7p! zCOka6YnOlM4L?9jF95o7clY8U0U?RGc{>*v94Z&7-E`PJAi2XSFTX*Pof6WlIX`nl z9D(5$mem+$DD`x7rhx^Toqd1z7Pu~11=d~hi9iO5N5%evXf?H65S>%FoezR5V)0Ua($| zJD8>w_67`sSHmuS^Q1dB5MGi2vk__78QkE6F*Y`~wJiY2A*T%-Y9j$K+&G{%5ARDb zr~|D8Q!lth9~^)&ybjAi%Z=v#;PS1_&F#*u%>^P6MktEuz2>~>KWa?=_+b+JR6#=v zK*jQHiX!@*oja2qGgjEy+z#@T_)BgKNF+Gln(<>RT1WM1v+2*zT0>a8imV@TypPj@ zse&o(Tl}Bh^Pg^Q(uu+QLYkV)7T>z!^CrSnKDZ$}J7seIT)6Vx_Ojuf3}8ip;a6Zm z02s!7sb6&W$rZ%u_^JD6MrsRQagYo0=mjT{k+B3bdQs@KGv}Js`AAP3miQ$q&njeMd5dAp9#l(Hp*zt0mbqwK>|m}{ z+B3W>OP8{KAfl!=k{g`M{7L52qLfQwZbbZSB8aGr_kEz~dgiLAP()h*J@ZOAlp?Ng3(G`Jy z^Ja5%^TFBihWd&(JURq7w==v^#54dV#d2Z32z>btWBzwxB2%aC{hm)z+8i@)d_opB zvQQ~Y8SIr!pSe;?g{6R&4VpPip>c!5bU zmUQ;K&}qs>I(FsC_xL9-by_Byaga!ZvS2!<{>*_)QL~jyGE=hB;+$%S9aHt<(i{t~ zxr)-_w^_!bxZh|Cp6WNp3BSBl|NQ32!hTaeix1A7o2k7E$K~=C34)-;>0G0!ewc>fX8oxd)UX3`=G*fk@2Xg5G)UD{5M|oLQsfU>-v#;*I?LRxo ziYv?soa^(y(>UWErxCP3&vLY~wpI;XKabr!QdAW8v@UJ`@K?=om9-U7BcntD05!JS&6 z4rvusftL<%EB^K^n5hc-Kv16?*G8|Q*^1d54L-k*1LpQ65U)^vej)cb&L*xuC<**KimajYb_+cA-~xJpKs5VL zKsf|roDGfY;ls7z{236`W=ECK6TjE{VhaceJk*9cDxlJNI5Q%~Ux*UF`|)~VyMJ98 zz%Ca{liv)8U)hdGuESD^|GlN|*1ZQr1G zU(miU`FilQRzJf*iF)CutxJ|!=h3McTFXBTyX+ovKY?z4?07njqLJUy&GmC0VG5Ff zS}crT;EDW0lMwHg(l*vh_X|t(=fbRbE>9LG&XP1_ply}~*qr>3Mr%%IJlpd;NIAJ` zyGD0S{ugdi@5IT7yd!Jz9n||g+<&(f~cI&OUloXXO3bbl4mx0$A z!UyUgWWiGTq-S8>NBa(MVNyg-{OSvDH$wXc!{z zZ?5*Pj&N9vvV%!Nt5oe-L&=p`(XgveXKVk+@69UJ$ppGSxTzZZkfbJ4$W@}d)Af$S zW3%5|**0yiISNmH&V;*vt9(eUI{d>><6~!BRpxFN``i2PV`F|7^A)CLBM4`>O7R(v zshkFnuRi@&;7{jtwsrr05hF{M0Ee#)%hB{~Sb3q)t7kL>49Bz6$)yxm-z&TCy?g!? ze@Cu+^bh>%Q7sMC!&R{q?90L{SfaF*vbWyeM}g4-A_j&GY*q$yKqH_l4*R1u`=+Y# z`P=){6z9gnL0K>P!-5Ka-&`B-?B2}t6tCzXZK&8;jO*KPBRi|i9-_NecKPi0?aI8n z)TMSKG=+)2r)A5A62wn&7|0ijxA_D-U0q)jt1|Y7Y}WgOhIQCwE!kr#u=N{WhCuU`kJ8GJ?g@IJb$_~hzC zfmbF52BPc#4{>h-jb+>J4_}I+R75H=XO^iDGG?X>nF}RlrjX2}XrP45nLTSu0?tNa<)EF zZXhBj)!oa>GE!3CMn`SVpMMi4dQ=hHK$#P?^UL32Et?9E?}ej&ps|_W(PjNhZ)R_C zDBBGPoM8agrAVoxFMDEZkx!i7C4KVcxP66}Wi{=@_7I1zxk)+7%!ECrty?AH539!W zQ{>c2KmLB&Nx~tr>`B^urxf>q6L-M;v7SUeQTQrABJtCuOoh_)eurzT zR9`|Wmr}@sw|7WxnWsvg5F`D%WvZ+m5~UW0ts-wGe=%E^I$_@ESVjB(xfSC$V_1>D zN1$U^>&j#bOX{yX7E>c0gh>5>@P|vS_|Ag^tENY`6STDp*Gn#)Im>*+B_@N%;2S?H z)=y}H1M$4|bFW@mYCNIf*I1nHc=qfGbMt}DPL3{yS-p&eJ9oB6sPCUOn1ON(g#6K& zS@5>E!@{$g6?ep^GwS5tAzkaL@kSFdMABo=4Nf*TSd69|XS!E^h9Im{JM=P>!6&JgKScCQ# z-f`c#F}*FpGf)}8I(i(df^yroOBXLn`Th|JZP*Y9!%?2elLyNKj|LWUYIZv8T5_*7ZQb$y!MLQQ(d2?m1MRf~lR6yJ>NYN$Sl(0{@v)7} zm`!JNhCEZ(d^{M(HS#MypnoIr)_X0PE|0}UvEzMDmqbQn(Jmz}t#DPk{5$aviT)OEI`o9BbB@p|jg zcXzOF=p3G`{WciSA6@NrQs%c=rb2As<@Cev8eggC7xlR?7&nD`y6+%Ll530A>u#$a zVwOEC+h;Z1Oq@PzT_*eI0KtZLXU*Wz2}sm0uXhdhB?=|HJ?=r6LdM3!qxLY5(fOU) zIxnOLjpz?DwVs|L1?+(v7q;+SqD~49R#8-}L-xkQ<4Jv^MsQATxT3Jcx~JLYsA6=^ zy>VZ8&PRSnK}C~qxH9J^fx3;*H8ac6zMiR304nujYX6^1u_m>iOq<{PT}~t2ORv9h zIh$jgCs^qs9QT(m@1Ulho0~fYYbO}z>Z+~37g$sxlcf4&eS#dDz@Y;_rLCY|AD^fn!SC$p@z-5U3)f%8EBCoHx*~6 z*BCuR?^#(uZ@~BbjR4m*j$7S7$h_Zp5YO|njUU#xN0=q1mCF#kvsDpd?v8?lLiev9 ziVPQb?;xoA&z*RJlMuU&W(^6jz$#^vrz0nA^r%&#TE=dtvb2LI`scMEf#Ba-@ufYX zDJ+}^{e~iW=I$i~X}r;7{${~Rf5>p_OAd#l3cyA^B<8`CqI3sZ0zvXxz{dh_ zAd;XzWQrSwz(w>mHV_KHN|AFfc8)dKd}o66Gq`h9({$sscdg|)RVP_j?0@MzSsbr$ zn9ESbC1B8(Pqo>%q=)kB8zF+`NW`qrCJMt_H(nCBEl<3M#xF2mx*tXYaMD`P_cnJiUQX&ANXyJ5`fRlzmfRYh~oS zfNif6y28j5mcFFPz3q57VgLPb+@n!mnRv5p9g_BueIAScv`$C zRo6*ROH-pe#9&-p!$ZtK$~F-Ii^lghPzBM*u6yqpFE}+-{5u`Q`cKa)h(&W5m4&d^ z0;3ZU71h&^jE%K9ckbKdWL|1C3UeW`dde+Z^!s1FeR~1QENBn_)UA!BhkM_8|9xR$ zTe5j%JMIk1zkz{)#DoO;&G+7~EHme-9L&_RtvBDM=2bG#GAzj#-Lt@`_^E-6=sS`8 z%tFIr%s@AjaC*8`#W?F=ma;yF<0L_F$_o>3B{FVO=({X%P<~zPQdknG^N|?!vT^3C z+r8(`zK8ZS6}-|0vr+|x#i3kW=I6u>4$^Hj?)62&P1<_IPI`J|2-YFbB0e#(v7x~a zIv(G84_W8fbNo`meg(84@iK&hZ-d+QNZ&|vRN`_HLX~~e z@ulr|#G<;$2)cdM#B=rVS5e*pOo}udUn@8{BBd2heJM^~NzK0}yz@`*wiDtvPD%H5 zHw+eJbfhqUdojYeHQ{EKft;D88(DS+xK*3>0x8XxkzH;*Lkg!ooCr!aMa3WflH!M6H$Bx%;pUh_`9-^0h zJGyP$E)zfj2{Fydfm}w&)D@BzoM*_0BKAnT^M*G9dgP@13IrDiJ}_Z?aYWqsVFSF; z%8DaiprpLKr@Q;EqVuO3S;S^>X~jHZ%-|sj@F13t+9Z+ahb%4lMpbombQGhevbLnO z^USi}MD>k)BgiA&A;y8lYakI?_R2~dIx^?MDpO0#0D#xf!dg>F<*ROIjih%JmdXpW zE<1AMnMGxBOMAP{qHoFM+D0c%#>M-$OW02|(sAew#XGp3%*NVi>#&Y=@v&lGLswn0D15FQ)h&W+_piQiI@m(6z@Uh?C_Hn>*iQMq&+{^QA zN=o~!Y<80c#??FBsTwN$a_pA#bk|oQi>kx0p&@-Q#%H}e$Lclfp6?w^qmCJEzxD{z zhra0amVfdFeeK@xnHK$^8;1S5u7UHLw3 zLsYN7>e$B+-aXt1$Ky_H8!UC$9o3BVQ(x>PP!~2e$}}zW?bvtt!f+Gq%+&p&A~A_X zEIbpa$>A(RhfhIH9>yxahWsL=Z$W794C5aHII&(~8ecTHJEKVd;|xqp5YYPKsixjE z1Pu=s=*X+v)m5pBFkdbq!{vaK;nb(vTHs+pK|zpaLw-DnkYpsxkWzwr9T)JC7V+d= zc8R=u_vbW1Q6T50-c*luT~}B4_H7~Z;t-S;i|$u_zqIRc6IT06Yq4fKanude)YRU6 z77#oD13KdQGc`NA85aGPmhZT>o*vbwY+`kJk%jjM!6E$){9V3M4;QlBf?_;q=t9zE zxqjCcu`tM0>}#`C;4O1=K2_mk+^bv%j!Msx zFZo+?yv>A(xG>fOBNx7hpQ0}X~Kf36=h!li%oei+^CjKf}rDkvx*V`;&UtdntadF8)W{z^~B+nU4+Rw4Xooc?I!A zTX;&ylqEN`Iz4)9Bii_(f@%Eqr;o4I;=W6LIpeq3{CKSCLB{aJ20A~pV?K0h&za5* z<)pq=FKA3Z(tFOGCuQ0EYlD%{cY8&vV@#ZmgWNNB^nsDY&1_Z^d+_Gl%WARi&Ahtr z`rbB=F7;J@Of<0&)~vagBGUK1t=-u~d-3W_%#!PQKc?{2lNP?tXTL>Iu*Od?<Yg)NBmE8=E_r!q@P4qc!vYDj=^-ssEDv7R z+2AjoOwV$@Q$2}0*+^3)rHQKl>x^`$fXa~?$6%9IzFdY&7pa19+d`jK*@$mQ8~#2d zd);-^mu+OLv{ug3OJOw>dYj7cDBgJaT6kSQ*WT&z>Gz>j7cViTUv1GV(!3%>Hm!G- z%b3mQUcvTinR+*r}f``K5= zmL|PxyfZ4K$pk_^V2_)nl|E6=d4mi?ErS}~L=e81XW;bIj*tD>Af26Up5x)^F|T~p zCUyh#rZb4;@K`dQZf%r3a8^|QgVhv$!^J<;BSW&XH604^lzs=_e&@ROfG6Uz$&Rfm z_w$$PcOQst?Jg}FtL_b*%!tGW&pI&igh@+{qE@sh)_G3;pSQQ_aH+VgKOXGp-xEM5 zoIjIfXY+VQZ_14awO3nfEB4lpCr(ybgx{O*G%w(x3~C?!ZJ?E@Uz+(aoF$dgFFkuc zC&MMlmrvr@UQds0kFHGYSELDI8D$`HBrG7|Bco|DzX!zP2Y@u*1)}fkz{3MU%tz#!PC7W-wPnFh4<30H7?Q>Pn ziubvZwQ4+k3K7ZX>YTI|`SUr}pQW=GPcgAyqfw$Na{O<0YPq zuC5asWsl;!-m(QP@=oY^cq}Bk)bO3yvvViM;yzm1D~r6OH(a9nwELDf{BXegNUjLy z0qOXhbhSSW3WNXB0)$U}EH6N;o@%;Xh70L!84uz8Zy^w@=x=DF#=|4LyiEfGBp(Xn z_%70`Zld!|rs69?L?WE5_@;4CbQ9g(-Jnq&a*Y4JhBoOn5Fr9%&IGEa&R_^6kP#Rs z<@WHQcQ7tNS{*rn2+C+p^CD{vPtT|BXMmu>{fC6uL+=Dgmu4GxT=)YE!N1~XVR`wK z6*O>v#yU8wOu|W*@KT*G{ruNxV+%Ye5!4aM@&SX*&4~3=FRmv2j&DwuLGP*Z;VlUc|#^SO0#5jkvn^iqKW!%-`@F5&-dm-G6^|{=;&&?&<640mxUR zQMR+oh7IW7KZMWyn2L^@P(VcDLzy7bD=AVG^l+X#fG9rJTs8dmcl)xB$o2L2--oj+ zD(Zxu9+;C?UoLEVWHUA$(l|sGn4Fx9AGM%iye(nfM1!sz80_=s3UEjr`%U`vpEH!? z%uG$afa;Z$9739$B`WA0JAe`(@rG=YRZ0DXw2TY_B|!)rKfWDtK!-1W1qL+G-+yR8 z7@y(lZT&^w&;~?YXd@0dE6c{#b_^uuBZI29;cw-Gb$PWlGyn#<+S!eRr098UdKRgt z+_5y>LBHPvckj|vU8PA2;0|I#&KfKl8Z<9aRUzzIe1MbmUdqCY zr1VG(3$<(S~AQ*P&&hN^JhFO<#?jRv919{+_*iwuhmFaklA*5 zVbh{vaEd*hFC_751OfULI~Tz7r4BV#pq9pee`2ol`!9*N0Lifm;kNIqzdKlol&=WC69D={e;06KE4*m$0uC#tpQvDq4JGA_&X)7M0eQy&se zURphQxQxX!c8)7C{9#rW#NdxDs?9j76)CITL9-9Qwh$4Kh7$(Ao@w()I_?Ma!Si9b z>Z;yXX}rgg%o4u$Ah(>HMHe$J>0FVw5GxlY2LfhM(4HW@Oc*y(oRL4@+H##1i*zcv zMU9D(@q?p8%_bW5jGZnnE)t1tr$r78(BdWvXO524yEr5PqyB_$=}Kf`6_C~HJaZOC3PJiCq(+{CQa~kcrwt%0dGOy zP6nKz6(QwVlj|snw-SgIl=1j6Hb_pu3JF8;(T6!8Tp=Ur3`M~9vHOQ3Rv^sjbr9P^ z095`^c*ed@Y_42kP3`K+4ocGd@h?u>C|#veq`?+t?Mg+UnCL9U4uDi%Lf6oct75&t zCkpP0+bh14ec~D?ks6?{&k>(v1n#I=C}MnT&FWUt$-?GV&9Y4s@9irW02IX4!RrVM zKvn`#-dneZCMUEeN>1ZpM$3%M1|%9=Z%MpQTItquDZ+Fx0?i;EYIqbZJ+?@||73x% zxFL@#ZKUn*Nu;&CQEhWA{tCE`yi{yQEl74-KgIhnu_7;Nc*4+CW%In6@ZPeLZGy`ILh~-F7KZY z;-uH{4q6;zQ_JcCxbo@_v%rbtX}Zu$>|$Z5K`^Cs(pocefY1^RNB>SvKw@`9`K_{& zlKtG=P!_nMAD7KDc6H%hBy-tCI;3@VL|B=Jf%cJJYL=SrrcxT>8miXUmXTXX;4>^i z9>eEcCv;fCHxuNFaL4vOf1ZlGWPnJpfumJO?XVq4#4rmZLqlW%UWSY%UG=sY-0>hC zQNwQ`K>y%CfCgds1zdFidJ3v$ZdFt)!a(^TJ-xWN7_ez2bRak#@SNengHH{aD`K*{ zLK|RK!4#f>tpj}cm1vd{)6^~1kEyHwfiD-Q&7lwM8LB9lfOEgDsxOv5MxWX>j_9I@ zy{Rf!^^vg*uWhEyHqrvVcWo&BYCOg&Y_)w5hyZ-Xbkaj(tNUVE?e7h{%l*HuWraqfv>8efktKe&2Jpj z#?+VQcL|@u4y&t6^3P8hf&|7DLdH8(5MlZGQ_tOvC_2r7UcdtmUI8BBL^(g{=$s#3 z2yudQ3yy3^3UFaH({u?E>4542!(a%X0^kTvc<8Wsof3kZsuIzvA|e;?+^vSMh)r!H z9pzbGn0tcUCpA(S}b=)v`W$aXEy=(B|Tw zsTiS{px~&;NDfX;#8mT@m*G{R0H~;lXQPbvdFlB9A_-239<*mSUl)2W5=>!KT(*_*tE4>x|vG0JXPTc-W$KkBBr ziO)~}+4nc`td{1}wpP0)=p4_VUO@+*%zzBtDr6XAmQhK`FzXz0vcg$pE2oo;SmW~t z;VA^+`s~7&7a(mxxOXFV4Blv7Iv#%h2{;t7gH?O}dXSiS66NppdiLD&?a9Zoy0GWo zn|=pf!J+7E9v&V^adA@<6I(kwG?b(`pVe@_YAL@DOr$-6vHGd+obQ_?1)k}Qi50Q) z0}5(y#}|WYf^yab?DM5!nU`M#{is;Z&5h5y9kF+DewR(kR(6bQF5kpb^doW#>7x(=2H8U7BZ>w%3pbtP*2lH(86|AsD zWY<)j$`?bdR1P!=27`OV;iv0?_CX$p`5i{_oD{NWE_XD2HsXoWFW7xAAfqGnh~U1# zpYf55dY(&PCjHo_b7X@Q1aAqoHQ5*(b7kQ>`1BD#{~GnXW+&n_g-b-mQbtC;i@n@L z*` zz!I)zgo!EJpg{INWoSr2-~d8pbz276Yh0KHm6{rON~S_p;}F#qg}X=*N=$UHvy%d5 z2#Q_9@OL_Qu@t0ndUh_T7nSUP2fb3$Ij>SH=`l5&mX2E`H2TSAHo9_MXOWWm$eWL` z3(=wu^7ji+yYMRTkJyVMH&2GjOiGjD?6DvP9m(Q-4`bFI<7Z2ypp2c zp%uDvWaKbGqo93Z9~r^zeTYuBFZ+7AP4e20(@U(iySZ0o7G8F=Caza{{k-~J9ypZZ zj+2!pZAp{oH>pPM#GN7@*||*A{Dce(m1T3CQYWenbV(#i7Of4QI!)pG@$q|UX*)1+ z2Q?V5{&+#)i=VG-+>AB;1)vo0QC!r>Gd%^C0WgZQe@nMZvG&1Y-!@#mZVR$ov353Kuy_SbX6R1;V3V z;&LhL2+k`sc?>#pC;5{z^&!YSE7F|Oi|XBH_xTZ%wO@I$b9~Otp3fz_gmGp#X1h2`Yvyi^F8ji ziu6cz^*@__JUZssmT^~4L%2Aa9t7;6VtAf9;uwa zXQKL~g|eLYKVku@keDTMriqCZuSb2yVs3FB`BJhT<71O!urT5@+3yg&!FvCDr29|E<4z1{E7teyW|E}-stKTH2^^4%Tj>Yui^?3y8a-e-HGHS)lL z1HN*W(#`4m*=W6Ry|Ggffh0Ahw^wtiC(^qY7CdHVv42?lOo|imU2{_^xz>ScOHoaa zDECQ7OeC2ph`X>Cbas-W=}b&K5ith>6x}8=RwBz$<=a7>$H>HVRC3@M|1n;ARb^$z zk7dUe2hN>7P0CkC57_bX<1!vC9d-4)`50zJNx&S!yZ4wCT0<}jk#+D>4`c6}85fwJ zx@+;vvkEhSb}&h3>(BH#6#Vi$;#yLgmCkLP@^{I1>umI2=hfkTs_$8Q&(x>-aIm0g zm!y!Fl1?^X-0%_o1GHNbawx1KO4Hm~77kfLbNLT>ADR5EyRCIQ!EZJZJzjWdJbJOO za-%|Z!uiA^$uc5P!Z|DB8s}%Sz}QU37Xy8LTZm5M^JJ%?+$SlE!Pi$+SIaN|IEYz; zQ@N@7*^y+Vj8WK45cq$GN%GD6_Y2KYHtB_(z3g68$gQr(&)-hKoyRZfsx$0i_!Z$1 z01fW>^ki>9JZV>#+ou{oXog^=kMe&M`hzLy_-~B2<9i6C4=COu1m+C8cl&sG!9VSS z%jtbPvVFCmy&4IFICA^?+TR$?jDTY?)Aj7G{60IVfC6C2?s=mcXK19+V#s}qmEM~@ z^6cxEy?nTb?q9G+1+ili}bJ(>?sPTcIzCzW}bDe3yrX=$Vh zUgt(=xUTa6(p{nv*}wlK$_=Pm+@%MgAqOBZWkven@cR?Gy1Hz9C_TxDnOjwnYPY*n zs;{7En{NypO|Kp4Hx(VJp!xu7;D0BiRqo7*4ZF>4$)W%Gunbf@luPAZVz!zcYt0Ax^Y? zAhN|;jEtn9YNoWxzN(a|54lKJXXkcSIT9^6-q8K@sJFP|2N4{KRmMwI2vAeW?G>}r z%`Ox6EqgaXwX?^I@BV&gf0bpki}x z1a3ji+LFUKy{4iu85;&&NK0dmg$Po&xVcA=$AtcLzuS9Is<4N4oPJ`G zl+^Cr%4Vsf!txlZ%POeJQ9(#a>8y`o*k7{Pxz~6ecI^|dNaU<0H6&@fHP9FgL<$3f zLJT2PoY7`VDb06!nFI1Gip{lY$hId(@_2$Ju_-?L-L$noQ+}%;&{zLxly6 z#5mADguF#YqWPoSw+}dlW>(j@yL4#7tvh#w4jdSGa`t*e1TBG?XA+W;TwDOJ z9)r*t7+@viD&z<8sXvSBb3;aQT?ax`jVXrOmo2YPffb8a_e~s=9h>829ORFm@ z)?eK*!w&j;B#HpoLt4Eyw;M(ybk2rvc#fh4(I-6GaRjkNi7XJlAG8X{<&r&eWPgEo zmOcp#MTLrUFGetXkokqx6Ld?^j12VlHlHs>g@o58iMX+^mX%4M3&#lq$OCu?rpMv$ zR?ugmG=Z)}Dq0gQg_EuAU7zk@=R0$QV^Apx{D^9Dt?0xctJJpk$V04cg6@jkET+gxu(E&w|7fXE(Ar4H<%w#3&ox^GI}-CoGjrQ&e-APX1$=w z3O^93j`4FQee4wN+3D*BoHM&LiO-JqdA`vbmJG~UnR=$a(WizLdN1vfSsbgrb|Z!tRT`rCmCo+9N;{>fcfwr73JZ`)n=I^J4V0 zw#*RAC#ks?(tGLYho`2JKdGx8`*v+{?DL^PW@)dV zMtkCz>H=Z{E2u>JzWhnitqV*FJ);;X-80{%Baa~|vgXr&egP?ueP*Jq-HHG}1mr?W z_#5c-k59FqAdOF2CDnazTc~C`>TW7s8Rx9Kx9R*L6NWz}7Z&$_xI{H5ze$?uv!Uhu zW1K2#*h5(T|FAEjme-%M!rHkGt+(G&2}V5v1jX7RQH5B!kFw}USJ6BE%PPRo{4&R8 zA4vB&^t;P$0h))Xv1L_QcAFQAj7KXZK42(UFh(6CbU++FF8k+GW(F^g$!oc7CIa)T z&RmpB`Sk8!5L=}rxY?%GR?>(byc1_dut7d#OC*NE7)AxCP_g9O+dxEt(hltTzOL9O zRVcZ0&i(W|dZ|*l9WZoBwiH&fV(cHZ!1#g>wY)A{Q0f*D_4XJ#1+rcjg2e(@c3C2TRco+j1HW9sQ;6c zcXa+IY0BAykDz=4!0N`sVK|y*1uF{R9uM573`TTvu4u1CKCysKJaMD4QILGq` z2r2?Rf4k!Pz{SKpTli#p@n2eiUh-9F{|OPm6KjvbH{z8xS`@4|+D(!Zd#3Z(kSX>K z{ojNg-@6{2ex4ZhT&1J*a^^o> zJg8__{zvHC!Oy`59#IPB9cO10b*#|IGVT34WxeMp37q&i*%!g^;DgVV|FawyzsxVy z@s&~^e|c4%Iy~`AU(e^$+uJ5}SIJN1eYw7?Q2!0vc}u7fPSyDK;$k7t075d5!?6Yk z!RxQ~xeS~K7IESm{&dsKTEQ=G^v?Li`}QCMP|T zn;X^iYSk^s_>W@pq>tE^fVOLYH4FQ%{Qkd^ef(?J`Croo|9u1dA71LFw8F*pOAI5+ zM`cD$Z~m7(%`11c$JF!P?hmI3VxxK7D384BJYCacPsR(CJE+seevEwps1_qX(8$ybmc%sgYkhY{W~DCYGweU-eE5;?yA}ax!VM#*Y^^Gq zmUkUBU$uzU5#B64+iP4QUyY&Vp!kG^3$Bcdkr1&Uvc2FQQuFA}F9lZ6I!bS|wAd7} zCuGltbmj$BrMCf}!vz7%HG1dF(RHwrr_js)npJQJqDxG=0B$h{GG$EU7J_8epAKYglw`qUFG zm$e3Z5{%J=DLHz2hjG)VOQYJ3iyNcM9_;wPB0`J`j=g&Jd#wxO?okKbxp8A`mYcMH zO^C5A+V*o&?xmpLqRmS6@Q_G)U6DeZ+|C%Cpq~dse5k7es2@P@+>!ReH$X&`ASgp4 z=qiH9s8k3ds`~lh<5=gzrq3gP+4rW_3L~Bo*iR4}C`FDFDp_5~ydWolqDhE|jENgS z-vaV0FYf?>sCSsVE+OO%leF%$1D!3s*qg=rTE^A>HqG!6*ZV^k40F5Bt*=swDptj@ zW$M^p9*~+H%KgrK?6HzxP#bkvtya|s2LY}CZ^Rfr>>4*U9axhl9oH6*$(q$%BxWgcs8{(=uQOQpkF*zQu@4M%R}$_JjX|lkxo8`x5peOCq%kW_abZwaFU*GW9 zoUfwgzr4P8{LUyY^sl~q*ZTg|*!U-le_4HX?dOc+QwEXG0UL>pP;9QY0`7rr;3Ij< zp`U>~OI7+ zd|r-;?18TLk4-7<(-V6;K7QDBwGJRbq!8%Xni`A!JIRR9276mu-G@1Fji;wyUFm=K z4)=x25b%QFd$-*-&tfs(x;;@cJdD%aAF0Mjct@=q!N+~G?R4L%C0jMYu`FTM<=auFAnzBonq@$Xe+V_4O@Un%_MMRm@97(zEAQqzir4 zhUY^PuYPToBx6f2`vb>q>u5{{Ab!)QW}? zER2!`vE@vJ_4)G?- ztD*3hY4M5J%zfC)@9-JLQ(o^QT6xdq(0`_)a4{b&e=Rv&Pqj6let*dQ!G(ZXx%=Ox z&V)SsbTan$F3Fx&RykS%go~xWop4l_Xye&^WG~4ZY4HdrjCHt|l<3G-RSSO!ipal0 z(KZ)g*OOz$RH5YWxOkPWAmD*74TY@ZxRvxy18X`G{ixGm#p)quh;sVe3=l zxqd6vC6U*AZ>?2UI-K3ImQR!Q@=wQqRAXOX)uC)f7x<5k42XY>psCo|SJc?;Q9BGg zy;zTik&7!>Gn14x2CQ~C&{oF~P!H5y!1PISA9R-|^z~8FVZu(6H9Y}YR9?Y)e|@(Y zmo|47>V($TFwIQOS8C8tpc99AzZA12K_da(-9RKAN1k^f%FQQF*mpZPIU)X?$IX-g zFo}`XT_89Ak{mtdK0kBQ8gB?BMBO2J!~e^$&sbm(<4apO;^yvT>VX>*wi#rtK`_$5DF3X6pQx$sfN zCZd%(jEjrm5FPPo`fj!HQ=aOzIk-Yw!|F~Knh0Vcv%DZ3EE~1jdcK>UqPcmF)#vh| z>$8cUKP+FcVqPiSz)Nqkw)K?e3EV!5tpv~3!%;uoH$B?g{PPw0BAtqz9=+cr)%E)E zv3L`~slj1@wxsEkxaeq|iMO_g_@fiz;wTA6iD!==w{~>svC*`~iKbUoozl?>uex|b zaTfuV<*V-QIS`(>V~C4}5G(evGk5`1;rFHjwKb5xf@&2CTts(B$!XHOgu9^m35fQ` zfq^7ul(>M%nBroH9yz;C5Qwer>Fh-M2ti=_Pjs}3#bXycyDzhgh&fves_%#_HSd%x%%XY%(L8KzW_}vt#n4Wkr@~b26RNO&~PF}ejr$n|} z;KGxjC(blax5`Ox^%welMxd68uyv?gqWM5ehKi&z{sQ~ne7~GG`KoGayBQc344xsU z0iSn#XAqk|6lUne_w1Fe_J3_H2L2t4Gl87tn+;zvIRMb}3(NZ32KcM-b0_wX>y zF8Uf4gl|-USQr|o4Fryh;Xh;8^`P^!wXyk)J`tN{bAva5TzibKv+isj`UUa#$mHZP zXD#GcC$@3tBA$Tk`P;(L<$z~js3?rLOvj2j6zrDw(|@J?>FF?)Z05t$k+bTh%DlEY z3^!EXhje;<=$bnYH(30o%neV}y<<*D9+V*-*^4oJwJw@+|-J@{b*(f2ed za_61E&4fivHBW!1-}mt>H4dH)P^jl@zeSRY;u8AKd2C-Psf;~$|3F<21&e{w!r7mN zhTX$?8b4RJ9bVx15clF9?dkqy<{{Fo=Ff5E3 z!b`Z@0D7}Ey?GPUe>W?23xN=gt96eGASzeNWIyy53IZ}mJb(Q!w{C}qqSNavkI~G*a9t$W4ATmnQ)b}Go7uK#{MkxFLoS_vxOEh96uj}_ z3yf(|pD2j1H}9vMb{X)oala()ni>}^6)2jzCH#k-Qo7H;+=+QJUCSDI#09ZZ#s@Cl z`%CRgC))^-{>~>ZWas?7_s__kJy<;WP=|zhYzmVu=qYy#RMO*jaQxe<4QkOPuslxM zvdyVbc7xoQ*8)4I-)D_un{?4I3di%wA=iQ|3;ZB_k~HM#vT0GA4<^OO z#v*LL`IN5Wu5kcdV8PE6_oCS**e;v-R3P=p&o}vv_-Sm3R!{D*%GaE!-&C|;Ru*Fw zqN?b%0Df@xAkP?VDckCptk*zFmC6;>bcnFEh%k|>;IF15RS&+HgW8L?KLCmZ1Y`Fr^R50eL9~iPG z^JU*pPp0^Me)C;ZGG_C)9TXg*?yh9SVPA1abD%wtW?J_xqEUuo{Ri^L2oQZZVMf|h zbd1pAHg$A70ZM@-nUw<~8qX@u9`FH3X9h}u-3?!u=}6kp!bxUSpWl&~EdiNER0`6t z@ne{XprQ=D*J*k7=&JVADWS3vU5A~YHP!T!V(Ajo1g8*54W{R=5u`in(jle(NJwoV4+j! zzAQ4(I_aIW^OldVXzYJ+;Zay?{D0@d%iBmmt`Bs8v$%Q6dv#nxBwicBTp;2U10>*U z(>;~86)9vV&F)d9 zxUW*Of#Zg8LxoYE;mPT0t&^4xmXn|JRxf!KwB!_6fF3NXF)O)L`R=`$6W@bJsS7!W zQ`y@jMm_NEmzA}{er}w1Db=aQeiyG?E&koR{KNYD%o&~Q6NzK)+^dmV zJ^^Xw%^3zA*Newl-9GX~nkk6>x;G!l|Gl~GO4WUJ-c+^HxlbpW+LBA8rSB`@yBWD; zAMNL09MgDjbf_sRvUogqtNWiVw^=on-3x;5@y}dLlikhxoy<`DZu!A&zLjKbI0Mww z8nKn-83{0iLduHLrft$gM^h7u@eXhk6*6ez;95mS9@D;kj)DT5oM&+{fq_7TWVJ_? zJ1Pm*LVo^RTSZaTg7TQxbIiSml8BVb2FC`7DUJx>J*Al7gAqF*7Bn+wP-lVPyxZ~( zBm_=X$SBY3QO(qccR)#y0Sr|DDlvf6O|M_i{Qez&>lPq?S#%)~(ZktM(Q|m*y^@q? zZ&IjG+w?B(X#A*z`AV6-X%@zQq|_}jACb&hyne7fR@}fQb~pYVKErtW$B(Q#Jt7W2 zKb$rRmJ41r9aP@tE8Ll65JvZagImCd!##MMUDStf_%02slooAZiDZx zmlg?IdWWCXlWux9dP;Ap$1bb3tx}|BoziM7x$0DJ=St8h;j+0r>T>>iT%uU#!3!ll z&)rnURm9J!ygOIQ-|)L!_`E#-n)j5wn#0HAhE`vh%63z7u7vn`&o^qG8|e7B?(b#N z9T2?YKk^)E7P#Cn!URX?$>@nDdD&__ai~QZg~X>4rfZg+F)E4KcM)mlf$Xn-e*O)p z3R6qaK)C1SSMA&~F|2I0`&LQlxpC*ci_fCArQ8x|`WXK>uQIJ~f#oGm_pYc!+!5)d zqM%Byq5!`shgUoy)(-eSI1n^7RN%O*3g-(1(+N|hOt1!xVdwE@|*!c#whW7=Q@)y6p z%zBKt&E%s46)D+UBhHnRrz^h{IrQUqa1#B8HPMBEdA5<80+ZT5?)BI}4pN_lv@N;IcB)gCEEgfBySsm;)ibxq3q=8|MQnqfoH}mmH$PGAll(9w ze=$8J_q| zG8pN1+Yo}HKQKth2n)Ml-vG+w5bc9N1}Kcm`SUw$(WpZzq?V9l!0$3xm0b(jH_40~ z9=@Yq=@>g1)$$j@6X*9y_)4p@^xGsPoNzz-eRku~U79g9;fVsxq{v*7eSQ9yVqv47Dk1Sf4KlfKT&MVK!g{OiO{R6W;4soYvah z%a}Zclb0`Avw{gu4^Yz5CjWkGHWt6IXU}{vGOwiwg;HKohWf=+cpeBaeoj3zDM zYHX}AxRw8Wx5tA!!(Uq$J$%SrPaks*zP=K(1GE_Iwr4Hefg=|cOifMlaz%EwhJ3h& zG73H1`jBwjL=J{fOYd>6e3tq-5~dD9|G|S7BHbWZLpJJ}Zb~O&T>7Il_il{&_rZVF$*=qq9!zhZ z*=dsF=mdZCl`B_(V8b7e&02_-WXVTgiqMGbtp11bPM1IV@kBMF7T!%mb6T)vU_h3g z{R==|h*LF&!Al-O##kCMAs`!m?k|Fv>N+&UQtN3RE~>?An6}Lf|jlR!C_7k z>hE6jupeB&h#~Bz&>+3HFD0q_Z{PO&61*D#dunZ3e*SS*^HP#ugo(-F@yO@TpJ5Mb zGjR@|kENO{BmLr^{C;DpVlJ?$mDN}L`nUyfM(v}gS622}`0)fTk(Vw+h$&Px(=oe3`_(0IQR19ON0!A%f$Q~|J5Zpi!N?-d{qRO9)qyO5j>Fy z{e;B}90Chwm_K=<$J$@@>lG9F)({<+XoQPR;s*ct(K_^NZYUjV4xAKef)-9==(8(6 ztMW&KOoF8a=;)M0#i``P#FmC4W!TLnFp3o=)D$V<7u>4Lv+q*E!a5jq84`lgao42j zVu3o~A;$+L4KR_EG|n@^kR?4o?X`M&&VqR04)nlv>i4_}SU(;FrMjQOjf=-Z)f^>2Ppgz#t0jnsh4L+ryj| zshJ6$lhtpIgn~W&@=yJ?CzPh6cZ+9U@jHWq58xBOfO4mjbdqOQl} zG`FF2!4?eX_G!4aOZgs}K)CDd>@<}BiB*Q#;FPDP@@`>^lEOlyb8&Ix870D5m{Jn0 znF;%7$ibX_!AcQ#?-pXh4F?cxT1s+ExxQ+N0fHU&rR#qh<#9OPVUcCrw{HdXb$^ZD z$Dhe~$h|#1OHQ83>Uzi2W54rM!S&@_2PYaza;VV1ID5FdeqG2ErAFtEhfYlyN9QTY zQhhjD*Vp{Cv|8T2)s0X$fWO7}&rftj;Aa?i?SeUidf(x~g5RXmVA{IumtM>{#FxTT zVrOI1n2Dq$KupU^OFQ*cRYQ(v zG6y?Hy?F3_R3R94$6?+V+;2jJJ-#w6jsaHAG5%I(`(M6Ir^ zRoIt$L&w+u4V?{4F*QpQxp3>cxJ;Kt!@pbc^y!8AcsNM~TSBf~gRiw%Ffln<4x_=R z%Kr5P^^Sbk($u_hLk2?_O=3t{DAv{)>iexsCGa5NFz)BCMw5;8;r1l;rr>dSI?=N1 z+R^|4*NsO5XD2^KCne?WIEP9ad7p3xtYfotHB%#AaUWFG~yZ6>HN~?F)_G@#A+2 z3NRSnNm234=7Ai7*k-1otY~oMiQr9T~$3B)>H+(`U~XgOS1JgE`we+)+*gmG6+n4LNK^hBaIU@YIlcIvg~A zhoVBhicZM{5d+2tCAUtGj;bjGUpRT}*lmB-ojn!sKLg}xKU2FAf%xR_pTi*w*Wv30 zwxr|678cG+ESdVfZ{MDl*2=@MXk#WLh*olIQOMajJ4*e3fDV8|I? zKfn3JC8?08ac*qJxHPNZW_wAcLICe!(2$T>a3Yfw{ zZC%(^lqDoGn=f$&Zckg@mKA^dc)|Oq0pOv;7Ht87IYA6JSy){E?9eq^KJ336 zZ@@m&iT#k#(Q;6Z17TrQ$EoV;m4xemA(QowFE|*Y9>Nec`a);@6)YPWsiuL0NjNxc zcKWfjD~7VoaR@}AwkX37@J>c5g%hv;B-tGWU~^?y&Nf4aCI1hw`M=QWJ5~_Wy4gALzb)VvX=#r|jkwq@9fAfP5>>RA2Y^*qr5{Qr z+^TWR;NP_X;}J~S$$%@=mHEZR$jvCmd*+()W!Zv*mR*8|>itED?V%ABNJn^yrqUJbf$?JU%&wP37VY%CSd*!sBAC-crcHZL>mdTOve3GDg{kup^u}Dtj~~(aiEqemap&OhLz)vrDc0^Z~$lX=ljg3|E3!OOdEX4G?h< zc+nMxMF^Tn05u*d=!w87cq_59qa*0fcd0!O*W<$o;oIxDEamQ8{m!tusVOnXFr1Eh zD=AP{%=gGg2*Gjg?WsX9L%*xY*ztGP=euUkakuFAPJq{mMP**>f#$23zkCTJG zJX=@^P6?f^;uE5mo5bm>9cm z2|NOjW4G>dZMXNJ|Krik|H3S%``U}QYsQrBp!M;+A&QPw3FgmY`8Ui+x(p7v z+r*w~xK5wf`TdWpa&AGF)i%tTxkmrBCmCWmL~>mZejEoCB?cN1!5_?V!>w~J0A3-8 z4(P+)9T8PWC6?UnkMA4d8l32x_x_M_e+Q4%yDV0mLg`Ux?!@!+qF#pR0Dn|W^t7{o zt+ZR}&HZxMNLhWIf#jB_WPo<`5XT!li)NxW<{8OrbSx~wK<`=}CyTy71)cVX9FCyZ zw#Rl$SuGvhy2C!>&XY&dk5MS!34dL`Zb|qu-mKDi=gu4C(K1h{n*4>e%P=#6EZZ;T z>5CF$dGMDaGJEZj!LQs|X|_wP8jT-g6%yI(dV~VpKNdjD+OJh$?9Q60SIu0$hl`nh zZe!Us&)C~J>Y#3_Vl}7_-kI{sMbgyL%WunsfdJ#)$%8x{I*qoBWJ>F6ZHzxY&6E86 ztdf4slBS%FG6|`A8;La4-;ZHDXb#D3TkyF|bq)22h{)bB|GO*A=300q47}U-UOzvV zY>HVf%`y8|+Q&8%*_)WwM96GpW_EA@0fdDF&D<^Hu(nGUJxW6H3l`E}(y;VrbuH7C%9(j<-5+CuVgh zb$UAQITXzb_sqn^n)~C(bYO#kpb(@-gTU)hUZH4sK~l!ogm0+hPLnVSgxn|^< zuNBzyCOKIG>K;Jz&GZNW`Lvp5)FJ93n?KZ=B3 zlBFE?E@uRkeg_)ys1%9{vqFYcrMWOxfOvENLwg}3wJK`0S|AV{(9qV?3%+y-3IO^E zJ&8O73V@!NDBiMi5sYEe!G!pPi&O1+1qH@OPd$46P~pcAs(}MVz7}n-3x>a=(74)M z{ToOm&iDkaDih)2QQDJ!*@9usmfMaS2~9*a7_@Rh6Qm2b%aZE(T2udk8$mJ(6#$ zW5n63o_;17UY*wh)-b))F@w<3j}4dVnLWXj6Fy8OgIzVF!xsnSU? z91O{k&wSJ+bDSAz{_Dhektm8nsRL~gs9`~{Omr*g5k=uY(IS!PK{sv#%ayz%04w=?eIbh-V>`t=xT%OBHFQlM)23p5bEJh2`Welvx}dQSju#T zu!O6fkNc9K;EZZe=2*4$1xm!3S^PGpgKelUOxiK+gzK$>7}_YkP^(*xP?hfZeFUZr za3_J}A;)>%^LIp`KOM2)WNL~8ipj@k5lgv|-RBq?glt&~z*^yXT|GVYmP&c*ps3f@ z-Y*;_W2g#cPT*+EZ@|-VRFW<%NF2q4>|@yDy^O2}qW2p$wdI<1q>he`G$Do;r{kCx zEuUdw4(JI1-~`@9tVyu3w!Y^r|27O-Oq5J>;@u(~O6lTa6%?y7Ymrcp)^F2WnwiO* za`y?GHTvy+nK0soTNNgXhK9aZ`rB&L$2C_Tn83N-)iotK*}I|(s2Hy}{a+>xEt^XU z))KCqdwqlHLf60L<>jTSstRk2@#=L?o%M#Je_5smd{$=35smd{$=3km9c2`Raa0g#Dhf&!5Rg8~Aff^a(wmA9=_T|QtcZvxy#*9hR60oS zpmY*?htNZB0YV^hC=utwy!~}7 zKG5j|sHX)Oi}#`)4Y7)v#&bB7ijCKW5Qe>%a2=XT3Ow}9 zx*&YNKq+mtsc7bN+$xPsK-a%LP3`X~kK}Ue{V*-`%QsPs&bIgj_vf-7)#}v(15Umc zd_!AX8!u08=5%SjqQY+%!HuP@(0Z^tdIACh&NH8)KI>(gs_^gm)wQ!$Y9rZ9P^j;w zVf>nS8B%;0EFWoWE|YMDf$OeIyYAfkr_7D8*onyR<1zS#iH5KsjlI9R?#RCLNJJ;` zqWrr_pQ20~D|QAdES5*A*u@_F-T&Q6+eIri3s%G!(;^vj@&46vO4*VHL4hJ9d+=A6 z_CGA0pLSOu;#CF;Wf)aJ^pis;`nq{h7I94?B|?*vlPdgq0-v-lu$lQdnfg&DjlCE0 zX1ddj+SGn^Wt8pzd!jE%N>0w_5;S0Re8~u0h z-aUrW&I8!ikK5LDPq!eb=RQw0?} zcK<=V+rD3gt?1uvKGXiGXuaDAGw4)j(PQE+ESu6b;M!w?na{4XY>pN)DD`mqPcG;G zugi@mcrU71SXh*=eG)y6t0vMqlyFK*C2u=y!6eLP9LyhSxrT-CltnRG(x&^^e~==!&x^{UP>;B*ZESKMwIy*n*Pm8N zSr!T4biU3iY#3f#T%4r+%Q1QIOsX)TQ0X;ff>NT1`;g>NiMy!mbN89HWL38z*PdH3 z;-CJ5TN_sW*R5SNuYJ7+D>ltEtV}HTmB36jCrSM0gP>8#9eFlANfI6`CdDod@M94E zmw!FtdzTe5^mpb|-So!%0sDb8j1&Z?d&Ra%g4gWVW}KX~j*brdrAN09Fr9e2y1Gi6 z(Zn`>2;lBdBNSa=71DppVPAL}*(I`W^PBE1D8N>LiVfnYDlN}YmbFXHi7o-Nr!CnF>p!JrpS%c|sdy!Pci4MLv*s}k-|p# zZ6t2rwYH+ESR3bNvAQ(MX6ILJOyh-=i7E!3<}%7~TmZM%qoHj6L?7p;b-$dIR@r|d zDoaeHd~;05@cVhS)gprLqC(wH9hRobrx9OhUy`3MRWRgc^jSSFQUfPD*{aOavQo!W zvA7v}?xr(@3u!cf2alAw$)+fh5}m9hVbh()>DGHcM$y+Rbb?6VA!?hNCfpP$IvWwe z;V0OYZCA#0v!t$0SApv)U_u5%C zW+mG4U0vNN*dL9)l%Xi>E(wdTf5$6<#>d0XmhMQ=)C@(wfkb#gP;fw~rx4Pakbc%F zwbed?-^RX>|6q;p{FGJNdP0bJ>SmhaRC#KfO-h)(*krvomL=8G1=d%5rmglwHbJzp=?^L)WVPqZ(2I$pG^{dQ%p8JeYnt2}YSn zy+cXeP0_$1Yw9-SW@0jQ0H&knSkv7He*_*SBS;alrp)Y@qIAtWfy;Veb{R*J>GYtuV|y+CU^XeTm}c3oJf~181}MR zEF6D>?3K*&E$h&U6r~+2*gO$13UM_gROKmym>HlvyX$6j$;6#`G-l*6!_**#&_X38 zChlwuh^plPj7y92hOB^a0%ri`_ID{jHM)1)m6er?-4=@Nw_!S3khFXj;JSDBLgtq* z*Xg@E(*McQSNv<~b>a2o>Esa0-mLqOEzn4y`)qY2;*p{R`BVl) z^3{m&s3`Q$SI1?REBBE*5_c~F<+){UZVsra$Ys7)3`hpMyockpH=Hp@d3`N`uNSN1 z3_JTzh-{7qqyS3_;PLYStXfu;uBo)+l2JJJ>NQ+ts5}=hE9g%2bq}3D%KGlO(ynlfxe4!3Y`o`t_@ttE;OUr01mEU+iEM$|DM)#QxnMlmnOz%6&ZHEs~0h zWd-#ze27jF5j+V-=`UWqKp;)5O-4hULwU^EKBqb^Z4(n5l!d!`dMWVg9S{b3GE5jV z_W$br9+mx5{tN>ahf2^J^L;AlOF;mjY;#+r;M-K#SEPF0kY*@m2wuLGsHgz95+m>F z3~NdTP$l3{wyqocQ9DKB>$h(=TwT|T>wv=u4i&o!ZVLSB%~AP&5iOE!vt6m=+0;zS zwj>pU><20s^(NwXn;sFItm}hOPplwPEqbZ3~v0hUd|cmx1q zww&$!Dnp$J3p*>fSZIELnKSzFK8C4qZ4Coy`_by>UsF?W`ugq^*KIGBh?1vTZic$d zc3wbG@ny$*-%?Yxb#x*iVe!LW6PhSC40`dx0_NpGg6{?)Mh0U&h4+;>e7H$VAYE8C zUB{~9vz@HVbaaA(cZvgXmg%I+J!|U?b%Pi}3HIY%0SiMrJ5!&jm{M6g!(pF=yfpoC zc^lnK5!vAN^MZmmOPIOZi;N1^<~#Uxwin}KAMfkPP!34y$Uo^&E+ZGlrx4lSkA^Ai z$a&b1l%}6uI-SPy+-;#By}jUmYiZc~W3d;}XY6R=Ey|(-Ch-O)xu`P8qda}SlwU;f`M(Ul zu2oeS_&^y$a5dkp=(j+sfcQ$HIp*%%x$|yzc9w}-{xTxO)V<*f(&#@!TVE(3cgQU@ zKMhfgjY!o!j;ryWZc8`PxV&1=iT!cJO54D|g}JpFfm`=$UQ8l!4^Uahg?VYYno;!O zkC#UPpc%F2q6xu@SbV(9*UU^!D89vY7qmZr{P5wlT6>u{1=$(jzF7~A`|sI@5XhQZuYKq@i{2VgVtj)A+rrh=+I zMZg)kFvq=LkQ#VMf69VCVz#9v>pG+5f)D5pzYyk3P$>AAztLw~Eq-|EwythuZ0sJH z-Oc-b=tRw9xLlp=1IiDA(KgFl%`u)M86~TnxUUFG9gn`1<8bJp!qaq6bQVIth>KfLm=jGVl!%84$$v z-Kt}CtwR$%_9M{B+PV?ocj8fv%cloybJg1dpX+z^Mh{@AO*Bdw#d7kSjtVL3u_6F7 zyu!{J)38HDlD0pqTekuF6G%ZabQ(EGW0Wfca6l2g3wg=7N`wnu;Fr4JXU5>Fa&jJi^X^um6X=k{r0))%nFNzOgn%(KHCj|$ae`aMDU;w zd0L)2!K;#D+qGLkU(%*F>b*cmnYandPAa#YWSTP%Ce@_epJ}JfqLrG)K{r`%-ijnv6q!)1=X_cg3n*dO4J5pAG}N- zawjmy;(oMEANn?tfZgfAB9pB`dixOI%Rgm*v4~^|a$npI6@C-eW9lsolMOL%M$reb z31#h*dYlx3h=2=-JC0QTEAj;ZQJ?|kOL-F`?KkGxi`LqYc#>QCK>pa{vl^z1!OO6v z*bUgd(zx(rwzhU~tA=N4rjA=s_Ib+}Bg&$TP3ISvrM}$haN*%XCkp8WM}`LAl(q}$ zR|oR#FtzL?i|N+nAPws6oC7u6*|p@+<){nVs~xGC8a3^oR8q2H0F_U+j=yOlX)4M9 z4^koh+W^m^z7|I0zQgPW0ukaMJPm>d#V+ge2ryG7Qf}hp-cqt1N2_7MTiB)TjWy&~ zejo%peXJ>vUp*$&!Nk)dQtHw%Ts2>RvSuRf9*lpk9dw!Z`@?U1@*&3&Z-Fr3yxyh9 zhEom&qI@cdO%xx3rHx-*I*l-@ui7b}{}sq{+-4vEBc#D@Ait$faU=VGlZknS-;S24 zsj0sE%~){@E!YZ1R*&=zT@J;)*GyCpx9((V|8%n;N!ze#KH<#)tj3 z0~sde;?55@`jJhQe;r`8`!KZwm_RT@?)r^S6GH{ks@$Fr%D1{O+PdAci#)MUB~M6& zOC|^pJaZafB`4C(sw0}$RmNTl(5(4EOov+>tllpo_ryPuyCiMh^-ZT}_FL*I@N5}S z9|=JAjLy6XzGy#K_?lZmmQJG6663ME)ILkWUFR_dpqFeQS$_WfIZ1o-{f$o_(`<*P z@Fv9*pHnk#Q0#{ez20kh!^Fho1q)9CGMRJ=eV3SoG0a2wMA6tQL2<9OX_z)PT&`(w zaBz&2ogp9yZ9ToHhA{pVm}lV1x4zzO+!%03gp~F9+c$x(uC6(5pkKHgcUn3%%X_Vj zLBeb8=OR||bb$hG`rUiW5Zu!zh@&@odwN8H^oFeod|W^e4(TAT0V zC+;i?1I~s`9@o`)TyS-WjBlFDEQj#k|K&?svrLq6Xvk8YUfTtu*GBf#D~lydXchF^ ziD+{TeAa!^F-YqNYHO ze5GM6#mFXd>wo969B@XAoV)%17w0124``fK_ZypxB0l6#5qSk6v3-_tc8aa?0FAF* zd%Z~#GRXO2u-z+;puTItC(F8qw~=I`RKC{UsYt%ncH!8U@r?n}6PpY*SeXm5pB%?) zhZ1cv%hEs+9-YsvzFUjS1U1}{?>VT6_ z23@q<*lqW?E%k`YVUY?J5|iEUucp-`A1M1^V5r3^*nkv zs$wFhjz?5B`L;AsUKX;v3VK;2RZkkKH_vfg_D{gRnCx2ZG$IkB$=V#J=W@X4Ww!KC zc%Hht3i|&JTX?4Rbt7@E5?U=07EO^Bpsxt`DND$JCehK_`W7VolId{u{0EbbG{@%X zB#B3-Z*rVm4NKgC{qz30ElAEt0diihVnBC(xl=Ts(0c0HH^Ab_+`LhDFXQwXdo7ZPeD>KdY93K@7Y~8cC9$H4_sM8duBV&>Sy=d8M)48Yh9) zurFPyW#W($LPWC3D6<6Q<HZG(4zJIl|E4L#qU-6b7GpskW6E3ZQb2s0JNP*o03M@=~PQx z6e7-|9nC+{eeaQdx5q27-SX|6Vn{Pg`4?G+y&YnaJpFI| z3;vc`MddiyxJVcH&E>I|k&7SLxtx9+DS`@)umR*AR7gJeDo#pgO#f!64=rTB?d2Mo z^}=z$e1@&N+e?Xi_8pjjuLMzGaL8%_>(%%lmjdt)kWoO=v2R1LE$pI6P=?i^z**ws zV=_!i{%Jt9sq)|&8`p=ovL7QY+TES)6fAvLX7t(7?gcYYX8s4U0il^`ui_+jgTLOaB#0I}kB9AalR^8K-0A9xG5UZ&H9u zLaExveEAg8Edg~^+Xc_C+EYNpH%V9?!(G|K9e1gLZBSY8E(9^Gh6o~civzg36?^Fd z5Rn#WMJ6C=32YRI3q(Lrumi+908kR3962D43g{;(UJw-(m9Qjb+F7W&3seM{P#+NImpQ-2n*pXXG&MQ;R ze?gq)KMT9vjru$^6$XEz|Vt*bL>&a?B#i!vVr5nC#S)_|>i0W*bfIsKG@#B!9+ zc9p!=>q(l|*2%Nq9t}L2>)iECJ)uCxwqnRlW}{UZLvip6o1F8+(c4xOyeRlOSf+J+ ziA!IO{O(#uOM79F-!3Yv2*A)~HdBxL|8xIC?nH%%2>M*)HV;&9@?b#(^mtm|SM`~P z%+6;ir!*%hNOXMeLT{}_0Sw6LF?|XU;YZ8rpwSb!Aw}rA+xn5?N^+eiS1aVY%YDI| zQhx{9DBh-?lcLbTs>|{5tntR{=;|hDYwle8e9Kb+Y)%hzCG9g3eQ#R3&}+B#yBddi zQ*|Ym)?wdCCGM^rnHef^ILW~Qr1T>+%)-8YWq%7p=HsDzsC%t#UJw2F)k>Y)+txVr zBZg!TCYz(+Dhq>!)^6$l{$aO`;Q~bQMdbP@ z5fiD+O}TVnT6!j~IvIeoIKAhysZm&J)Y@E+L)g|Xk+4GFF;+X!**P(QPQ>BddQY<` zZawm&*Yn0mWBoQ}dqjK8+zh%eNq$ndu-LtLznUSIF2TSZ9l)=Fh!ulWG6pIyx_+ce zEfj6)BPPhWduD}OZYe%Ykxu25e0aUzuEcK9d-{VAwvMf#g1B;4X6MII^2|PF{UsVj zVeK|Ic5BAcYQ22_NR1`5;Tyl)Nq&XjG}~J1;{`{a1_^IM?$iz;5wLz|!J5Euv#yeWCXz1Bf_HKVy2s6T)wy| zQZgT#no%qxx3H!}nU=6Djd#Fqr$Kw!qYMLHKPzfAn?^(Rb251lqv@B$Xc&?{I-DYt zc|T-#M`BEls1}-LP$nyF>Z&7a3qAt|rh3H3mjt@jc3#itjTp2PwMalfP{Q`dOQx*> z-|YeoIblX$Y*zIS2M_e*g)qbT13UWcj@%qPr-FB z#3`6xyN2B!u+lGHTbhDG+Vlaqy(X8_-wEDhf%041L{dv%Zk(u_phu#^>nR#;y7Mar z8lEXg!)39IQi1FlWVcYKq(vLe=(7AIoU~A8nG`P|Jkza>^cx^q{uAXB&yJRd)-cOS z1#r39meVGcbD*beIp?LcM3FHz=;I?&@rP%695P+E!GRh5j#sk@I&I}uWZQ4)qY@rB zS6~I}yV#81rkHu0KAPysH{eiUqOm>37Iqd3HGPmeXNHc-Fdy%03KLM49A5tsHM$@R@~%>^-n^k~JaI<+oMycIfM+$2&&{g&E3$%W-L zO%UTn`)&^y&@w8H#8ofpGg^P{DF$JSC-s}NQvT!NCBHO)y(B-l(hgTe$W6GC4zH@^ zFwu{PxPal0e@g%~$nH&Uq1NnB95!tJZE_u{`Q(hz@PpEYXh{%KM>~ozq_YhOFM<*@ zMX8|shJFMfi8#YRhfZjT$uStj(sw**D|Hxf@T7eBa6dVuq9aKq$QcZSQ$U0ouyhKR z1T=QoxKG%6xYQGASN?+&v_sFD(dd08ORsl}|Qsrgj63PNcOHlnT@ z8Yw0u$V*%OsboKJjs3Q3J@0 zryI?k)je|L$XAY*xPpfp^97EMjt^(rrKvRXxmt{vSVgw)_O;#hOihl9)w7;nTNka` zF}4F6ytj47y@ra{&z%3VugsemoR`;P(F8~`2(Z87@`!1%TiHGd2?-i)FW6Cpz$3XF zx_adb*9oz)(bOFQ>1Q85o@F|qtQ=4^O5X_?OFGjmEOcI2*n%Khfyxq=JsDLSykgTA zT9@GcrYMZ>2zI_#a$QHuxH%B+hsNJ9V3X`yVE@~1``hx|9n!wlkJ1&b{ybP0f|(z= z((k_T>T3+UqMzTOg6)aK3Q9tDd^(PcMQP{KW4r$4L_IT$?GPo?%*>UPi1_%|B_(oz zc;nFucsfrIO{qI9->L5Qqy1M!Wcm)`(2j9e3m@3H2!@5~b z-`=h-7TcT}{b)t{D@HEL-PGel_kx_9%*xo>Ot0zp+pbP(4LWtkJyP~WeC@)3Q&s``9x$|N7I)h4jUezHE1gGCu}n*T|TeVW;pr(r#|d^Zj|j z1f_~g{0g4pZ@}b}wkIi-9RlIACiaMp&46LgP`NMfK!L-L;o-;Sz6_?$!%e9N!Eq-! z*OR&Tz1@IOj2wlC`t860Gp*sOs=&5nekpxL@3P+*7&?kwZO)uI^E(Smiqm-QVb+^% zMVM%_DPJcFL20}v=Nt;>y>@E1H```0bwV?|pr>|epnwecytjVGQ(Sl;e==253E33g*kx&dIKn^%;X>TD_agYHu0V5} zLnsmqrVk!GxDmv91@5xNgVrQUSB{gyz23$eH(Au06S4H;0|oTI?d><#53zmmgP;w2nh>c5EA<0BwYYcg`U&b zH+0UR`K8t4s~&$yRwb@2acLQ-sU75ywton|qIqHk52P<2A0J0o*PpeupFh-WcgT5f z2!S_f4D8Y=A3r_=L(oxH)@xwxxF{iEGrj!xfBTqy?&&Kv{N)a>xP$~KuIB;unbS5` z^bHNi#>T1zGfSQOWY3*D2i`INU=C?#kd4GF8jq!=rM)JZKX{;D>~cZ%4QEwfUrfc$ zg2S_bfPKK7iC_z3McLZgzI^?9!i>Jf25K=AyZAGZWc3Wwz{d~)ll2zzA8<*6JeesY zBO`A&VPj*X$Hfmk53oW9;QqN`yBSjG=%}cuI&i6jXI^Z0co^iZ*Wedz1!OySvM&6~ zd05&#`W##)7DeA*Gb!q4kA;r6#7Rvi43}9wxcD|AtcFnHmi>X|W%JZIGhqu?> zi;Ci*?d@8u*j2SpQq8y2*`qA$w<<)hBdIlXyv=zQBglz&z0GlN{yx{eMG|N8nBB>Oe+ z2iZhm?nVrp<*N;gKH)G(EOBS}`n933$kTcHcJsMO9^W;H(4$2BxGj>R1ptZ!)C zTiM?oY41L))|79j_A;oZz44VK5B8RmlhY?DI0iI>T`K$jsN+TNQwD-sBk+wgu&r?QbejqOhH@S463MV^CES5xpE5m%7MadDZeug5Q=!q=;`=X2ov&*w~qz+*}X(j$Ue7 z&j)4cCr=3#ST;7cTv*FmOjmH5hK2|e`zi{L&v;X~Ltl)%SZ+?2MgN*m0sW0+oz&mwIs%La@-67^c!i9LLTOL-qULSwib#05nZbNv)v>Xx z{G73c5T&VZw}nS$ihgVfa&qfqUELLR+EO=)MCZlZzS;ZXAm9 zqdq56=uY&zU7B~O5-Hzg-uHi-Ew2|mKQfYSUb~YvZ+qwvV*@Du>s#xnAN+iOnvJq& zn=hG$YHP2!V0b@QLoTeSuD%KyT~qaQMys}@=PRbnOiZ@Zt*^sFz*_B-mi69$^AN?{ z-c5=Gmm;)S*id)$+xCShHh!~cik3%fq?^Cx=m3|O2f0OB#&h*7*v{k#N_2THS(h(s zSaU52n6LTavbe(>Qd#$^_9|}AOMnE5Z3S8I1+)5pn+ZSSW4h7fNG*5t6I+0e`uNfk za+VIvW4ve2PUN_9drlkyZKki(Q-YwlEd>A4RtCWZ{uh)fI3{rk*s=wrPb5QucX+>l zYwK+Q74@Z_WRKD3Y|-KthaiJmg3Co7jH=CX(uCe_$cP}ID)4K>--9DV2=WmzDSjIl zXB1LVKUoI8VAKhw14&6qzcVxQ$;-#{s=hI%=+8b)PUfwk@5*gcmeBLP+0X|?jsmo$ z8Aw210RLew>wNLoz=L*%`Ii>?6J%X~t`cdR=AU*R?`*BC*koo)$;QSovbCQ+|B~&q z`uJn-rTvv%Kc8=YJZnyc|NR*n2BLIoCtiEJZhY{|5diKdl&p`9Ukesbuo;{D$)8#A zCMAx8P_`u?94l!)Q~kVG-v~3iW_5^>k^Lw)K6=@)*mb^MPPDXg$bGnh9zjI+-1K>H zX688S1%~C-XJ?O6FoDN zYXQtd`h|`M(1e7kpKQcWXhI3<`mNV>cznY0ve>hLkkOSo^!V7=4M#_CUB7%VQLp-X zp}2&@gF1N*+WYZ6rrZ4BYgWoEUFGrdp`oUG98P7HZHTqC*%%Z$@&O}=mRi^kly?ux z*w|R@#w+RksPJQ&&d$~6WOPl$BqVC8st)=Ol@#d7N3cljT;p_SncPwtO+4k#qcakZ{?L_@iu$hPO!MG8DS779`IlFcuZexR zIy_uvrj+2jAepbCn)`6{D(&eLk4OENwjwGxe$4l)0HFT;Fbn_M?skzw^9g5hi4~SZ z51Nl^{&AAqblhX^DNqtOW@gm-*DnYV+_wL;wv<=RlJ!_nghto`mSUug5 z!h!d1rQdfhXC|*Ea2oAN*+2_0K%F4 zq3a81uNltnJ`D^!_~FBcA3uMtKs|zy+uLi@ zjoe#ZB?ktDFx&$!g`%+@t!X>T|9Z0G)f-E7mrI{MeTwKe*do$bw?fa+iqR}6cb5fg zdCJ4P$1+4jZ2PjG0?f%@=zm@{gj?RT4|O>#!CpwN5Q|+5e)XV%lt}K*vB=vJS^uC( zS$s&E%1Neq0~x(uLta~}?OY3SQBqXQzqX!~^m$}rqIqM1L&klPGfq0Q?#GX34Poff z$*$l0!^0ufidN9xvMB2R7%r1TO}BpvSQ%7iQLn102{I|kzjOO-9X$UmFz~|Z(l51<)^KYm4rld9EFI(G+%5DiJCHEMIns-I83O@m~Z9zyd zqb?LI)Q<1&rau}gRQ@GWsvx1Wd7>}*A59EPy;rl^~dj_>6w?95I(RLIG5N?b;RgFCd~EZ989D=11O2{9iA?b4L>hQR5pfBftaZP^Ah>I8IzVRcc>xVg!C){rsjUR36~laQ z37bE+Nik|9j8Ulj{3NVXj>XC>+1QQ{tu}A|jvX zczSe_GXABGJ6ZMlcJ|i_r9J6J)X2yP>Mu*n&ntt;Q03s{-W4DW4Gj&WFgn!4B-? zg5^(wot?dwxM&Dg!kJ>>M<#7>{sV|b*@VacgdA97ETC-@8PvbN1Y)&!J&)O=vS;72@KMjN{t*{O<0{GO~N` z*;(kMULFezMb$SE7%pziOpjFBamnp{8x|K-ktynypO5-(({;!nl9#z05n$)c_e;aZ z#ou*zdZNmQN^)nS%+3pl*iYYv`TrOnV=yT{P*wFVK0Zyb+X*A_2d9rBKe*0)7Nf($ z4*M4s?YHZ9;S&=p*Yb0py}K7gND{`GBaTcB4hv&6DcSh#l%gW5|GAr{q{_!-wnHZm zS3-HeMp^Wg@mfQ5cjsT0mECjC!ooL#xYhsc+1fb?3EXo=w3e>hu3Ud_uejU%!>JbU z94$p%9zUuDLqo&NdcUgrF_Un)eV42|U)I-OKf}wbcH;)Ps*WR*2WLvgMn|uBcw7eA zE4ru0;o*ZPWZ{B8c3YJ}OWB(RN2X=IyJu#<#68`2Wm3k~&tAl|yu3G@)VZ5(n7xvk zd09^%c~0BRFNVHLQcBxi!isK}hZ-gnutkyc|C_oK}U%DOG#p(1DJ4tf!9ZUP)M!LO_ z!EmEDmjix3%=IcJh8=oj=%Her+Lglc||D1E(rBT5hF6{$y z0i0aI!6BR@Cr{ph7`}i1{^4V;EmLyV;-cD4@|u@j4{e(7{>0ZF@Lzk)1T4|X*>U74 zfG{&Um4!#wgVp#%1>>PZ*M)g1%p2<*K;h~C?SPh{)>SCjC@n(#o>L_>_kxSkDVR7Z zp8_ZIh@H-d%wI%sYB$GMWH26&HXY&2)&on++RZ!3`g!)am2J~j>9fxO##xFOdo&c; z+|e~`{LF(rs~}T^?=OwvQuK+24X7ilyMlb)L{u;#Atli-7Mxw7V9GfPlL~ILS<#D= z<~>3Z!odYo&G##pN7tAR|LkmjU6p(-+hRx->Sd9`y#8>4bmlNo?&Bzzl3zT`!07aJ zJ$$0bWAEoa#lpvxg!5tR8}u3k(v48=8YRKgMw;^ z#6-0)J~6MgM@V)Bh<+IW1wt4>!+!SSg=v0yU|?W2juFypbD`6?{`W^mz=Lx!p=9t( z-EkQ?IgSDr&dYxRJ`LUmtv3boP+@WLYQIfp8@xJo7q6FGShyK#4hO{mb3cItCZM(H z@$VquEox!T>k+v9B1p~6%?Jim@ZLCk=~6h1C);WK8pul3kc*#wuxOGEJbghjLc+?b zu(%L4vM_o@>&B}UA2lm5rkGTG* z^iK5aZ~XxCdwqXH!$CL|!A?HT!r~Abb~Ho3t|>LpspQKvC(6PCJJAmS=v$ii=?XDn zf&L^L}Sy0ye#; zIi7mn$_o9uj^Xgh$7N-_#QIcC1qE?De+*ZJdb=bRkih4$UMub==ef`Rj zDqbfS+h>`XN={AzbDt`LEG(yvaC7^aY<<&&)@k}`d|sX;7(73Kw+_1R;Q*|1t-A!I zYjzWjb!Da7T9AQrp3J>;&lp*V? zY-pjQoG0r26@5Kirf%WydR* tz2s5O0uTH$1<0?_QWWE2{=b+wj2=JWWxe=*I91 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