{"version":3,"sources":["../../common/lib/backend-impl.ts","../../common/lib/backend.ts","../../common/lib/version.ts","../../common/lib/env-impl.ts","../../common/lib/env.ts","../../common/lib/tensor-conversion-impl.ts","../../common/lib/tensor-factory-impl.ts","../../common/lib/tensor-impl-type-mapping.ts","../../common/lib/tensor-utils-impl.ts","../../common/lib/tensor-impl.ts","../../common/lib/tensor.ts","../../common/lib/trace.ts","../../common/lib/inference-session-impl.ts","../../common/lib/inference-session.ts","../../common/lib/tensor-conversion.ts","../../common/lib/tensor-factory.ts","../../common/lib/onnx-model.ts","../../common/lib/onnx-value.ts","../../common/lib/training-session-impl.ts","../../common/lib/training-session.ts","../../common/lib/index.ts","../lib/onnxjs/instrument.ts","../lib/onnxjs/opset.ts","../node_modules/guid-typescript/dist/guid.js","../node_modules/long/index.js","../node_modules/flatbuffers/js/flatbuffers.mjs","../lib/onnxjs/ort-schema/flatbuffers/ort-generated.ts","../node_modules/@protobufjs/aspromise/index.js","../node_modules/@protobufjs/base64/index.js","../node_modules/@protobufjs/eventemitter/index.js","../node_modules/@protobufjs/float/index.js","../node_modules/@protobufjs/inquire/index.js","../node_modules/@protobufjs/utf8/index.js","../node_modules/@protobufjs/pool/index.js","../node_modules/protobufjs/src/util/longbits.js","../node_modules/protobufjs/src/util/minimal.js","../node_modules/protobufjs/src/writer.js","../node_modules/protobufjs/src/writer_buffer.js","../node_modules/protobufjs/src/reader.js","../node_modules/protobufjs/src/reader_buffer.js","../node_modules/protobufjs/src/rpc/service.js","../node_modules/protobufjs/src/rpc.js","../node_modules/protobufjs/src/roots.js","../node_modules/protobufjs/src/index-minimal.js","../node_modules/protobufjs/minimal.js","../lib/onnxjs/ort-schema/protobuf/onnx.js","../lib/onnxjs/util.ts","../lib/onnxjs/tensor.ts","../lib/onnxjs/backends/webgl/glsl-source.ts","../lib/onnxjs/backends/webgl/types.ts","../lib/onnxjs/backends/webgl/utils.ts","../lib/onnxjs/backends/webgl/ops/packing-utils.ts","../lib/onnxjs/backends/webgl/ops/pack.ts","../lib/onnxjs/backends/webgl/ops/reshape-packed.ts","../lib/onnxjs/backends/webgl/ops/uint8-encode.ts","../lib/onnxjs/backends/webgl/ops/unpack.ts","../lib/onnxjs/backends/webgl/texture-data-encoder.ts","../lib/onnxjs/backends/webgl/texture-layout.ts","../lib/onnxjs/backends/webgl/inference-handler.ts","../lib/onnxjs/attribute-with-cache-key.ts","../lib/onnxjs/backends/webgl/ops/batch-normalization.ts","../lib/onnxjs/backends/webgl/glsl-definitions.ts","../lib/onnxjs/backends/webgl/ops/binary-op.ts","../lib/onnxjs/backends/webgl/ops/cast.ts","../lib/onnxjs/backends/webgl/ops/concat-packed.ts","../lib/onnxjs/backends/webgl/ops/concat.ts","../lib/onnxjs/backends/webgl/ops/unary-op.ts","../lib/onnxjs/backends/webgl/ops/fuse-utils.ts","../lib/onnxjs/backends/webgl/ops/conv-grouped.ts","../lib/onnxjs/backends/webgl/ops/im2col-pack.ts","../lib/onnxjs/backends/webgl/ops/matmul.ts","../lib/onnxjs/backends/webgl/ops/matmul-pack.ts","../lib/onnxjs/backends/webgl/ops/conv-pack.ts","../lib/onnxjs/backends/webgl/ops/im2col.ts","../lib/onnxjs/backends/webgl/ops/dot-product.ts","../lib/onnxjs/backends/webgl/ops/conv.ts","../lib/onnxjs/backends/webgl/ops/conv-transpose.ts","../lib/onnxjs/backends/webgl/ops/transpose.ts","../lib/onnxjs/backends/webgl/ops/depth-to-space.ts","../lib/onnxjs/backends/webgl/ops/flatten.ts","../lib/onnxjs/operators.ts","../lib/onnxjs/backends/webgl/ops/gather.ts","../lib/onnxjs/backends/webgl/ops/gemm.ts","../lib/onnxjs/backends/webgl/ops/image-scaler.ts","../lib/onnxjs/backends/webgl/ops/instance-normalization.ts","../lib/onnxjs/backends/webgl/ops/lrn.ts","../lib/onnxjs/backends/webgl/ops/pad.ts","../lib/onnxjs/backends/webgl/ops/pool.ts","../lib/onnxjs/backends/webgl/ops/reduce.ts","../lib/onnxjs/backends/webgl/ops/reshape.ts","../lib/onnxjs/backends/webgl/ops/upsample.ts","../lib/onnxjs/backends/webgl/ops/resize-packed.ts","../lib/onnxjs/backends/webgl/ops/shape.ts","../lib/onnxjs/backends/webgl/ops/slice.ts","../lib/onnxjs/backends/webgl/ops/softmax.ts","../lib/onnxjs/backends/webgl/ops/split.ts","../lib/onnxjs/backends/webgl/ops/squeeze.ts","../lib/onnxjs/backends/webgl/ops/sum.ts","../lib/onnxjs/backends/webgl/ops/tile.ts","../lib/onnxjs/backends/webgl/ops/unsqueeze.ts","../lib/onnxjs/backends/webgl/op-resolve-rules.ts","../lib/onnxjs/backends/webgl/glsl-function-inliner.ts","../lib/onnxjs/backends/webgl/texture-layout-strategy.ts","../lib/onnxjs/backends/webgl/glsl-coordinate-lib.ts","../lib/onnxjs/backends/webgl/glsl-encoding-lib.ts","../lib/onnxjs/backends/webgl/glsl-fragcolor-lib.ts","../lib/onnxjs/backends/webgl/glsl-shape-utils-lib.ts","../lib/onnxjs/backends/webgl/glsl-vec-lib.ts","../lib/onnxjs/backends/webgl/glsl-registered-libs.ts","../lib/onnxjs/backends/webgl/glsl-preprocessor.ts","../lib/onnxjs/backends/webgl/program-manager.ts","../lib/onnxjs/backends/webgl/texture-manager.ts","../lib/onnxjs/backends/webgl/session-handler.ts","../lib/onnxjs/backends/webgl/webgl-context.ts","../lib/onnxjs/backends/webgl/webgl-context-factory.ts","../lib/onnxjs/backends/backend-webgl.ts","../lib/onnxjs/backend.ts","../lib/onnxjs/execution-plan.ts","../lib/onnxjs/attribute.ts","../lib/onnxjs/graph.ts","../lib/onnxjs/model.ts","../lib/onnxjs/session.ts","../lib/onnxjs/session-handler-inference.ts","../lib/backend-onnxjs.ts","../lib/wasm/wasm-utils-env.ts","../lib/wasm/proxy-worker/main.ts","../lib/wasm/wasm-utils-import.ts","../lib/wasm/wasm-factory.ts","../lib/wasm/wasm-utils.ts","../lib/wasm/run-options.ts","../lib/wasm/session-options.ts","../lib/wasm/wasm-common.ts","../lib/wasm/wasm-utils-load-file.ts","../lib/wasm/wasm-core-impl.ts","../lib/wasm/proxy-wrapper.ts","../lib/wasm/session-handler-inference.ts","../lib/backend-wasm.ts","../lib/backend-wasm-inference.ts","../lib/index.ts","../lib/version.ts"],"names":["backends","backendsSortedByPriority","registerBackend","tryResolveAndInitializeBackend","resolveBackendAndExecutionProviders","init_backend_impl","__esmMin","name","backend","priority","currentBackend","i","backendName","backendInfo","isInitializing","e","options","eps","backendHints","backendNames","errors","availableBackendNames","resolveResult","err","filteredEps","target","prop","init_backend","version","init_version","logLevelValue","env","init_env_impl","value","init_env","tensorToDataURL","tensorToImageData","init_tensor_conversion_impl","tensor","canvas","pixels2DContext","width","height","inputformat","norm","normMean","normBias","stride","rTensorPointer","gTensorPointer","bTensorPointer","aTensorPointer","j","R","G","B","A","image","channels","step","rImagePointer","gImagePointer","bImagePointer","aImagePointer","bufferToTensor","tensorFromImage","tensorFromTexture","tensorFromGpuBuffer","tensorFromPinnedBuffer","init_tensor_factory_impl","init_tensor_impl","buffer","outputformat","float32Data","Tensor","isHTMLImageEle","isImageDataEle","isImageBitmap","isString","data","bufferToTensorOptions","createCanvas","createCanvasContext","tempCanvas","resolve","reject","context","newImage","img","texture","download","dispose","dims","gpuBuffer","dataType","type","NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP","NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP","isTypedArrayChecked","checkTypedArray","init_tensor_impl_type_mapping","isBigInt64ArrayAvailable","isBigUint64ArrayAvailable","isFloat16ArrayAvailable","calculateSize","tensorReshape","init_tensor_utils_impl","size","dim","arg0","arg1","arg2","expectedTypedArrayConstructor","maybeDims","typedArrayConstructor","firstElementType","mappedType","releaseData","init_tensor","TRACE","TRACE_FUNC","TRACE_FUNC_BEGIN","TRACE_FUNC_END","init_trace","deviceType","label","msg","extraMsg","stack","hasTraceFunc","InferenceSession","init_inference_session_impl","_InferenceSession","handler","feeds","fetches","isFetchesEmpty","isFetches","arg1Keys","v","results","returnValue","key","result","arg3","filePathOrUint8Array","byteOffset","byteLength","optionsWithValidatedEPs","init_inference_session","init_tensor_conversion","init_tensor_factory","init_onnx_model","init_onnx_value","noBackendErrMsg","TrainingSession","init_training_session_impl","_TrainingSession","hasOptimizerModel","hasEvalModel","trainingOptions","sessionOptions","evalModel","optimizerModel","inputNames","outputNames","trainableOnly","array","paramsSize","init_training_session","esm_exports","__export","init_esm","log","createCategorizedLogger","logInternal","category","severity","content","_stack","config","LOGGER_CONFIG_MAP","SEVERITY_VALUE","LOGGER_PROVIDER_MAP","NoOpLoggerProvider","ConsoleLoggerProvider","LOGGER_DEFAULT_CONFIG","Logger","Event","EventRecord","Profiler","now","init_instrument","_severity","_content","_category","verbose","info","warning","error","fatal","reset","set","previousConfig","setWithEnv","startTime","endCallback","timer","ctx","endTime","maxNumberEvents","flushBatchSize","flushIntervalInMilliseconds","func","event","isPromise","res","reason","eventRes","currentTime","previousPointer","resolveOperator","node","opsets","rules","rule","opType","domain","versionSelector","opImpl","opInit","opset","matchSelector","selector","rangeStart","pair","rangeEnd","init_opset","require_guid","__commonJSMin","exports","Guid","guid","count","out","other","Long","low","high","unsigned","isLong","obj","ctz32","c","fromInt","cachedObj","cache","UINT_CACHE","fromBits","INT_CACHE","fromNumber","UZERO","ZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","MIN_VALUE","MAX_VALUE","TWO_PWR_32_DBL","lowBits","highBits","fromString","str","radix","p","radixToPower","pow_dbl","power","fromValue","val","wasm","TWO_PWR_16_DBL","TWO_PWR_24_DBL","TWO_PWR_24","ONE","UONE","NEG_ONE","LongPrototype","long_default","init_long","radixLong","div","rem1","rem","remDiv","intval","digits","bit","thisNeg","otherNeg","addend","a48","a32","a16","a00","b48","b32","b16","b00","c48","c32","c16","c00","subtrahend","multiplier","divisor","approx","halfThis","log2","delta","approxRes","approxRem","numBits","b","le","hi","lo","bytes","flatbuffers","init_flatbuffers","opt_initial_size","initial_size","forceDefaults","additional_bytes","align_size","old_buf_size","byte_size","voffset","defaultValue","bb","new_buf_size","nbb","offset","numfields","vtableloc","trimmed_size","standard_fields","len","existing_vtable","vt1","outer_loop","vt2","root_table","opt_file_identifier","opt_size_prefix","size_prefix","file_identifier","table","field","table_start","vtable_start","ok","elem_size","num_elems","alignment","s","utf8","codePoint","a","position","bb_pos","vtable_offset","vtable","t","opt_encoding","length","d","ident","onnxruntime","init_ort_generated","experimental","fbs","AttributeType","DimensionValueType","TensorDataType","NodeType","TypeInfoValue","Shape","index","builder","dimOffset","numElems","Dimension","optionalEncoding","valueOffset","denotationOffset","DimensionValue","dimType","dimValue","dimParamOffset","TensorTypeAndShape","elemType","shapeOffset","MapType","keyType","valueTypeOffset","SequenceType","elemTypeOffset","EdgeEnd","node_index","src_arg_index","dst_arg_index","NodeEdge","nodeIndex","inputEdgesOffset","outputEdgesOffset","Node","nameOffset","docStringOffset","domainOffset","sinceVersion","opTypeOffset","executionProviderTypeOffset","inputsOffset","outputsOffset","attributesOffset","inputArgCountsOffset","implicitInputsOffset","ValueInfo","typeOffset","TypeInfo","valueType","OperatorSetId","dimsOffset","rawDataOffset","stringDataOffset","SparseTensor","valuesOffset","indicesOffset","Attribute","f","sOffset","tOffset","gOffset","floatsOffset","intsOffset","stringsOffset","tensorsOffset","graphsOffset","Graph","initializersOffset","nodeArgsOffset","nodesOffset","maxNodeIndex","nodeEdgesOffset","sparseInitializersOffset","Model","irVersion","opsetImportOffset","producerNameOffset","producerVersionOffset","modelVersion","graphOffset","graphDocStringOffset","KernelCreateInfos","nodeIndicesOffset","kernelDefHashesOffset","SubGraphSessionState","graphIdOffset","sessionStateOffset","SessionState","kernelsOffset","subGraphSessionStatesOffset","ortVersionOffset","modelOffset","require_aspromise","module","asPromise","fn","params","pending","require_base64","base64","string","n","b64","s64","start","end","parts","chunk","invalidEncoding","require_eventemitter","EventEmitter","evt","listeners","args","require_float","factory","f32","f8b","writeFloat_f32_cpy","buf","pos","writeFloat_f32_rev","readFloat_f32_cpy","readFloat_f32_rev","writeFloat_ieee754","writeUint","sign","exponent","mantissa","writeUintLE","writeUintBE","readFloat_ieee754","readUint","uint","readUintLE","readUintBE","f64","writeDouble_f64_cpy","writeDouble_f64_rev","readDouble_f64_cpy","readDouble_f64_rev","writeDouble_ieee754","off0","off1","readDouble_ieee754","require_inquire","require_utf8","c1","c2","require_pool","pool","alloc","slice","SIZE","MAX","slab","require_longbits","LongBits","util","zero","zeroHash","charCodeAt","hash","mask","part0","part1","part2","require_minimal","Buffer","sizeOrArray","bits","merge","dst","src","ifNotSet","keys","newError","CustomError","message","properties","fieldNames","fieldMap","encoding","require_writer","Writer","BufferWriter","Op","noop","State","writer","create","writeByte","writeVarint32","VarintOp","writeVarint64","writeFixed32","writeBytes","head","tail","BufferWriter_","require_writer_buffer","writeStringBuffer","require_reader","Reader","BufferReader","indexOutOfRange","reader","writeLength","create_array","readLongVarint","readFixed32_end","readFixed64","nativeBuffer","wireType","BufferReader_","require_reader_buffer","require_service","Service","rpcImpl","requestDelimited","responseDelimited","rpcCall","method","requestCtor","responseCtor","request","callback","self","response","endedByRPC","require_rpc","rpc","require_roots","require_index_minimal","protobuf","configure","require_onnx","$protobuf","$Reader","$Writer","$util","$root","onnx","valuesById","values","AttributeProto","tag","end2","object","long","typeUrlPrefix","ValueInfoProto","NodeProto","TrainingInfoProto","ModelProto","StringStringEntryProto","TensorAnnotation","GraphProto","TensorProto","Segment","SparseTensorProto","TensorShapeProto","$oneOfFields","TypeProto","Sequence","Map","Optional","OperatorSetIdProto","FunctionProto","assert","expr","decodeUtf8String","import_onnx","ArrayUtil","MatMulUtil","BroadcastUtil","GemmUtil","ProtoUtil","LongUtil","ShapeUtil","SplitUtil","PoolConvUtil","MIN_CLIP","MAX_CLIP","init_util","n1","n2","dimsA","dimsB","outputShape","aRank","bRank","_BroadcastUtil","adims","bdims","isMatMul","arank","brank","crank","cdims","cShapeMatMul","aLen","bLen","broadcastedIndices","originalShape","originalIndices","op","inplace","resultType","outputIndices","originalIndicesA","originalIndicesB","valA","valB","isAScalar","isBScalar","rest","shape","finalShape","inputRank","finalRank","inputShape","inRank","leftShape","transLeft","rightShape","transRight","biasShape","M","K","N","kDim","_ProtoUtil","typeProto","attributes","_ShapeUtil","axis","rank","strides","indices","tensorRank","axes","x","axisToIncrementOn","k","originalDims","shapeHints","nDims","reshapedDims","unknownDimension","newTensorSize","oldTensorSize","perm","pad","shape1","shape2","total","y","right","outputDims","inSqueezeList","inputDimsIterator","_SplitUtil","split","numOutputs","shapes","offsets","numElementsAlongAxis","_PoolConvUtil","isGlobalOperator","inputDims","kernelShape","dilations","pads","autoPad","filterDims","inSize","dilation","kernel","padHeadIndex","padTailIndex","dkernel","padNeeded","sizeof","sizeofProto","createView","dataBuffer","dataviewConstructor","longToNumber","ortFbs","readProto","view","import_guid_typescript","_Tensor","dataProvider","asyncDataProvider","dataId","empty","constructor","tensorProto","dataDest","dataSource","elementSize","element","ortTensor","getGlsl","GLSL_ES_2_0","GLSL_ES_3_0","getVertexShaderSource","glsl","getFragShaderPreamble","getDefaultFragShaderMain","outputShapeLength","init_glsl_source","init_types","repeatedTry","checkFn","delayFn","_counter","maxCounter","tryCount","tryFn","nextBackoff","generateShaderFuncNameFromInputSamplerName","samplerName","generateShaderFuncNameFromInputSamplerNameAtOutCoords","squeezeInputShape","squeezedShape","newInputShape","getSqueezedParams","keptDims","getCoordsDataType","getGlChannels","init_utils","getVecChannels","getChannels","unpackFromChannel","init_packing_utils","getOutOfBoundsCondition","cond","getOutput","coord00","coord01","coord10","coord11","D","getSetup","rows","cols","packProgramMetadata","createPackProgramInfo","createPackProgramInfoLoader","init_pack","input","outputRank","coordsDataType","setup","reversedInputWH","outOfBoundsCondition","output","shaderSource","processDims3D","batch","isReshapeCheap","isCheapReshape","getReshapedInputCoords","coords","line1","line2","getFlattenedIndexFrom3D","createPackedReshape3DProgramMetadata","createPackedReshape3DProgramInfo","createPackedReshape3DProgramInfoLoader","init_reshape_packed","outputShape3D","input3D","metadata","inputShape3D","squeezedOutputShape","mainLoop","outputCoords","encodeAsUint8","init_uint8_encode","inferenceHandler","programInfo","getSourceCoords","unpackProgramMetadata","createUnpackProgramInfo","createUnpackProgramInfoLoader","init_unpack","innerDims","unpackChannel","sourceCoords","RedFloat32DataEncoder","RGBAFloatDataEncoder","Uint8DataEncoder","init_texture_data_encoder","gl","textureSize","source","dataSize","_value","textureType","dest","_textureSize","createTextureLayoutFromTextureType","calculateTextureWidthAndHeight","createTextureLayoutFromShape","init_texture_layout","textureLayoutStrategy","channel","isPacked","reverseWH","breakAxis","unpackedShape","layout","prefs","inferredDims","getProgramInfoUniqueKey","WebGLInferenceHandler","init_inference_handler","inputTextureDatas","inputs","session","program","artifact","outputTextureLayout","outputTextureData","td","adjustedKernelShape","adjustedLayout","numFeatureMaps","oldRowSize","newRowSize","newSize","oldOffset","newOffset","unpackedTextureLayout","unpackedTextureData","usage","inputTD","newTextureLayout","squeezedInputShape","squeezedInputTensor","squeezedOutputTensor","tensorId","textureData","_id","AttributeWithCacheKeyImpl","createAttributeWithCacheKey","init_attribute_with_cache_key","attribute","batchNormalizationProgramMetadata","batchNormalization","parseBatchNormalizationAttributes","createBatchNormalizationProgramInfo","validateInputs","init_batch_normalization","epsilon","momentum","spatial","scaleWidth","scaleHeight","X","scale","mean","var_","GlslContext","GlslLib","GlslLibRoutine","GlslLibRoutineNode","TopologicalSortGlslRoutines","init_glsl_definitions","glContext","inputTextureLayouts","routineBody","dependencies","nodes","cycleCheck","alreadyTraversed","graphNodes","root","glslAdd","glslDiv","glslMul","glslSub","glslEqual","glslGreater","glslLess","glslAnd","glslOr","glslXor","glslPow","glslBuiltinBinary","glslPRelu","fname","createBinaryProgramInfoLoader","createBinaryProgramInfo","add","and","equal","greater","less","mul","or","pow","pRelu","sub","xor","init_binary_op","glslFunc","outputTensorType","cacheKey","isBroadcast","usePackedTexture","calculatedShape","aBcast","bBcast","cast","parseCastAttributes","init_cast","to","createPackedConcatProgramMetadata","createPackedConcatProgramInfo","createPackedConcatProgramInfoLoader","getShiftedChannelsSnippet","init_concat_packed","inputCount","cacheHint","_v","dataNShape","axisIndex","dtype","lastChannels","allChannels","getValueSnippet","shift","lastIndex","channelIdx","idx","concat","createUnpackedConcatProgramMetadata","createUnpackedConcatProgramInfo","createUnpackedConcatProgramInfoLoader","getTextureIndexWhereDataResidesLinearSearch","getTextureIndexWhereDataResidesBinarySearch","getFetchDataFromCorrectTextureMethod","getGetSizeInConcatAxisValueFromIndexMethod","parseConcatAttributes","init_concat","_handler","sizeInConcatAxis","previousSum","getTextureIndexWhereDataResidesMethod","fetchDataFromCorrectTextureMethod","getSizeInConcatAxisValueFromIndexMethod","numberOfTensors","codeLines","inputType","inputDimensionality","glslAbs","glslBuiltinUnary","glslAcos","glslAsin","glslAtan","glslCeil","glslCos","glslElu","alpha","glslExp","glslFloor","glslClip","min","max","glslIdentity","glslLeakyRelu","glslLog","glslNeg","glslNot","glslSin","glslRelu","glslSigmoid","glslSqrt","glslTan","glslTanh","createElementwiseProgramInfo","createElementwiseProgramInfoLoader","abs","acos","asin","atan","clip","parseClipAttributes","clipV11","generateClipAttributesFromInputs","ceil","cos","elu","parseEluAttributes","exp","floor","identity","leakyRelu","parseLeakyReluAttributes","neg","not","relu","sigmoid","sin","sqrt","tan","tanh","init_unary_op","getActivationSnippet","activationName","activationFunction","applyActivation","parseInternalActivationAttributes","init_fuse_utils","activation","clipMin","clipMax","createUnpackedGroupedConvProgramMetadata","createUnpackedGroupedConvProgramInfo","createUnpackedGroupedConvProgramInfoLoader","init_conv_grouped","init_conv","hasBias","processBias","xShape","wShape","outputChannelsPerGroup","calculateOutputShape","createPackedIm2ColProgramMetadata","createPackedIm2ColProgramInfo","createPackedIm2ColProgramInfoLoader","init_im2col_pack","w","xshape","wshape","rowDim","colDim","im2colShape","kernelSize","unrolled","row","col","createMatmulProgramInfo","activationAttributes","aShape","bShape","allGlChannels","getBiasForMatmulSnippet","getBiasForMatmul","sharedDim","createMatmulProgramInfoLoader","createMatmulProgramMetadata","inShape","outShape","unpackedCoordsSnippet","outRank","rankDiff","_s","coordsSnippet","isInputScalar","matMul","parseMatMulAttributes","init_matmul","init_matmul_pack","createPackedMatmulProgramInfoLoader","getBcastSamplerForMatmul","unpackedACoordsSnippet","unpackedBCoordsSnippet","inAShape","inBShape","inARank","inBRank","rankADiff","rankBDiff","broadcastADims","broadcastBDims","coordsASnippet","coordsBSnippet","swapDimSnippet","getA","getB","createPackedMatmulProgramMetadata","createPackedMatmulProgramInfo","sharedDimIndex","getBcastedSamplerForMatmulSnippet","getSamplerAInLoopSnippet","getSamplerBInLoopSnippet","getOutputCoordsSnippet","conv2DPacked","init_conv_pack","kshape","im2colOutput","kernelReshaped","matmulInputs","matmulOutput","createIm2ColProgramMetadata","createIm2ColProgramInfo","createIm2ColProgramInfoLoader","calculateIm2ColDims","init_im2col","_inferenceHandler","im2colDims","createDotProductProgramMetadata","createDotProductProgramInfo","createDotProductProgramInfoLoader","init_dot_product","kWidth","kHeight","im2colStrides","im2colWidth","im2colHeight","initValue","conv","conv2d","conv2DUnpackedPointwise","conv2DUnpacked","getAdjustedConvAttributes","parseConvAttributes","adjustPads","batchSize","inputSpatialShape","spatialRank","outChannels","dilatedKernelShape","outputSpatialShape","adjustedAttributes","packMode","isPointwise","reshapedX","reshapedK","xIm2Col","dotProductInputs","newAttributes","group","dataChannel","filterInChannel","computeTotalPad","distributePadding","calculateOutputShapeAndPads","convTranspose","convTranspose2d","createConvTransposeProgramMetadata","createUnpackedConvTransposeProgramInfo","createUnpackedConvTransposeProgramInfoLoader","convTranspose2DUnpacked","getAdjustedConvTransposeAttributes","parseConvTransposeAttributes","init_conv_transpose","inDim","adj","outSize","totalPad","smallPad","outputPadding","updateShape","valueInit","inputChannelsPerGroup","featureMaps","transposeProgramMetadata","transpose","parseTransposeAttributes","createTransposeProgramInfo","getAdjustedPerm","getOutputShape","getPermFunctionBody","init_transpose","unpackedOutputShape","reverseFunc","depthToSpace","parseDepthToSpaceAttributes","init_depth_to_space","blocksize","blocksizeSqr","transposePerm","firstReshapeShape","firstReshapedTensor","transposeAttributes","transposeOutput","secondReshapeShape","mode","flatten","parseFlattenAttributes","init_flatten","r","NUMBER_TYPES","init_operators","gather","parseGatherAttributes","gatherProgramMetadata","createGatherProgramInfo","createGatherProgramInfoLoader","init_gather","indexDataShape","indexCopyOps","orank","irank","iDrank","gemm","parseGemmAttributes","parseGemmAttributesV7","parseGemmAttributesV11","createGemmProgramInfoLoader","createGemmProgramInfo","init_gemm","isOptionalC","transA","transB","beta","line","declareC","broadcastC","calculateC","imageScaler","parseImageScalerAttributes","imageScalerProgramMetadata","createImageScalerProgramInfo","createImageScalerProgramInfoLoader","createGetBiasMethod","init_image_scaler","bias","numChannels","instanceNormalization","parseInstanceNormalizationAttributes","meanAndVarianceProgramMetadata","createMeanAndVarianceProgramInfo","createMeanAndVarianceProgramInfoLoader","computeOutputProgramMetadata","createComputeOutputProgramInfo","createComputeOutputProgramInfoLoader","init_instance_normalization","meanAndVariance","xDims","channelSize","meanAndVarianceShape","textureWidth","textureHeight","meanAndVarianceWidth","meanAndVarianceHeight","createLrnProgramInfo","C","from","lrnProgramMetadata","createLrnProgramInfoLoader","lrn","parseLrnAttributes","init_lrn","padProgramMetadata","padV2","parsePadAttributesV2","padV11","parsePadAttributesV11","generatePadAttributesFromInputs","createPadProgramInfo","validateInputsV2","validateInputsV11","getPadFunction","getPadConstant","getPadReflect","getPadEdge","init_pad","attrubutes","block","averagePool","parseAveragePoolAttributes","createAveragePoolProgramInfo","globalAveragePool","parseGlobalAveragePoolAttributes","maxPool","parseMaxPoolAttributes","createMaxPoolProgramInfo","getAdjustedPoolAttributesAndOutputShape","globalMaxPoolAttributes","globalMaxPoolMetadata","globalMaxPool","generatePoolingCode","copyArray","offsetToIndices","init_pool","ceilMode","countIncludePad","op1","op2","storageOrder","hasDilations","kw","sw","pwStart","pwEnd","dimW","codeW","codeH","codeHEnd","kh","sh","phStart","phEnd","dimH","kernelStrides","stridesRank","padsRank","offsetToIndicesFunction","copyInputDims","copyPads","copyKernelStrides","copyStrides","hasPads","sum","cur","padCode","arrayName","reduce","parseReduceAttributes","createReduceProgramInfo","reduceSum","reduceMean","reduceMax","reduceMin","reduceProd","reduceLogSum","reduceLogSumSquare","init_reduce","reduceOp","reduceProgramMetadata","keepDims","_name","iRank","idxCopy","ops","reduceOps","idxZero","reshape","init_reshape","upsampleProgramMetadata","upsample","parseUpsampleAttributesV7","parseUpsampleAttributesV9","parseUpsampleAttributes","createUpsampleProgramInfo","scalesValidation","init_upsample","isResize","scales","extrapolationValue","coordinateTransformMode","needRoiInput","useExtrapolation","nearestMode","cubicCoefficientA","excludeOutside","useNearest2xOptimization","roiInputIdx","scalesInputIdx","sizesInputIdx","inputWidth","inputHeight","outputWidth","outputHeight","outputPitches","inputPitches","precalculatedPitches","getInputFloatFunction","resizeProgramMetadata","resize","parseResizeAttributesV10","parseResizeAttributesV11","createPackedResizeProgramInfo","prepareInputs","parseScalesData","parseScalesDataFromOutputSize","init_resize_packed","scalesHeight","scalesWidth","getSourceFracIndex","outputSizes","scalesTensor","sizesTensor","yDims","init_shape","sliceProgramMetadata","parseSliceAttributes","createSliceProgramInfo","sliceV10","generateSliceAttributesFromInputs","validateInputsV10","init_slice","starts","ends","_val","normalizedAxes","sliceOps","softmaxComputeMaxProgramMetadata","softmaxComputeScaleProgramMetadata","softmaxProgramMetadata","softmax","parseSoftmaxAttributes","parseSoftmaxAttributesV13","softmaxV13","computeSoftmax","createComputeMaxProgramInfo","createComputScaleProgramInfo","createSoftMaxProgramInfo","init_softmax","logicalRowCount","featureCount","isTransposeRequired","transposedInputShape","transposedInputs","transposeAttribute","_","computeMaxProgramInfo","computeScaleProgramInfo","softMaxProgramInfo","maxElementPerLogicalRow","normalizationPerLogicalRow","splitProgramMetadata","parseSplitAttributes","getProgramCount","createSplitProgramInfo","init_split","squeeze","squeezeV13","parseSqueezeAttributes","validateInputsV13","init_squeeze","createSumProgramInfo","init_sum","sumProgramMetadata","tile","createTileProgramInfo","init_tile","tileProgramMetadata","tileOps","unsqueeze","unsqueezeV13","parseUnsqueezeAttributes","init_unsqueeze","WEBGL_OP_RESOLVE_RULES","init_op_resolve_rules","replaceInlines","script","inlineDefs","match","INLINE_FUNC_DEF_REGEX","tokens","regexString","FUNC_CALL_REGEX","regex","variable","declLine","newBody","paramRedecLine","replacement","init_glsl_function_inliner","squeezeShape","newShape","isEmptyArray","parseAxisParam","ax","isInt","sizeFromShape","sizeToSquarishShape","PreferLogicalStrategy","init_texture_layout_strategy","maxTextureSize","wh","wsize","hsize","logShape","_d","CoordsGlslLib","init_glsl_coordinate_lib","funcName","outputLayout","outTexShape","floatTextureSetRGBASource","floatTextureSetRGBAFuncName","floatTextureSetRSource","floatTextureSetRFuncName","_shape","texShape","packedTexShape","texelsInLogicalRow","texelsInBatch","texelsInBatchN","batches","coordsToCompute","coordsFromIndexSnippet","inputLayout","outCoordFuncName","texFuncSnippet","broadcastDims","fields","isOutputScalar","swapLastDimsSnippet","inTexShape","texNumR","texNumC","packedSampler","valuesPerRow","newInputLayout","samplerRoutine","tNumR","tNumC","stride0","stride1","routine","revDims","stride2","stride3","stride4","xScale","yScale","stridesBlock","body","varName","EncodingGlslLib","init_glsl_encoding_lib","_EncodingGlslLib","endianness","FragColorGlslLib","init_glsl_fragcolor_lib","ShapeUtilsGlslLib","init_glsl_shape_utils_lib","_ShapeUtilsGlslLib","shapeInit","VecGlslLib","init_glsl_vec_lib","nameOp","assignmentBlock","glslRegistry","init_glsl_registered_libs","GlslPreprocessor","init_glsl_preprocessor","lib","map","libName","routinesInLib","currentNode","routinesIncluded","routines","classAndRoutine","samplers","variables","uniformLines","sampler","ProgramManager","init_program_manager","profiler","buildArtifact","preprocessor","fragScript","fragShaderScript","vertexShaderScript","fragShader","attribLocations","positionHandle","textureCoordHandle","uniformLocations","textures","texturePosition","location","arrayLength","uniformHandle","reference","TextureManager","init_texture_manager","layoutStrategy","textureDataType","encoder","inUseTextures","idleTextures","subscribers","tensorData","deleteTexture","_dataType","WebGLSessionHandler","init_session_handler","graph","initializers","linearSearchLastTrue","arr","WebGLContext","init_webgl_context","vertexShader","shaderType","shader","unit","geometry","fb","internalFormat","frameBuffer","isComplete","fragmentShader","gl2","ext","query","available","disjoint","timeElapsed","fenceContext","isFencePassed","status","resolveFn","isDoneFn","createWebGLContext","contextId","offscreenCanvas","createOffscreenCanvas","createNewWebGLContext","contextAttributes","ca","init_webgl_context_factory","WebGLBackend","init_backend_webgl","resolveBackend","hint","hints","backendHint","backendsCache","tryLoadBackend","backendObj","isBackend","init","o","KernelOp","ExecutionPlan","init_execution_plan","resolved","sessionHandler","modelInputs","graphInputs","sequence","graphValues","rear","thisOpIndex","thisOp","inputList","inputTensors","outputList","downstreamNodes","_output","currentDownstreamNodeIndex","currentDownstreamNode","outputIndex","outputTensor","init_attribute","_Attribute","attr","valueAndType","attrType","numberValue","maybeLong","ints","strings","tensors","Value","GraphImpl","init_graph","graphProto","initializer","valueInfo","_nodeProto","graphInitializer","dataIndices","nodesIndices","inputValueNames","currentIndex","nodeProto","pick","dataIndex","inputName","outputName","starters","nodesStack","nodesState","outgoingEdgeIndex","downstreamNodeIndex","newIndices","nodePossition","ind","currentData","inputValueIndex","outputValueIndex","nodesConsumingOutput","delIndex","replaceIndex","next","child","init_model","isOrtFormat","onnxError","modelProto","ortModel","opsetId","Session","init_session","arg","modelProtoBlob","outputTensors","modelInputNames","sortedInputs","sortedInputsIndex","modelInputIndices","modelValues","graphInputDims","graphInput","graphInputTypes","givenInputs","expectedType","actualType","noneDimSupported","expectedDims","actualDims","modelOutputNames","OnnxjsSessionHandler","init_session_handler_inference","_fetches","_options","inputMap","feed","outputMap","backend_onnxjs_exports","onnxjsBackend","OnnxjsBackend","init_backend_onnxjs","pathOrBuffer","init_wasm_utils_env","main_exports","main_default","WORKER_NAME","isProxyWorker","init_main","init_wasm_core_impl","init_wasm_factory","init_wasm_utils_import","ev","initializeWebAssembly","initRuntime","epName","initEp","bufferData","copyFromExternalBuffer","model","createSession","sessionMetadata","releaseSession","sessionId","inputIndices","run","outputs","extractTransferableBuffers","endProfiling","urlOverride","scriptSrc","origin","isSameOrigin","normalizeUrl","fallbackUrl","preload","dynamicImportDefault","createProxyWorker","importProxyWorker","importWasmModule","filename","prefixOverride","baseUrl","absoluteUrl","blob","url","isMultiThreaded","wasmModuleFilename","wasmModuleUrl","needPreload","initialized","initializing","aborted","isMultiThreadSupported","isSimdSupported","getInstance","flags","timeout","numThreads","multiThreadSupported","wasmPaths","wasmPrefixOverride","mjsPathOverrideFlag","mjsPathOverride","wasmPathOverrideFlag","wasmPathOverride","wasmBinaryOverride","objectUrl","ortWasmFactory","isTimeout","tasks","fileName","scriptDirectory","what","allocWasmString","iterateExtraOptions","checkLastError","init_wasm_utils","allocs","dataLength","dataOffset","prefix","seen","paramsOffset","errorCode","errorMessagePointer","errorMessage","setRunOptions","init_run_options","runOptionsHandle","runOptions","tagDataOffset","keyDataOffset","valueDataOffset","getGraphOptimzationLevel","getExecutionMode","appendDefaultOptions","setExecutionProviders","setSessionOptions","init_session_options","graphOptimizationLevel","executionMode","ep","sessionOptionsHandle","executionProviders","webgpuOptions","epNameDataOffset","logIdDataOffset","logSeverityLevel","logVerbosityLevel","optimizedModelFilePathOffset","tensorDataTypeStringToEnum","tensorDataTypeEnumToString","calculateTensorSizeInBytes","tensorTypeToTypedArrayConstructor","logLevelStringToEnum","isGpuBufferSupportedType","dataLocationStringToEnum","init_wasm_common","dateType","dimsOrSize","logLevel","loadFile","init_wasm_utils_load_file","file","readFile","createReadStream","stream","chunks","contentLengthHeader","fileSize","pages","done","chunkSize","initOrt","activeSessions","getSessionInputOutputCount","prepareInputOutputTensor","loggingLevel","sessionHandle","modelDataOffset","modelData","modelDataLength","ioBindingHandle","inputNamesUTF8Encoded","outputNamesUTF8Encoded","loadingPromises","path","provider","webnnOptions","gpuDevice","powerPreference","outputCount","enableGraphCapture","outputPreferredLocations","nameString","bindingState","ioBindingState","tensorHandles","rawData","dataByteLength","registerBuffer","dimIndex","inputOutputBound","runOptionsAllocs","inputTensorHandles","outputTensorHandles","inputOutputAllocs","beforeRunStack","inputValuesOffset","inputNamesOffset","outputValuesOffset","outputNamesOffset","inputValuesIndex","inputNamesIndex","outputValuesIndex","outputNamesIndex","beforeGetTensorDataStack","tensorDataOffset","keepOutputTensor","tensorDataIndex","dimsLength","preferredLocation","stringData","maxBytesToRead","getBuffer","bufferSize","profileFileName","buffers","isProxy","proxyWorker","temporaryObjectUrl","initWasmCallbacks","queuedCallbacks","enqueueCallbacks","ensureWorker","onProxyWorkerMessage","initializeWebAssemblyAndOrtRuntime","initializeOrtEp","init_proxy_wrapper","callbacks","queue","worker","transferable","serializableInputs","encodeTensorMetadata","decodeTensorMetadata","OnnxruntimeWebAssemblySessionHandler","getName","inputArray","kvp","outputArray","resultMap","initializeFlags","OnnxruntimeWebAssemblyBackend","init_backend_wasm","numCpuLogicalCores","backend_wasm_inference_exports","wasmBackend","init_backend_wasm_inference","lib_default"],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Backend } from './backend.js';\nimport { InferenceSession } from './inference-session.js';\n\ninterface BackendInfo {\n  backend: Backend;\n  priority: number;\n\n  initPromise?: Promise<void>;\n  initialized?: boolean;\n  aborted?: boolean;\n  error?: string;\n}\n\nconst backends: Map<string, BackendInfo> = new Map();\nconst backendsSortedByPriority: string[] = [];\n\n/**\n * Register a backend.\n *\n * @param name - the name as a key to lookup as an execution provider.\n * @param backend - the backend object.\n * @param priority - an integer indicating the priority of the backend. Higher number means higher priority. if priority\n * < 0, it will be considered as a 'beta' version and will not be used as a fallback backend by default.\n *\n * @ignore\n */\nexport const registerBackend = (name: string, backend: Backend, priority: number): void => {\n  if (backend && typeof backend.init === 'function' && typeof backend.createInferenceSessionHandler === 'function') {\n    const currentBackend = backends.get(name);\n    if (currentBackend === undefined) {\n      backends.set(name, { backend, priority });\n    } else if (currentBackend.priority > priority) {\n      // same name is already registered with a higher priority. skip registeration.\n      return;\n    } else if (currentBackend.priority === priority) {\n      if (currentBackend.backend !== backend) {\n        throw new Error(`cannot register backend \"${name}\" using priority ${priority}`);\n      }\n    }\n\n    if (priority >= 0) {\n      const i = backendsSortedByPriority.indexOf(name);\n      if (i !== -1) {\n        backendsSortedByPriority.splice(i, 1);\n      }\n\n      for (let i = 0; i < backendsSortedByPriority.length; i++) {\n        if (backends.get(backendsSortedByPriority[i])!.priority <= priority) {\n          backendsSortedByPriority.splice(i, 0, name);\n          return;\n        }\n      }\n      backendsSortedByPriority.push(name);\n    }\n    return;\n  }\n\n  throw new TypeError('not a valid backend');\n};\n\n/**\n * Try to resolve and initialize a backend.\n *\n * @param backendName - the name of the backend.\n * @returns the backend instance if resolved and initialized successfully, or an error message if failed.\n */\nconst tryResolveAndInitializeBackend = async (backendName: string): Promise<Backend | string> => {\n  const backendInfo = backends.get(backendName);\n  if (!backendInfo) {\n    return 'backend not found.';\n  }\n\n  if (backendInfo.initialized) {\n    return backendInfo.backend;\n  } else if (backendInfo.aborted) {\n    return backendInfo.error!;\n  } else {\n    const isInitializing = !!backendInfo.initPromise;\n    try {\n      if (!isInitializing) {\n        backendInfo.initPromise = backendInfo.backend.init(backendName);\n      }\n      await backendInfo.initPromise;\n      backendInfo.initialized = true;\n      return backendInfo.backend;\n    } catch (e) {\n      if (!isInitializing) {\n        backendInfo.error = `${e}`;\n        backendInfo.aborted = true;\n      }\n      return backendInfo.error!;\n    } finally {\n      delete backendInfo.initPromise;\n    }\n  }\n};\n\n/**\n * Resolve execution providers from the specific session options.\n *\n * @param options - the session options object.\n * @returns a promise that resolves to a tuple of an initialized backend instance and a session options object with\n * filtered EP list.\n *\n * @ignore\n */\nexport const resolveBackendAndExecutionProviders = async (\n  options: InferenceSession.SessionOptions,\n): Promise<[backend: Backend, options: InferenceSession.SessionOptions]> => {\n  // extract backend hints from session options\n  const eps = options.executionProviders || [];\n  const backendHints = eps.map((i) => (typeof i === 'string' ? i : i.name));\n  const backendNames = backendHints.length === 0 ? backendsSortedByPriority : backendHints;\n\n  // try to resolve and initialize all requested backends\n  let backend: Backend | undefined;\n  const errors = [];\n  const availableBackendNames = new Set<string>();\n  for (const backendName of backendNames) {\n    const resolveResult = await tryResolveAndInitializeBackend(backendName);\n    if (typeof resolveResult === 'string') {\n      errors.push({ name: backendName, err: resolveResult });\n    } else {\n      if (!backend) {\n        backend = resolveResult;\n      }\n      if (backend === resolveResult) {\n        availableBackendNames.add(backendName);\n      }\n    }\n  }\n\n  // if no backend is available, throw error.\n  if (!backend) {\n    throw new Error(`no available backend found. ERR: ${errors.map((e) => `[${e.name}] ${e.err}`).join(', ')}`);\n  }\n\n  // for each explicitly requested backend, if it's not available, output warning message.\n  for (const { name, err } of errors) {\n    if (backendHints.includes(name)) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        `removing requested execution provider \"${name}\" from session options because it is not available: ${err}`,\n      );\n    }\n  }\n\n  const filteredEps = eps.filter((i) => availableBackendNames.has(typeof i === 'string' ? i : i.name));\n\n  return [\n    backend,\n    new Proxy(options, {\n      get: (target, prop) => {\n        if (prop === 'executionProviders') {\n          return filteredEps;\n        }\n        return Reflect.get(target, prop);\n      },\n    }),\n  ];\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { InferenceSession } from './inference-session.js';\nimport { OnnxValue } from './onnx-value.js';\nimport { TrainingSession } from './training-session.js';\n\n/**\n * @ignore\n */\nexport declare namespace SessionHandler {\n  type FeedsType = { [name: string]: OnnxValue };\n  type FetchesType = { [name: string]: OnnxValue | null };\n  type ReturnType = { [name: string]: OnnxValue };\n}\n\n/**\n * Represents shared SessionHandler functionality\n *\n * @ignore\n */\ninterface SessionHandler {\n  dispose(): Promise<void>;\n\n  readonly inputNames: readonly string[];\n  readonly outputNames: readonly string[];\n}\n\n/**\n * Represent a handler instance of an inference session.\n *\n * @ignore\n */\nexport interface InferenceSessionHandler extends SessionHandler {\n  startProfiling(): void;\n  endProfiling(): void;\n\n  run(\n    feeds: SessionHandler.FeedsType,\n    fetches: SessionHandler.FetchesType,\n    options: InferenceSession.RunOptions,\n  ): Promise<SessionHandler.ReturnType>;\n}\n\n/**\n * Represent a handler instance of a training inference session.\n *\n * @ignore\n */\nexport interface TrainingSessionHandler extends SessionHandler {\n  readonly evalInputNames: readonly string[];\n  readonly evalOutputNames: readonly string[];\n\n  lazyResetGrad(): Promise<void>;\n  runTrainStep(\n    feeds: SessionHandler.FeedsType,\n    fetches: SessionHandler.FetchesType,\n    options: InferenceSession.RunOptions,\n  ): Promise<SessionHandler.ReturnType>;\n  runOptimizerStep(options: InferenceSession.RunOptions): Promise<void>;\n  runEvalStep(\n    feeds: SessionHandler.FeedsType,\n    fetches: SessionHandler.FetchesType,\n    options: InferenceSession.RunOptions,\n  ): Promise<SessionHandler.ReturnType>;\n\n  getParametersSize(trainableOnly: boolean): Promise<number>;\n  loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise<void>;\n  getContiguousParameters(trainableOnly: boolean): Promise<OnnxValue>;\n}\n\n/**\n * Represent a backend that provides implementation of model inferencing.\n *\n * @ignore\n */\nexport interface Backend {\n  /**\n   * Initialize the backend asynchronously. Should throw when failed.\n   */\n  init(backendName: string): Promise<void>;\n\n  createInferenceSessionHandler(\n    uriOrBuffer: string | Uint8Array,\n    options?: InferenceSession.SessionOptions,\n  ): Promise<InferenceSessionHandler>;\n\n  createTrainingSessionHandler?(\n    checkpointStateUriOrBuffer: TrainingSession.UriOrBuffer,\n    trainModelUriOrBuffer: TrainingSession.UriOrBuffer,\n    evalModelUriOrBuffer: TrainingSession.UriOrBuffer,\n    optimizerModelUriOrBuffer: TrainingSession.UriOrBuffer,\n    options: InferenceSession.SessionOptions,\n  ): Promise<TrainingSessionHandler>;\n}\n\nexport { registerBackend } from './backend-impl.js';\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.20.0-dev.20240827-5d54dc1462';\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Env } from './env.js';\nimport { version } from './version.js';\n\ntype LogLevelType = Env['logLevel'];\n\nlet logLevelValue: Required<LogLevelType> = 'warning';\n\nexport const env: Env = {\n  wasm: {} as Env.WebAssemblyFlags,\n  webgl: {} as Env.WebGLFlags,\n  webgpu: {} as Env.WebGpuFlags,\n  versions: { common: version },\n\n  set logLevel(value: LogLevelType) {\n    if (value === undefined) {\n      return;\n    }\n    if (typeof value !== 'string' || ['verbose', 'info', 'warning', 'error', 'fatal'].indexOf(value) === -1) {\n      throw new Error(`Unsupported logging level: ${value}`);\n    }\n    logLevelValue = value;\n  },\n  get logLevel(): Required<LogLevelType> {\n    return logLevelValue;\n  },\n};\n\n// set property 'logLevel' so that they can be correctly transferred to worker by `postMessage()`.\nObject.defineProperty(env, 'logLevel', { enumerable: true });\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { env as envImpl } from './env-impl.js';\n\nexport declare namespace Env {\n  export type WasmPathPrefix = string;\n  export interface WasmFilePaths {\n    /**\n     * Specify the override path for the main .wasm file.\n     *\n     * This path should be an absolute path.\n     *\n     * If not modified, the filename of the .wasm file is:\n     * - `ort-wasm-simd-threaded.wasm` for default build\n     * - `ort-wasm-simd-threaded.jsep.wasm` for JSEP build (with WebGPU and WebNN)\n     * - `ort-training-wasm-simd-threaded.wasm` for training build\n     */\n    wasm?: URL | string;\n    /**\n     * Specify the override path for the main .mjs file.\n     *\n     * This path should be an absolute path.\n     *\n     * If not modified, the filename of the .mjs file is:\n     * - `ort-wasm-simd-threaded.mjs` for default build\n     * - `ort-wasm-simd-threaded.jsep.mjs` for JSEP build (with WebGPU and WebNN)\n     * - `ort-training-wasm-simd-threaded.mjs` for training build\n     */\n    mjs?: URL | string;\n  }\n  export type WasmPrefixOrFilePaths = WasmPathPrefix | WasmFilePaths;\n  export interface WebAssemblyFlags {\n    /**\n     * set or get number of thread(s). If omitted or set to 0, number of thread(s) will be determined by system. If set\n     * to 1, no worker thread will be spawned.\n     *\n     * This setting is available only when WebAssembly multithread feature is available in current context.\n     *\n     * @defaultValue `0`\n     */\n    numThreads?: number;\n\n    /**\n     * set or get a boolean value indicating whether to enable SIMD. If set to false, SIMD will be forcely disabled.\n     *\n     * This setting is available only when WebAssembly SIMD feature is available in current context.\n     *\n     * @deprecated This property is deprecated. Since SIMD is supported by all major JavaScript engines, non-SIMD\n     * build is no longer provided. This property will be removed in future release.\n     * @defaultValue `true`\n     */\n    simd?: boolean;\n\n    /**\n     * set or get a boolean value indicating whether to enable trace.\n     *\n     * @deprecated Use `env.trace` instead. If `env.trace` is set, this property will be ignored.\n     * @defaultValue `false`\n     */\n    trace?: boolean;\n\n    /**\n     * Set or get a number specifying the timeout for initialization of WebAssembly backend, in milliseconds. A zero\n     * value indicates no timeout is set.\n     *\n     * @defaultValue `0`\n     */\n    initTimeout?: number;\n\n    /**\n     * Set a custom URL prefix to the .wasm/.mjs files, or an object of overrides for both .wasm/.mjs file. The override\n     * path should be an absolute path.\n     */\n    wasmPaths?: WasmPrefixOrFilePaths;\n\n    /**\n     * Set a custom buffer which contains the WebAssembly binary. If this property is set, the `wasmPaths` property will\n     * be ignored.\n     */\n    wasmBinary?: ArrayBufferLike | Uint8Array;\n\n    /**\n     * Set or get a boolean value indicating whether to proxy the execution of main thread to a worker thread.\n     *\n     * @defaultValue `false`\n     */\n    proxy?: boolean;\n  }\n\n  export interface WebGLFlags {\n    /**\n     * Set or get the WebGL Context ID (webgl or webgl2).\n     *\n     * @defaultValue `'webgl2'`\n     */\n    contextId?: 'webgl' | 'webgl2';\n    /**\n     * Get the WebGL rendering context.\n     */\n    readonly context: WebGLRenderingContext;\n    /**\n     * Set or get the maximum batch size for matmul. 0 means to disable batching.\n     *\n     * @deprecated\n     */\n    matmulMaxBatchSize?: number;\n    /**\n     * Set or get the texture cache mode.\n     *\n     * @defaultValue `'full'`\n     */\n    textureCacheMode?: 'initializerOnly' | 'full';\n    /**\n     * Set or get the packed texture mode\n     *\n     * @defaultValue `false`\n     */\n    pack?: boolean;\n    /**\n     * Set or get whether enable async download.\n     *\n     * @defaultValue `false`\n     */\n    async?: boolean;\n  }\n\n  export interface WebGpuProfilingDataV1TensorMetadata {\n    dims: readonly number[];\n    dataType: string;\n  }\n  export interface WebGpuProfilingDataV1 {\n    version: 1;\n    inputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n    outputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n    kernelId: number;\n    kernelType: string;\n    kernelName: string;\n    programName: string;\n    startTime: number;\n    endTime: number;\n  }\n\n  export type WebGpuProfilingData = WebGpuProfilingDataV1;\n\n  export interface WebGpuFlags {\n    /**\n     * Set or get the profiling mode.\n     *\n     * @deprecated Use `env.webgpu.profiling.mode` instead. If `env.webgpu.profiling.mode` is set, this property will be\n     * ignored.\n     */\n    profilingMode?: 'off' | 'default';\n    /**\n     * Set or get the profiling configuration.\n     */\n    profiling?: {\n      /**\n       * Set or get the profiling mode.\n       *\n       * @defaultValue `'off'`\n       */\n      mode?: 'off' | 'default';\n\n      /**\n       * Set or get a callback function when a profiling data is received. If not set, the profiling data will be\n       * printed to console.\n       */\n      ondata?: (data: WebGpuProfilingData) => void;\n    };\n    /**\n     * Set or get the power preference.\n     *\n     * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n     * used as options for `navigator.gpu.requestAdapter()`.\n     *\n     * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n     *\n     * @defaultValue `undefined`\n     */\n    powerPreference?: 'low-power' | 'high-performance';\n    /**\n     * Set or get the force fallback adapter flag.\n     *\n     * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n     * used as options for `navigator.gpu.requestAdapter()`.\n     *\n     * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n     *\n     * @defaultValue `undefined`\n     */\n    forceFallbackAdapter?: boolean;\n    /**\n     * Set or get the adapter for WebGPU.\n     *\n     * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n     * used as the GPU adapter for the underlying WebGPU backend to create GPU device.\n     *\n     * If this property is not set, it will be available to get after the first WebGPU inference session is created. The\n     * value will be the GPU adapter that created by the underlying WebGPU backend.\n     *\n     * When use with TypeScript, the type of this property is `GPUAdapter` defined in \"@webgpu/types\".\n     * Use `const adapter = env.webgpu.adapter as GPUAdapter;` in TypeScript to access this property with correct type.\n     *\n     * see comments on {@link Tensor.GpuBufferType}\n     */\n    adapter: unknown;\n    /**\n     * Get the device for WebGPU.\n     *\n     * This property is only available after the first WebGPU inference session is created.\n     *\n     * When use with TypeScript, the type of this property is `GPUDevice` defined in \"@webgpu/types\".\n     * Use `const device = env.webgpu.device as GPUDevice;` in TypeScript to access this property with correct type.\n     *\n     * see comments on {@link Tensor.GpuBufferType} for more details about why not use types defined in \"@webgpu/types\".\n     */\n    readonly device: unknown;\n    /**\n     * Set or get whether validate input content.\n     *\n     * @defaultValue `false`\n     */\n    validateInputContent?: boolean;\n  }\n}\n\nexport interface Env {\n  /**\n   * set the severity level for logging.\n   *\n   * @defaultValue `'warning'`\n   */\n  logLevel?: 'verbose' | 'info' | 'warning' | 'error' | 'fatal';\n\n  /**\n   * Indicate whether run in debug mode.\n   *\n   * @defaultValue `false`\n   */\n  debug?: boolean;\n\n  /**\n   * set or get a boolean value indicating whether to enable trace.\n   *\n   * @defaultValue `false`\n   */\n  trace?: boolean;\n\n  /**\n   * Get version of the current package.\n   */\n  readonly versions: {\n    readonly common: string;\n    readonly web?: string;\n    readonly node?: string;\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    readonly 'react-native'?: string;\n  };\n\n  /**\n   * Represent a set of flags for WebAssembly\n   */\n  readonly wasm: Env.WebAssemblyFlags;\n\n  /**\n   * Represent a set of flags for WebGL\n   */\n  readonly webgl: Env.WebGLFlags;\n\n  /**\n   * Represent a set of flags for WebGPU\n   */\n  readonly webgpu: Env.WebGpuFlags;\n\n  [name: string]: unknown;\n}\n\n/**\n * Represent a set of flags as a global singleton.\n */\nexport const env: Env = envImpl;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { TensorToDataUrlOptions, TensorToImageDataOptions } from './tensor-conversion.js';\nimport { Tensor } from './tensor.js';\n\n/**\n * implementation of Tensor.toDataURL()\n */\nexport const tensorToDataURL = (tensor: Tensor, options?: TensorToDataUrlOptions): string => {\n  const canvas = typeof document !== 'undefined' ? document.createElement('canvas') : new OffscreenCanvas(1, 1);\n  canvas.width = tensor.dims[3];\n  canvas.height = tensor.dims[2];\n  const pixels2DContext = canvas.getContext('2d') as\n    | CanvasRenderingContext2D\n    | OffscreenCanvasRenderingContext2D\n    | null;\n\n  if (pixels2DContext != null) {\n    // Default values for height and width & format\n    let width: number;\n    let height: number;\n    if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n      width = tensor.dims[2];\n      height = tensor.dims[3];\n    } else {\n      // Default layout is NCWH\n      width = tensor.dims[3];\n      height = tensor.dims[2];\n    }\n\n    const inputformat = options?.format !== undefined ? options.format : 'RGB';\n\n    const norm = options?.norm;\n    let normMean: [number, number, number, number];\n    let normBias: [number, number, number, number];\n    if (norm === undefined || norm.mean === undefined) {\n      normMean = [255, 255, 255, 255];\n    } else {\n      if (typeof norm.mean === 'number') {\n        normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n      } else {\n        normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 0];\n        if (norm.mean[3] !== undefined) {\n          normMean[3] = norm.mean[3];\n        }\n      }\n    }\n    if (norm === undefined || norm.bias === undefined) {\n      normBias = [0, 0, 0, 0];\n    } else {\n      if (typeof norm.bias === 'number') {\n        normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n      } else {\n        normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n        if (norm.bias[3] !== undefined) {\n          normBias[3] = norm.bias[3];\n        }\n      }\n    }\n\n    const stride = height * width;\n    // Default pointer assignments\n    let rTensorPointer = 0,\n      gTensorPointer = stride,\n      bTensorPointer = stride * 2,\n      aTensorPointer = -1;\n\n    // Updating the pointer assignments based on the input image format\n    if (inputformat === 'RGBA') {\n      rTensorPointer = 0;\n      gTensorPointer = stride;\n      bTensorPointer = stride * 2;\n      aTensorPointer = stride * 3;\n    } else if (inputformat === 'RGB') {\n      rTensorPointer = 0;\n      gTensorPointer = stride;\n      bTensorPointer = stride * 2;\n    } else if (inputformat === 'RBG') {\n      rTensorPointer = 0;\n      bTensorPointer = stride;\n      gTensorPointer = stride * 2;\n    }\n\n    for (let i = 0; i < height; i++) {\n      for (let j = 0; j < width; j++) {\n        const R = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n        const G = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n        const B = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n        const A = aTensorPointer === -1 ? 255 : ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n        // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n        pixels2DContext.fillStyle = 'rgba(' + R + ',' + G + ',' + B + ',' + A + ')';\n        pixels2DContext.fillRect(j, i, 1, 1);\n      }\n    }\n    if ('toDataURL' in canvas) {\n      return canvas.toDataURL();\n    } else {\n      throw new Error('toDataURL is not supported');\n    }\n  } else {\n    throw new Error('Can not access image data');\n  }\n};\n\n/**\n * implementation of Tensor.toImageData()\n */\nexport const tensorToImageData = (tensor: Tensor, options?: TensorToImageDataOptions): ImageData => {\n  const pixels2DContext =\n    typeof document !== 'undefined'\n      ? document.createElement('canvas').getContext('2d')\n      : (new OffscreenCanvas(1, 1).getContext('2d') as OffscreenCanvasRenderingContext2D);\n  let image: ImageData;\n  if (pixels2DContext != null) {\n    // Default values for height and width & format\n    let width: number;\n    let height: number;\n    let channels: number;\n    if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n      width = tensor.dims[2];\n      height = tensor.dims[1];\n      channels = tensor.dims[3];\n    } else {\n      // Default layout is NCWH\n      width = tensor.dims[3];\n      height = tensor.dims[2];\n      channels = tensor.dims[1];\n    }\n    const inputformat = options !== undefined ? (options.format !== undefined ? options.format : 'RGB') : 'RGB';\n\n    const norm = options?.norm;\n    let normMean: [number, number, number, number];\n    let normBias: [number, number, number, number];\n    if (norm === undefined || norm.mean === undefined) {\n      normMean = [255, 255, 255, 255];\n    } else {\n      if (typeof norm.mean === 'number') {\n        normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n      } else {\n        normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 255];\n        if (norm.mean[3] !== undefined) {\n          normMean[3] = norm.mean[3];\n        }\n      }\n    }\n    if (norm === undefined || norm.bias === undefined) {\n      normBias = [0, 0, 0, 0];\n    } else {\n      if (typeof norm.bias === 'number') {\n        normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n      } else {\n        normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n        if (norm.bias[3] !== undefined) {\n          normBias[3] = norm.bias[3];\n        }\n      }\n    }\n\n    const stride = height * width;\n    if (options !== undefined) {\n      if (\n        (options.format !== undefined && channels === 4 && options.format !== 'RGBA') ||\n        (channels === 3 && options.format !== 'RGB' && options.format !== 'BGR')\n      ) {\n        throw new Error(\"Tensor format doesn't match input tensor dims\");\n      }\n    }\n\n    // Default pointer assignments\n    const step = 4;\n    let rImagePointer = 0,\n      gImagePointer = 1,\n      bImagePointer = 2,\n      aImagePointer = 3;\n    let rTensorPointer = 0,\n      gTensorPointer = stride,\n      bTensorPointer = stride * 2,\n      aTensorPointer = -1;\n\n    // Updating the pointer assignments based on the input image format\n    if (inputformat === 'RGBA') {\n      rTensorPointer = 0;\n      gTensorPointer = stride;\n      bTensorPointer = stride * 2;\n      aTensorPointer = stride * 3;\n    } else if (inputformat === 'RGB') {\n      rTensorPointer = 0;\n      gTensorPointer = stride;\n      bTensorPointer = stride * 2;\n    } else if (inputformat === 'RBG') {\n      rTensorPointer = 0;\n      bTensorPointer = stride;\n      gTensorPointer = stride * 2;\n    }\n\n    image = pixels2DContext.createImageData(width, height);\n\n    for (\n      let i = 0;\n      i < height * width;\n      rImagePointer += step, gImagePointer += step, bImagePointer += step, aImagePointer += step, i++\n    ) {\n      image.data[rImagePointer] = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n      image.data[gImagePointer] = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n      image.data[bImagePointer] = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n      image.data[aImagePointer] =\n        aTensorPointer === -1 ? 255 : ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n    }\n  } else {\n    throw new Error('Can not access image data');\n  }\n  return image;\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n  OptionsDimensions,\n  OptionsFormat,\n  OptionsNormalizationParameters,\n  OptionsTensorFormat,\n  OptionsTensorLayout,\n  TensorFromGpuBufferOptions,\n  TensorFromImageBitmapOptions,\n  TensorFromImageDataOptions,\n  TensorFromImageElementOptions,\n  TensorFromTextureOptions,\n  TensorFromUrlOptions,\n} from './tensor-factory.js';\nimport { Tensor } from './tensor-impl.js';\nimport { Tensor as TensorInterface } from './tensor.js';\n\ninterface BufferToTensorOptions\n  extends OptionsDimensions,\n    OptionsTensorLayout,\n    OptionsNormalizationParameters,\n    OptionsFormat,\n    OptionsTensorFormat {}\n\n/**\n * Create a new tensor object from image object\n *\n * @param buffer - Extracted image buffer data - assuming RGBA format\n * @param imageFormat - input image configuration - required configurations height, width, format\n * @param tensorFormat - output tensor configuration - Default is RGB format\n */\nexport const bufferToTensor = (buffer: Uint8ClampedArray | undefined, options: BufferToTensorOptions): Tensor => {\n  if (buffer === undefined) {\n    throw new Error('Image buffer must be defined');\n  }\n  if (options.height === undefined || options.width === undefined) {\n    throw new Error('Image height and width must be defined');\n  }\n  if (options.tensorLayout === 'NHWC') {\n    throw new Error('NHWC Tensor layout is not supported yet');\n  }\n\n  const { height, width } = options;\n\n  const norm = options.norm ?? { mean: 255, bias: 0 };\n  let normMean: [number, number, number, number];\n  let normBias: [number, number, number, number];\n\n  if (typeof norm.mean === 'number') {\n    normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n  } else {\n    normMean = [norm.mean![0], norm.mean![1], norm.mean![2], norm.mean![3] ?? 255];\n  }\n\n  if (typeof norm.bias === 'number') {\n    normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n  } else {\n    normBias = [norm.bias![0], norm.bias![1], norm.bias![2], norm.bias![3] ?? 0];\n  }\n\n  const inputformat = options.format !== undefined ? options.format : 'RGBA';\n  // default value is RGBA since imagedata and HTMLImageElement uses it\n\n  const outputformat =\n    options.tensorFormat !== undefined ? (options.tensorFormat !== undefined ? options.tensorFormat : 'RGB') : 'RGB';\n  const stride = height * width;\n  const float32Data = outputformat === 'RGBA' ? new Float32Array(stride * 4) : new Float32Array(stride * 3);\n\n  // Default pointer assignments\n  let step = 4,\n    rImagePointer = 0,\n    gImagePointer = 1,\n    bImagePointer = 2,\n    aImagePointer = 3;\n  let rTensorPointer = 0,\n    gTensorPointer = stride,\n    bTensorPointer = stride * 2,\n    aTensorPointer = -1;\n\n  // Updating the pointer assignments based on the input image format\n  if (inputformat === 'RGB') {\n    step = 3;\n    rImagePointer = 0;\n    gImagePointer = 1;\n    bImagePointer = 2;\n    aImagePointer = -1;\n  }\n\n  // Updating the pointer assignments based on the output tensor format\n  if (outputformat === 'RGBA') {\n    aTensorPointer = stride * 3;\n  } else if (outputformat === 'RBG') {\n    rTensorPointer = 0;\n    bTensorPointer = stride;\n    gTensorPointer = stride * 2;\n  } else if (outputformat === 'BGR') {\n    bTensorPointer = 0;\n    gTensorPointer = stride;\n    rTensorPointer = stride * 2;\n  }\n\n  for (\n    let i = 0;\n    i < stride;\n    i++, rImagePointer += step, bImagePointer += step, gImagePointer += step, aImagePointer += step\n  ) {\n    float32Data[rTensorPointer++] = (buffer[rImagePointer] + normBias[0]) / normMean[0];\n    float32Data[gTensorPointer++] = (buffer[gImagePointer] + normBias[1]) / normMean[1];\n    float32Data[bTensorPointer++] = (buffer[bImagePointer] + normBias[2]) / normMean[2];\n    if (aTensorPointer !== -1 && aImagePointer !== -1) {\n      float32Data[aTensorPointer++] = (buffer[aImagePointer] + normBias[3]) / normMean[3];\n    }\n  }\n\n  // Float32Array -> ort.Tensor\n  const outputTensor =\n    outputformat === 'RGBA'\n      ? new Tensor('float32', float32Data, [1, 4, height, width])\n      : new Tensor('float32', float32Data, [1, 3, height, width]);\n  return outputTensor;\n};\n\n/**\n * implementation of Tensor.fromImage().\n */\nexport const tensorFromImage = async (\n  image: ImageData | HTMLImageElement | ImageBitmap | string,\n  options?:\n    | TensorFromImageDataOptions\n    | TensorFromImageElementOptions\n    | TensorFromImageBitmapOptions\n    | TensorFromUrlOptions,\n): Promise<Tensor> => {\n  // checking the type of image object\n  const isHTMLImageEle = typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement;\n  const isImageDataEle = typeof ImageData !== 'undefined' && image instanceof ImageData;\n  const isImageBitmap = typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap;\n  const isString = typeof image === 'string';\n\n  let data: Uint8ClampedArray | undefined;\n  let bufferToTensorOptions: BufferToTensorOptions = options ?? {};\n\n  const createCanvas = () => {\n    if (typeof document !== 'undefined') {\n      return document.createElement('canvas');\n    } else if (typeof OffscreenCanvas !== 'undefined') {\n      return new OffscreenCanvas(1, 1);\n    } else {\n      throw new Error('Canvas is not supported');\n    }\n  };\n  const createCanvasContext = (canvas: HTMLCanvasElement | OffscreenCanvas) => {\n    if (canvas instanceof HTMLCanvasElement) {\n      return canvas.getContext('2d');\n    } else if (canvas instanceof OffscreenCanvas) {\n      return canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n    } else {\n      return null;\n    }\n  };\n  // filling and checking image configuration options\n  if (isHTMLImageEle) {\n    // HTMLImageElement - image object - format is RGBA by default\n    const canvas = createCanvas();\n    canvas.width = image.width;\n    canvas.height = image.height;\n    const pixels2DContext = createCanvasContext(canvas);\n\n    if (pixels2DContext != null) {\n      let height = image.height;\n      let width = image.width;\n      if (options !== undefined && options.resizedHeight !== undefined && options.resizedWidth !== undefined) {\n        height = options.resizedHeight;\n        width = options.resizedWidth;\n      }\n\n      if (options !== undefined) {\n        bufferToTensorOptions = options;\n        if (options.tensorFormat !== undefined) {\n          throw new Error('Image input config format must be RGBA for HTMLImageElement');\n        } else {\n          bufferToTensorOptions.tensorFormat = 'RGBA';\n        }\n        bufferToTensorOptions.height = height;\n        bufferToTensorOptions.width = width;\n      } else {\n        bufferToTensorOptions.tensorFormat = 'RGBA';\n        bufferToTensorOptions.height = height;\n        bufferToTensorOptions.width = width;\n      }\n\n      pixels2DContext.drawImage(image, 0, 0);\n      data = pixels2DContext.getImageData(0, 0, width, height).data;\n    } else {\n      throw new Error('Can not access image data');\n    }\n  } else if (isImageDataEle) {\n    let height: number;\n    let width: number;\n\n    if (options !== undefined && options.resizedWidth !== undefined && options.resizedHeight !== undefined) {\n      height = options.resizedHeight;\n      width = options.resizedWidth;\n    } else {\n      height = image.height;\n      width = image.width;\n    }\n\n    if (options !== undefined) {\n      bufferToTensorOptions = options;\n    }\n    bufferToTensorOptions.format = 'RGBA';\n    bufferToTensorOptions.height = height;\n    bufferToTensorOptions.width = width;\n\n    if (options !== undefined) {\n      const tempCanvas = createCanvas();\n\n      tempCanvas.width = width;\n      tempCanvas.height = height;\n\n      const pixels2DContext = createCanvasContext(tempCanvas);\n\n      if (pixels2DContext != null) {\n        pixels2DContext.putImageData(image, 0, 0);\n        data = pixels2DContext.getImageData(0, 0, width, height).data;\n      } else {\n        throw new Error('Can not access image data');\n      }\n    } else {\n      data = image.data;\n    }\n  } else if (isImageBitmap) {\n    // ImageBitmap - image object - format must be provided by user\n    if (options === undefined) {\n      throw new Error('Please provide image config with format for Imagebitmap');\n    }\n\n    const canvas = createCanvas();\n    canvas.width = image.width;\n    canvas.height = image.height;\n    const pixels2DContext = createCanvasContext(canvas);\n\n    if (pixels2DContext != null) {\n      const height = image.height;\n      const width = image.width;\n      pixels2DContext.drawImage(image, 0, 0, width, height);\n      data = pixels2DContext.getImageData(0, 0, width, height).data;\n      bufferToTensorOptions.height = height;\n      bufferToTensorOptions.width = width;\n      return bufferToTensor(data, bufferToTensorOptions);\n    } else {\n      throw new Error('Can not access image data');\n    }\n  } else if (isString) {\n    return new Promise((resolve, reject) => {\n      const canvas = createCanvas();\n      const context = createCanvasContext(canvas);\n      if (!image || !context) {\n        return reject();\n      }\n      const newImage = new Image();\n      newImage.crossOrigin = 'Anonymous';\n      newImage.src = image;\n      newImage.onload = () => {\n        canvas.width = newImage.width;\n        canvas.height = newImage.height;\n        context.drawImage(newImage, 0, 0, canvas.width, canvas.height);\n        const img = context.getImageData(0, 0, canvas.width, canvas.height);\n\n        bufferToTensorOptions.height = canvas.height;\n        bufferToTensorOptions.width = canvas.width;\n        resolve(bufferToTensor(img.data, bufferToTensorOptions));\n      };\n    });\n  } else {\n    throw new Error('Input data provided is not supported - aborted tensor creation');\n  }\n\n  if (data !== undefined) {\n    return bufferToTensor(data, bufferToTensorOptions);\n  } else {\n    throw new Error('Input data provided is not supported - aborted tensor creation');\n  }\n};\n\n/**\n * implementation of Tensor.fromTexture().\n */\nexport const tensorFromTexture = <T extends TensorInterface.TextureDataTypes>(\n  texture: TensorInterface.TextureType,\n  options: TensorFromTextureOptions<T>,\n): Tensor => {\n  const { width, height, download, dispose } = options;\n  // Always assume RGBAF32. TODO: support different texture format\n  const dims = [1, height, width, 4];\n  return new Tensor({ location: 'texture', type: 'float32', texture, dims, download, dispose });\n};\n\n/**\n * implementation of Tensor.fromGpuBuffer().\n */\nexport const tensorFromGpuBuffer = <T extends TensorInterface.GpuBufferDataTypes>(\n  gpuBuffer: TensorInterface.GpuBufferType,\n  options: TensorFromGpuBufferOptions<T>,\n): Tensor => {\n  const { dataType, dims, download, dispose } = options;\n  return new Tensor({ location: 'gpu-buffer', type: dataType ?? 'float32', gpuBuffer, dims, download, dispose });\n};\n\n/**\n * implementation of Tensor.fromPinnedBuffer().\n */\nexport const tensorFromPinnedBuffer = <T extends TensorInterface.CpuPinnedDataTypes>(\n  type: T,\n  buffer: TensorInterface.DataTypeMap[T],\n  dims?: readonly number[],\n): Tensor => new Tensor({ location: 'cpu-pinned', type, data: buffer, dims: dims ?? [buffer.length] });\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from './tensor.js';\n\nexport type SupportedTypedArrayConstructors =\n  | Float32ArrayConstructor\n  | Uint8ArrayConstructor\n  | Int8ArrayConstructor\n  | Uint16ArrayConstructor\n  | Int16ArrayConstructor\n  | Int32ArrayConstructor\n  | BigInt64ArrayConstructor\n  | Uint8ArrayConstructor\n  | Float64ArrayConstructor\n  | Uint32ArrayConstructor\n  | BigUint64ArrayConstructor;\nexport type SupportedTypedArray = InstanceType<SupportedTypedArrayConstructors>;\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP = new Map<string, SupportedTypedArrayConstructors>([\n  ['float32', Float32Array],\n  ['uint8', Uint8Array],\n  ['int8', Int8Array],\n  ['uint16', Uint16Array],\n  ['int16', Int16Array],\n  ['int32', Int32Array],\n  ['bool', Uint8Array],\n  ['float64', Float64Array],\n  ['uint32', Uint32Array],\n  ['int4', Uint8Array],\n  ['uint4', Uint8Array],\n]);\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP = new Map<SupportedTypedArrayConstructors, Tensor.Type>([\n  [Float32Array, 'float32'],\n  [Uint8Array, 'uint8'],\n  [Int8Array, 'int8'],\n  [Uint16Array, 'uint16'],\n  [Int16Array, 'int16'],\n  [Int32Array, 'int32'],\n  [Float64Array, 'float64'],\n  [Uint32Array, 'uint32'],\n]);\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n  const Float16Array: any;\n}\n\n// the following code allows delaying execution of BigInt/Float16Array checking. This allows lazy initialization for\n// NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP and NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, which allows BigInt/Float16Array\n// polyfill if available.\nlet isTypedArrayChecked = false;\nexport const checkTypedArray = () => {\n  if (!isTypedArrayChecked) {\n    isTypedArrayChecked = true;\n    const isBigInt64ArrayAvailable = typeof BigInt64Array !== 'undefined' && BigInt64Array.from;\n    const isBigUint64ArrayAvailable = typeof BigUint64Array !== 'undefined' && BigUint64Array.from;\n    const isFloat16ArrayAvailable = typeof Float16Array !== 'undefined' && Float16Array.from;\n\n    if (isBigInt64ArrayAvailable) {\n      NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('int64', BigInt64Array);\n      NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigInt64Array, 'int64');\n    }\n    if (isBigUint64ArrayAvailable) {\n      NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('uint64', BigUint64Array);\n      NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigUint64Array, 'uint64');\n    }\n    if (isFloat16ArrayAvailable) {\n      NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Float16Array);\n      NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(Float16Array, 'float16');\n    } else {\n      // if Float16Array is not available, use 'Uint16Array' to store the data.\n      NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Uint16Array);\n    }\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n  CpuPinnedConstructorParameters,\n  GpuBufferConstructorParameters,\n  TextureConstructorParameters,\n} from './tensor-factory.js';\nimport { Tensor } from './tensor-impl.js';\n\n/**\n * calculate size from dims.\n *\n * @param dims the dims array. May be an illegal input.\n */\nexport const calculateSize = (dims: readonly unknown[]): number => {\n  let size = 1;\n  for (let i = 0; i < dims.length; i++) {\n    const dim = dims[i];\n    if (typeof dim !== 'number' || !Number.isSafeInteger(dim)) {\n      throw new TypeError(`dims[${i}] must be an integer, got: ${dim}`);\n    }\n    if (dim < 0) {\n      throw new RangeError(`dims[${i}] must be a non-negative integer, got: ${dim}`);\n    }\n    size *= dim;\n  }\n  return size;\n};\n\n/**\n * implementation of Tensor.reshape()\n */\nexport const tensorReshape = (tensor: Tensor, dims: readonly number[]): Tensor => {\n  switch (tensor.location) {\n    case 'cpu':\n      return new Tensor(tensor.type, tensor.data, dims);\n    case 'cpu-pinned':\n      return new Tensor({\n        location: 'cpu-pinned',\n        data: tensor.data as CpuPinnedConstructorParameters['data'],\n        type: tensor.type as CpuPinnedConstructorParameters['type'],\n        dims,\n      });\n    case 'texture':\n      return new Tensor({\n        location: 'texture',\n        texture: tensor.texture,\n        type: tensor.type as TextureConstructorParameters['type'],\n        dims,\n      });\n    case 'gpu-buffer':\n      return new Tensor({\n        location: 'gpu-buffer',\n        gpuBuffer: tensor.gpuBuffer,\n        type: tensor.type as GpuBufferConstructorParameters['type'],\n        dims,\n      });\n    default:\n      throw new Error(`tensorReshape: tensor location ${tensor.location} is not supported`);\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { tensorToDataURL, tensorToImageData } from './tensor-conversion-impl.js';\nimport { TensorToDataUrlOptions, TensorToImageDataOptions } from './tensor-conversion.js';\nimport {\n  tensorFromGpuBuffer,\n  tensorFromImage,\n  tensorFromPinnedBuffer,\n  tensorFromTexture,\n} from './tensor-factory-impl.js';\nimport {\n  CpuPinnedConstructorParameters,\n  GpuBufferConstructorParameters,\n  TensorFromGpuBufferOptions,\n  TensorFromImageBitmapOptions,\n  TensorFromImageDataOptions,\n  TensorFromImageElementOptions,\n  TensorFromTextureOptions,\n  TensorFromUrlOptions,\n  TextureConstructorParameters,\n} from './tensor-factory.js';\nimport {\n  checkTypedArray,\n  NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP,\n  NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP,\n  SupportedTypedArray,\n  SupportedTypedArrayConstructors,\n} from './tensor-impl-type-mapping.js';\nimport { calculateSize, tensorReshape } from './tensor-utils-impl.js';\nimport { Tensor as TensorInterface } from './tensor.js';\n\n// type aliases for those exported from Tensor interface\n\ntype TensorType = TensorInterface.Type;\ntype TensorDataType = TensorInterface.DataType;\ntype TensorDataLocation = TensorInterface.DataLocation;\ntype TensorTextureType = TensorInterface.TextureType;\ntype TensorGpuBufferType = TensorInterface.GpuBufferType;\n\n/**\n * the implementation of Tensor interface.\n *\n * @ignore\n */\nexport class Tensor implements TensorInterface {\n  // #region constructors\n\n  /**\n   * Construct a new CPU tensor object from the given type, data and dims.\n   */\n  constructor(\n    type: TensorType,\n    data: TensorDataType | readonly string[] | readonly number[] | readonly boolean[],\n    dims?: readonly number[],\n  );\n  /**\n   * Construct a new CPU tensor object from the given data and dims. Type is inferred from data.\n   */\n  constructor(data: TensorDataType | readonly string[] | readonly boolean[], dims?: readonly number[]);\n  /**\n   * Construct a new tensor object from the pinned CPU data with the given type and dims.\n   *\n   * Tensor's location will be set to 'cpu-pinned'.\n   *\n   * @param params - Specify the parameters to construct the tensor.\n   */\n  constructor(params: CpuPinnedConstructorParameters);\n  /**\n   * Construct a new tensor object from the WebGL texture with the given type and dims.\n   *\n   * Tensor's location will be set to 'texture'.\n   *\n   * @param params - Specify the parameters to construct the tensor.\n   */\n  constructor(params: TextureConstructorParameters);\n  /**\n   * Construct a new tensor object from the WebGPU buffer with the given type and dims.\n   *\n   * Tensor's location will be set to 'gpu-buffer'.\n   *\n   * @param params - Specify the parameters to construct the tensor.\n   */\n  constructor(params: GpuBufferConstructorParameters);\n\n  /**\n   * implementation.\n   */\n  constructor(\n    arg0:\n      | TensorType\n      | TensorDataType\n      | readonly string[]\n      | readonly boolean[]\n      | CpuPinnedConstructorParameters\n      | TextureConstructorParameters\n      | GpuBufferConstructorParameters,\n    arg1?: TensorDataType | readonly number[] | readonly string[] | readonly boolean[],\n    arg2?: readonly number[],\n  ) {\n    // perform one-time check for BigInt/Float16Array support\n    checkTypedArray();\n\n    let type: TensorType;\n    let dims: readonly number[];\n\n    if (typeof arg0 === 'object' && 'location' in arg0) {\n      //\n      // constructing tensor from specific location\n      //\n      this.dataLocation = arg0.location;\n      type = arg0.type;\n      dims = arg0.dims;\n      switch (arg0.location) {\n        case 'cpu-pinned': {\n          const expectedTypedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(type);\n          if (!expectedTypedArrayConstructor) {\n            throw new TypeError(`unsupported type \"${type}\" to create tensor from pinned buffer`);\n          }\n          if (!(arg0.data instanceof expectedTypedArrayConstructor)) {\n            throw new TypeError(`buffer should be of type ${expectedTypedArrayConstructor.name}`);\n          }\n          this.cpuData = arg0.data;\n          break;\n        }\n        case 'texture': {\n          if (type !== 'float32') {\n            throw new TypeError(`unsupported type \"${type}\" to create tensor from texture`);\n          }\n          this.gpuTextureData = arg0.texture;\n          this.downloader = arg0.download;\n          this.disposer = arg0.dispose;\n          break;\n        }\n        case 'gpu-buffer': {\n          if (\n            type !== 'float32' &&\n            type !== 'float16' &&\n            type !== 'int32' &&\n            type !== 'int64' &&\n            type !== 'uint32' &&\n            type !== 'uint8' &&\n            type !== 'bool' &&\n            type !== 'uint4' &&\n            type !== 'int4'\n          ) {\n            throw new TypeError(`unsupported type \"${type}\" to create tensor from gpu buffer`);\n          }\n          this.gpuBufferData = arg0.gpuBuffer;\n          this.downloader = arg0.download;\n          this.disposer = arg0.dispose;\n          break;\n        }\n        default:\n          throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`);\n      }\n    } else {\n      //\n      // constructing tensor of location 'cpu'\n      //\n      let data: TensorDataType;\n      let maybeDims: typeof arg1 | typeof arg2;\n      // check whether arg0 is type or data\n      if (typeof arg0 === 'string') {\n        //\n        // Override: constructor(type, data, ...)\n        //\n        type = arg0;\n        maybeDims = arg2;\n        if (arg0 === 'string') {\n          // string tensor\n          if (!Array.isArray(arg1)) {\n            throw new TypeError(\"A string tensor's data must be a string array.\");\n          }\n          // we don't check whether every element in the array is string; this is too slow. we assume it's correct and\n          // error will be populated at inference\n          data = arg1;\n        } else {\n          // numeric tensor\n          const typedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(arg0);\n          if (typedArrayConstructor === undefined) {\n            throw new TypeError(`Unsupported tensor type: ${arg0}.`);\n          }\n          if (Array.isArray(arg1)) {\n            if ((arg0 === 'float16' && typedArrayConstructor === Uint16Array) || arg0 === 'uint4' || arg0 === 'int4') {\n              // - 'float16':\n              //   When no Float16Array polyfill is used, we cannot create 'float16' tensor from number array.\n              //\n              //   Throw error here because when user try to use number array as data,\n              //   e.g. new Tensor('float16', [1, 2, 3, 4], dims)), it will actually call\n              //   Uint16Array.from(arg1) which generates wrong data.\n              //\n              // - 'uint4' and 'int4':\n              //   Uint8Array.from(arg1) will generate wrong data for 'uint4' and 'int4' tensor.\n              //\n              throw new TypeError(\n                `Creating a ${arg0} tensor from number array is not supported. Please use ${typedArrayConstructor.name} as data.`,\n              );\n            } else if (arg0 === 'uint64' || arg0 === 'int64') {\n              // use 'as any' here because:\n              // 1. TypeScript's check on type of 'Array.isArray()' does not work with readonly arrays.\n              // see https://github.com/microsoft/TypeScript/issues/17002\n              // 2. TypeScript's check on union type of '(BigInt64ArrayConstructor|BigUint64ArrayConstructor).from()'\n              // does not accept parameter mapFn.\n              // 3. parameters of 'SupportedTypedArrayConstructors.from()' does not match the requirement of the union\n              // type.\n\n              // assume 'arg1' is of type \"readonly number[]|readonly bigint[]\" here.\n\n              // eslint-disable-next-line @typescript-eslint/no-explicit-any\n              data = (typedArrayConstructor as any).from(arg1, BigInt);\n            } else {\n              // assume 'arg1' is of type \"readonly number[]\" here.\n              // eslint-disable-next-line @typescript-eslint/no-explicit-any\n              data = (typedArrayConstructor as any).from(arg1);\n            }\n          } else if (arg1 instanceof typedArrayConstructor) {\n            data = arg1;\n          } else {\n            throw new TypeError(`A ${type} tensor's data must be type of ${typedArrayConstructor}`);\n          }\n        }\n      } else {\n        //\n        // Override: constructor(data, ...)\n        //\n        maybeDims = arg1;\n        if (Array.isArray(arg0)) {\n          // only boolean[] and string[] is supported\n          if (arg0.length === 0) {\n            throw new TypeError('Tensor type cannot be inferred from an empty array.');\n          }\n          const firstElementType = typeof arg0[0];\n          if (firstElementType === 'string') {\n            type = 'string';\n            data = arg0;\n          } else if (firstElementType === 'boolean') {\n            type = 'bool';\n            // 'arg0' is of type 'boolean[]'. Uint8Array.from(boolean[]) actually works, but typescript thinks this is\n            // wrong type. We use 'as any' to make it happy.\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            data = Uint8Array.from(arg0 as any[]);\n          } else {\n            throw new TypeError(`Invalid element type of data array: ${firstElementType}.`);\n          }\n        } else {\n          // get tensor type from TypedArray\n          const mappedType = NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.get(\n            arg0.constructor as SupportedTypedArrayConstructors,\n          );\n          if (mappedType === undefined) {\n            throw new TypeError(`Unsupported type for tensor data: ${arg0.constructor}.`);\n          }\n          type = mappedType;\n          data = arg0 as SupportedTypedArray;\n        }\n      }\n\n      // type and data is processed, now processing dims\n      if (maybeDims === undefined) {\n        // assume 1-D tensor if dims omitted\n        maybeDims = [data.length];\n      } else if (!Array.isArray(maybeDims)) {\n        throw new TypeError(\"A tensor's dims must be a number array\");\n      }\n      dims = maybeDims as readonly number[];\n\n      this.cpuData = data;\n      this.dataLocation = 'cpu';\n    }\n\n    // perform check on dims\n    const size = calculateSize(dims);\n    // if data is on CPU, check whether data length matches tensor size\n    if (this.cpuData && size !== this.cpuData.length) {\n      if ((type === 'uint4' || type === 'int4') && Math.ceil(size / 2) === this.cpuData.length) {\n        // for (u)int4, the data length is half of the tensor size. So we check this special case when size is odd.\n      } else {\n        throw new Error(`Tensor's size(${size}) does not match data length(${this.cpuData.length}).`);\n      }\n    }\n\n    this.type = type;\n    this.dims = dims;\n    this.size = size;\n  }\n  // #endregion\n\n  // #region factory\n  static async fromImage(\n    image: ImageData | HTMLImageElement | ImageBitmap | string,\n    options?:\n      | TensorFromImageDataOptions\n      | TensorFromImageElementOptions\n      | TensorFromImageBitmapOptions\n      | TensorFromUrlOptions,\n  ): Promise<TensorInterface> {\n    return tensorFromImage(image, options);\n  }\n\n  static fromTexture<T extends TensorInterface.TextureDataTypes>(\n    texture: TensorTextureType,\n    options: TensorFromTextureOptions<T>,\n  ): TensorInterface {\n    return tensorFromTexture(texture, options);\n  }\n\n  static fromGpuBuffer<T extends TensorInterface.GpuBufferDataTypes>(\n    gpuBuffer: TensorGpuBufferType,\n    options: TensorFromGpuBufferOptions<T>,\n  ): TensorInterface {\n    return tensorFromGpuBuffer(gpuBuffer, options);\n  }\n\n  static fromPinnedBuffer<T extends TensorInterface.CpuPinnedDataTypes>(\n    type: T,\n    buffer: TensorInterface.DataTypeMap[T],\n    dims?: readonly number[],\n  ): Tensor {\n    return tensorFromPinnedBuffer(type, buffer, dims);\n  }\n\n  // #endregion\n\n  // #region conversions\n  toDataURL(options?: TensorToDataUrlOptions): string {\n    return tensorToDataURL(this, options);\n  }\n\n  toImageData(options?: TensorToImageDataOptions): ImageData {\n    return tensorToImageData(this, options);\n  }\n  // #endregion\n\n  // #region public fields\n  readonly dims: readonly number[];\n  readonly type: TensorType;\n  readonly size: number;\n  // #endregion\n\n  // #region private fields\n\n  /**\n   * stores the location of the data.\n   */\n  private dataLocation: TensorDataLocation;\n\n  /**\n   * stores the data on CPU, if location is 'cpu' or 'cpu-pinned'. otherwise empty.\n   */\n  private cpuData?: TensorDataType;\n\n  /**\n   * stores the underlying texture when location is 'texture'. otherwise empty.\n   */\n  private gpuTextureData?: TensorTextureType;\n\n  /**\n   * stores the underlying GPU buffer when location is 'gpu-buffer'. otherwise empty.\n   */\n  private gpuBufferData?: TensorGpuBufferType;\n\n  /**\n   * stores an optional downloader function to download data from GPU to CPU.\n   */\n  private downloader?(): Promise<TensorDataType>;\n\n  /**\n   * a flag indicating whether the data is being downloaded from GPU to CPU.\n   */\n  private isDownloading?: boolean;\n\n  /**\n   * stores an optional disposer function to dispose the underlying data.\n   */\n  private disposer?(): void;\n  // #endregion\n\n  // #region properties\n  get data(): TensorDataType {\n    this.ensureValid();\n    if (!this.cpuData) {\n      throw new Error(\n        'The data is not on CPU. Use `getData()` to download GPU data to CPU, ' +\n          'or use `texture` or `gpuBuffer` property to access the GPU data directly.',\n      );\n    }\n    return this.cpuData;\n  }\n\n  get location(): TensorDataLocation {\n    return this.dataLocation;\n  }\n\n  get texture(): TensorTextureType {\n    this.ensureValid();\n    if (!this.gpuTextureData) {\n      throw new Error('The data is not stored as a WebGL texture.');\n    }\n    return this.gpuTextureData;\n  }\n\n  get gpuBuffer(): TensorGpuBufferType {\n    this.ensureValid();\n    if (!this.gpuBufferData) {\n      throw new Error('The data is not stored as a WebGPU buffer.');\n    }\n    return this.gpuBufferData;\n  }\n  // #endregion\n\n  // #region methods\n\n  async getData(releaseData?: boolean): Promise<TensorDataType> {\n    this.ensureValid();\n    switch (this.dataLocation) {\n      case 'cpu':\n      case 'cpu-pinned':\n        return this.data;\n      case 'texture':\n      case 'gpu-buffer': {\n        if (!this.downloader) {\n          throw new Error('The current tensor is not created with a specified data downloader.');\n        }\n        if (this.isDownloading) {\n          throw new Error('The current tensor is being downloaded.');\n        }\n        try {\n          this.isDownloading = true;\n          const data = await this.downloader();\n          this.downloader = undefined;\n          this.dataLocation = 'cpu';\n          this.cpuData = data;\n\n          if (releaseData && this.disposer) {\n            this.disposer();\n            this.disposer = undefined;\n          }\n\n          return data;\n        } finally {\n          this.isDownloading = false;\n        }\n      }\n      default:\n        throw new Error(`cannot get data from location: ${this.dataLocation}`);\n    }\n  }\n\n  dispose(): void {\n    if (this.isDownloading) {\n      throw new Error('The current tensor is being downloaded.');\n    }\n\n    if (this.disposer) {\n      this.disposer();\n      this.disposer = undefined;\n    }\n    this.cpuData = undefined;\n    this.gpuTextureData = undefined;\n    this.gpuBufferData = undefined;\n    this.downloader = undefined;\n    this.isDownloading = undefined;\n\n    this.dataLocation = 'none';\n  }\n\n  // #endregion\n\n  // #region tensor utilities\n  private ensureValid(): void {\n    if (this.dataLocation === 'none') {\n      throw new Error('The tensor is disposed.');\n    }\n  }\n\n  reshape(dims: readonly number[]): TensorInterface {\n    this.ensureValid();\n    if (this.downloader || this.disposer) {\n      throw new Error('Cannot reshape a tensor that owns GPU resource.');\n    }\n    return tensorReshape(this, dims);\n  }\n  // #endregion\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { TensorFactory } from './tensor-factory.js';\nimport { Tensor as TensorImpl } from './tensor-impl.js';\nimport { TypedTensorUtils } from './tensor-utils.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\n/**\n * represent a basic tensor with specified dimensions and data type.\n */\ninterface TypedTensorBase<T extends Tensor.Type> {\n  /**\n   * Get the dimensions of the tensor.\n   */\n  readonly dims: readonly number[];\n  /**\n   * Get the data type of the tensor.\n   */\n  readonly type: T;\n  /**\n   * Get the buffer data of the tensor.\n   *\n   * If the data is not on CPU (eg. it's in the form of WebGL texture or WebGPU buffer), throw error.\n   */\n  readonly data: Tensor.DataTypeMap[T];\n  /**\n   * Get the location of the data.\n   */\n  readonly location: Tensor.DataLocation;\n  /**\n   * Get the WebGL texture that holds the tensor data.\n   *\n   * If the data is not on GPU as WebGL texture, throw error.\n   */\n  readonly texture: Tensor.TextureType;\n  /**\n   * Get the WebGPU buffer that holds the tensor data.\n   *\n   * If the data is not on GPU as WebGPU buffer, throw error.\n   */\n  readonly gpuBuffer: Tensor.GpuBufferType;\n\n  /**\n   * Get the buffer data of the tensor.\n   *\n   * If the data is on CPU, returns the data immediately.\n   * If the data is on GPU, downloads the data and returns the promise.\n   *\n   * @param releaseData - whether release the data on GPU. Ignore if data is already on CPU.\n   */\n  getData(releaseData?: boolean): Promise<Tensor.DataTypeMap[T]>;\n\n  /**\n   * Dispose the tensor data.\n   *\n   * If the data is on CPU, remove its internal reference to the underlying data.\n   * If the data is on GPU, release the data on GPU.\n   *\n   * After calling this function, the tensor is considered no longer valid. Its location will be set to 'none'.\n   */\n  dispose(): void;\n}\n\nexport declare namespace Tensor {\n  interface DataTypeMap {\n    float32: Float32Array;\n    uint8: Uint8Array;\n    int8: Int8Array;\n    uint16: Uint16Array;\n    int16: Int16Array;\n    int32: Int32Array;\n    int64: BigInt64Array;\n    string: string[];\n    bool: Uint8Array;\n    float16: Uint16Array; // Keep using Uint16Array until we have a concrete solution for float 16.\n    float64: Float64Array;\n    uint32: Uint32Array;\n    uint64: BigUint64Array;\n    // complex64: never;\n    // complex128: never;\n    // bfloat16: never;\n    uint4: Uint8Array;\n    int4: Int8Array;\n  }\n\n  interface ElementTypeMap {\n    float32: number;\n    uint8: number;\n    int8: number;\n    uint16: number;\n    int16: number;\n    int32: number;\n    int64: bigint;\n    string: string;\n    bool: boolean;\n    float16: number; // Keep using Uint16Array until we have a concrete solution for float 16.\n    float64: number;\n    uint32: number;\n    uint64: bigint;\n    // complex64: never;\n    // complex128: never;\n    // bfloat16: never;\n    uint4: number;\n    int4: number;\n  }\n\n  type DataType = DataTypeMap[Type];\n  type ElementType = ElementTypeMap[Type];\n\n  /**\n   * supported data types for constructing a tensor from a pinned CPU buffer\n   */\n  export type CpuPinnedDataTypes = Exclude<Tensor.Type, 'string'>;\n\n  /**\n   * type alias for WebGL texture\n   */\n  export type TextureType = WebGLTexture;\n\n  /**\n   * supported data types for constructing a tensor from a WebGL texture\n   */\n  export type TextureDataTypes = 'float32';\n\n  /**\n   * type alias for WebGPU buffer\n   *\n   * The reason why we don't use type \"GPUBuffer\" defined in webgpu.d.ts from @webgpu/types is because \"@webgpu/types\"\n   * requires \"@types/dom-webcodecs\" as peer dependency when using TypeScript < v5.1 and its version need to be chosen\n   * carefully according to the TypeScript version being used. This means so far there is not a way to keep every\n   * TypeScript version happy. It turns out that we will easily broke users on some TypeScript version.\n   *\n   * for more info see https://github.com/gpuweb/types/issues/127\n   */\n  export type GpuBufferType = { size: number; mapState: 'unmapped' | 'pending' | 'mapped' };\n\n  /**\n   * supported data types for constructing a tensor from a WebGPU buffer\n   */\n  export type GpuBufferDataTypes = 'float32' | 'float16' | 'int32' | 'int64' | 'uint32' | 'uint8' | 'bool';\n\n  /**\n   * represent where the tensor data is stored\n   */\n  export type DataLocation = 'none' | 'cpu' | 'cpu-pinned' | 'texture' | 'gpu-buffer';\n\n  /**\n   * represent the data type of a tensor\n   */\n  export type Type = keyof DataTypeMap;\n}\n\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface TypedTensor<T extends Tensor.Type> extends TypedTensorBase<T>, TypedTensorUtils<T> {}\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface Tensor extends TypedTensorBase<Tensor.Type>, TypedTensorUtils<Tensor.Type> {}\n\n/**\n * type TensorConstructor defines the constructors of 'Tensor' to create CPU tensor instances.\n */\nexport interface TensorConstructor extends TensorFactory {\n  // #region CPU tensor - specify element type\n  /**\n   * Construct a new string tensor object from the given type, data and dims.\n   *\n   * @param type - Specify the element type.\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (\n    type: 'string',\n    data: Tensor.DataTypeMap['string'] | readonly string[],\n    dims?: readonly number[],\n  ): TypedTensor<'string'>;\n\n  /**\n   * Construct a new bool tensor object from the given type, data and dims.\n   *\n   * @param type - Specify the element type.\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (\n    type: 'bool',\n    data: Tensor.DataTypeMap['bool'] | readonly boolean[],\n    dims?: readonly number[],\n  ): TypedTensor<'bool'>;\n\n  /**\n   * Construct a new 64-bit integer typed tensor object from the given type, data and dims.\n   *\n   * @param type - Specify the element type.\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new <T extends 'uint64' | 'int64'>(\n    type: T,\n    data: Tensor.DataTypeMap[T] | readonly bigint[] | readonly number[],\n    dims?: readonly number[],\n  ): TypedTensor<T>;\n\n  /**\n   * Construct a new numeric tensor object from the given type, data and dims.\n   *\n   * @param type - Specify the element type.\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new <T extends Exclude<Tensor.Type, 'string' | 'bool' | 'uint64' | 'int64'>>(\n    type: T,\n    data: Tensor.DataTypeMap[T] | readonly number[],\n    dims?: readonly number[],\n  ): TypedTensor<T>;\n  // #endregion\n\n  // #region CPU tensor - infer element types\n\n  /**\n   * Construct a new float32 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: Float32Array, dims?: readonly number[]): TypedTensor<'float32'>;\n\n  /**\n   * Construct a new int8 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: Int8Array, dims?: readonly number[]): TypedTensor<'int8'>;\n\n  /**\n   * Construct a new uint8 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: Uint8Array, dims?: readonly number[]): TypedTensor<'uint8'>;\n\n  /**\n   * Construct a new uint16 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: Uint16Array, dims?: readonly number[]): TypedTensor<'uint16'>;\n\n  /**\n   * Construct a new int16 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: Int16Array, dims?: readonly number[]): TypedTensor<'int16'>;\n\n  /**\n   * Construct a new int32 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: Int32Array, dims?: readonly number[]): TypedTensor<'int32'>;\n\n  /**\n   * Construct a new int64 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: BigInt64Array, dims?: readonly number[]): TypedTensor<'int64'>;\n\n  /**\n   * Construct a new string tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: readonly string[], dims?: readonly number[]): TypedTensor<'string'>;\n\n  /**\n   * Construct a new bool tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: readonly boolean[], dims?: readonly number[]): TypedTensor<'bool'>;\n\n  /**\n   * Construct a new float64 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: Float64Array, dims?: readonly number[]): TypedTensor<'float64'>;\n\n  /**\n   * Construct a new uint32 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: Uint32Array, dims?: readonly number[]): TypedTensor<'uint32'>;\n\n  /**\n   * Construct a new uint64 tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: BigUint64Array, dims?: readonly number[]): TypedTensor<'uint64'>;\n\n  // #endregion\n\n  // #region CPU tensor - fall back to non-generic tensor type declaration\n\n  /**\n   * Construct a new tensor object from the given type, data and dims.\n   *\n   * @param type - Specify the element type.\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (\n    type: Tensor.Type,\n    data: Tensor.DataType | readonly number[] | readonly string[] | readonly bigint[] | readonly boolean[],\n    dims?: readonly number[],\n  ): Tensor;\n\n  /**\n   * Construct a new tensor object from the given data and dims.\n   *\n   * @param data - Specify the CPU tensor data.\n   * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   */\n  new (data: Tensor.DataType, dims?: readonly number[]): Tensor;\n  // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const Tensor = TensorImpl as TensorConstructor;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { env } from './env-impl.js';\n\n/**\n * @ignore\n */\nexport const TRACE = (deviceType: string, label: string) => {\n  if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n    return;\n  }\n  // eslint-disable-next-line no-console\n  console.timeStamp(`${deviceType}::ORT::${label}`);\n};\n\nconst TRACE_FUNC = (msg: string, extraMsg?: string) => {\n  const stack = new Error().stack?.split(/\\r\\n|\\r|\\n/g) || [];\n  let hasTraceFunc = false;\n  for (let i = 0; i < stack.length; i++) {\n    if (hasTraceFunc && !stack[i].includes('TRACE_FUNC')) {\n      let label = `FUNC_${msg}::${stack[i].trim().split(' ')[1]}`;\n      if (extraMsg) {\n        label += `::${extraMsg}`;\n      }\n      TRACE('CPU', label);\n      return;\n    }\n    if (stack[i].includes('TRACE_FUNC')) {\n      hasTraceFunc = true;\n    }\n  }\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_BEGIN = (extraMsg?: string) => {\n  if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n    return;\n  }\n  TRACE_FUNC('BEGIN', extraMsg);\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_END = (extraMsg?: string) => {\n  if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n    return;\n  }\n  TRACE_FUNC('END', extraMsg);\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { resolveBackendAndExecutionProviders } from './backend-impl.js';\nimport { InferenceSessionHandler } from './backend.js';\nimport { InferenceSession as InferenceSessionInterface } from './inference-session.js';\nimport { OnnxValue } from './onnx-value.js';\nimport { Tensor } from './tensor.js';\nimport { TRACE_FUNC_BEGIN, TRACE_FUNC_END } from './trace.js';\n\ntype SessionOptions = InferenceSessionInterface.SessionOptions;\ntype RunOptions = InferenceSessionInterface.RunOptions;\ntype FeedsType = InferenceSessionInterface.FeedsType;\ntype FetchesType = InferenceSessionInterface.FetchesType;\ntype ReturnType = InferenceSessionInterface.ReturnType;\n\nexport class InferenceSession implements InferenceSessionInterface {\n  private constructor(handler: InferenceSessionHandler) {\n    this.handler = handler;\n  }\n  run(feeds: FeedsType, options?: RunOptions): Promise<ReturnType>;\n  run(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise<ReturnType>;\n  async run(feeds: FeedsType, arg1?: FetchesType | RunOptions, arg2?: RunOptions): Promise<ReturnType> {\n    TRACE_FUNC_BEGIN();\n    const fetches: { [name: string]: OnnxValue | null } = {};\n    let options: RunOptions = {};\n    // check inputs\n    if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n      throw new TypeError(\n        \"'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.\",\n      );\n    }\n\n    let isFetchesEmpty = true;\n    // determine which override is being used\n    if (typeof arg1 === 'object') {\n      if (arg1 === null) {\n        throw new TypeError('Unexpected argument[1]: cannot be null.');\n      }\n      if (arg1 instanceof Tensor) {\n        throw new TypeError(\"'fetches' cannot be a Tensor\");\n      }\n\n      if (Array.isArray(arg1)) {\n        if (arg1.length === 0) {\n          throw new TypeError(\"'fetches' cannot be an empty array.\");\n        }\n        isFetchesEmpty = false;\n        // output names\n        for (const name of arg1) {\n          if (typeof name !== 'string') {\n            throw new TypeError(\"'fetches' must be a string array or an object.\");\n          }\n          if (this.outputNames.indexOf(name) === -1) {\n            throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n          }\n          fetches[name] = null;\n        }\n\n        if (typeof arg2 === 'object' && arg2 !== null) {\n          options = arg2;\n        } else if (typeof arg2 !== 'undefined') {\n          throw new TypeError(\"'options' must be an object.\");\n        }\n      } else {\n        // decide whether arg1 is fetches or options\n        // if any output name is present and its value is valid OnnxValue, we consider it fetches\n        let isFetches = false;\n        const arg1Keys = Object.getOwnPropertyNames(arg1);\n        for (const name of this.outputNames) {\n          if (arg1Keys.indexOf(name) !== -1) {\n            const v = (arg1 as InferenceSessionInterface.NullableOnnxValueMapType)[name];\n            if (v === null || v instanceof Tensor) {\n              isFetches = true;\n              isFetchesEmpty = false;\n              fetches[name] = v;\n            }\n          }\n        }\n\n        if (isFetches) {\n          if (typeof arg2 === 'object' && arg2 !== null) {\n            options = arg2;\n          } else if (typeof arg2 !== 'undefined') {\n            throw new TypeError(\"'options' must be an object.\");\n          }\n        } else {\n          options = arg1 as RunOptions;\n        }\n      }\n    } else if (typeof arg1 !== 'undefined') {\n      throw new TypeError(\"Unexpected argument[1]: must be 'fetches' or 'options'.\");\n    }\n\n    // check if all inputs are in feed\n    for (const name of this.inputNames) {\n      if (typeof feeds[name] === 'undefined') {\n        throw new Error(`input '${name}' is missing in 'feeds'.`);\n      }\n    }\n\n    // if no fetches is specified, we use the full output names list\n    if (isFetchesEmpty) {\n      for (const name of this.outputNames) {\n        fetches[name] = null;\n      }\n    }\n\n    // feeds, fetches and options are prepared\n\n    const results = await this.handler.run(feeds, fetches, options);\n    const returnValue: { [name: string]: OnnxValue } = {};\n    for (const key in results) {\n      if (Object.hasOwnProperty.call(results, key)) {\n        const result = results[key];\n        if (result instanceof Tensor) {\n          returnValue[key] = result;\n        } else {\n          returnValue[key] = new Tensor(result.type, result.data, result.dims);\n        }\n      }\n    }\n    TRACE_FUNC_END();\n    return returnValue;\n  }\n\n  async release(): Promise<void> {\n    return this.handler.dispose();\n  }\n\n  static create(path: string, options?: SessionOptions): Promise<InferenceSessionInterface>;\n  static create(buffer: ArrayBufferLike, options?: SessionOptions): Promise<InferenceSessionInterface>;\n  static create(\n    buffer: ArrayBufferLike,\n    byteOffset: number,\n    byteLength?: number,\n    options?: SessionOptions,\n  ): Promise<InferenceSessionInterface>;\n  static create(buffer: Uint8Array, options?: SessionOptions): Promise<InferenceSessionInterface>;\n  static async create(\n    arg0: string | ArrayBufferLike | Uint8Array,\n    arg1?: SessionOptions | number,\n    arg2?: number,\n    arg3?: SessionOptions,\n  ): Promise<InferenceSessionInterface> {\n    TRACE_FUNC_BEGIN();\n    // either load from a file or buffer\n    let filePathOrUint8Array: string | Uint8Array;\n    let options: SessionOptions = {};\n\n    if (typeof arg0 === 'string') {\n      filePathOrUint8Array = arg0;\n      if (typeof arg1 === 'object' && arg1 !== null) {\n        options = arg1;\n      } else if (typeof arg1 !== 'undefined') {\n        throw new TypeError(\"'options' must be an object.\");\n      }\n    } else if (arg0 instanceof Uint8Array) {\n      filePathOrUint8Array = arg0;\n      if (typeof arg1 === 'object' && arg1 !== null) {\n        options = arg1;\n      } else if (typeof arg1 !== 'undefined') {\n        throw new TypeError(\"'options' must be an object.\");\n      }\n    } else if (\n      arg0 instanceof ArrayBuffer ||\n      (typeof SharedArrayBuffer !== 'undefined' && arg0 instanceof SharedArrayBuffer)\n    ) {\n      const buffer = arg0;\n      let byteOffset = 0;\n      let byteLength = arg0.byteLength;\n      if (typeof arg1 === 'object' && arg1 !== null) {\n        options = arg1;\n      } else if (typeof arg1 === 'number') {\n        byteOffset = arg1;\n        if (!Number.isSafeInteger(byteOffset)) {\n          throw new RangeError(\"'byteOffset' must be an integer.\");\n        }\n        if (byteOffset < 0 || byteOffset >= buffer.byteLength) {\n          throw new RangeError(`'byteOffset' is out of range [0, ${buffer.byteLength}).`);\n        }\n        byteLength = arg0.byteLength - byteOffset;\n        if (typeof arg2 === 'number') {\n          byteLength = arg2;\n          if (!Number.isSafeInteger(byteLength)) {\n            throw new RangeError(\"'byteLength' must be an integer.\");\n          }\n          if (byteLength <= 0 || byteOffset + byteLength > buffer.byteLength) {\n            throw new RangeError(`'byteLength' is out of range (0, ${buffer.byteLength - byteOffset}].`);\n          }\n          if (typeof arg3 === 'object' && arg3 !== null) {\n            options = arg3;\n          } else if (typeof arg3 !== 'undefined') {\n            throw new TypeError(\"'options' must be an object.\");\n          }\n        } else if (typeof arg2 !== 'undefined') {\n          throw new TypeError(\"'byteLength' must be a number.\");\n        }\n      } else if (typeof arg1 !== 'undefined') {\n        throw new TypeError(\"'options' must be an object.\");\n      }\n      filePathOrUint8Array = new Uint8Array(buffer, byteOffset, byteLength);\n    } else {\n      throw new TypeError(\"Unexpected argument[0]: must be 'path' or 'buffer'.\");\n    }\n\n    // resolve backend, update session options with validated EPs, and create session handler\n    const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n    const handler = await backend.createInferenceSessionHandler(filePathOrUint8Array, optionsWithValidatedEPs);\n    TRACE_FUNC_END();\n    return new InferenceSession(handler);\n  }\n\n  startProfiling(): void {\n    this.handler.startProfiling();\n  }\n  endProfiling(): void {\n    this.handler.endProfiling();\n  }\n\n  get inputNames(): readonly string[] {\n    return this.handler.inputNames;\n  }\n  get outputNames(): readonly string[] {\n    return this.handler.outputNames;\n  }\n\n  private handler: InferenceSessionHandler;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { InferenceSession as InferenceSessionImpl } from './inference-session-impl.js';\nimport { OnnxModelOptions } from './onnx-model.js';\nimport { OnnxValue, OnnxValueDataLocation } from './onnx-value.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace InferenceSession {\n  // #region input/output types\n\n  type OnnxValueMapType = { readonly [name: string]: OnnxValue };\n  type NullableOnnxValueMapType = { readonly [name: string]: OnnxValue | null };\n\n  /**\n   * A feeds (model inputs) is an object that uses input names as keys and OnnxValue as corresponding values.\n   */\n  type FeedsType = OnnxValueMapType;\n\n  /**\n   * A fetches (model outputs) could be one of the following:\n   *\n   * - Omitted. Use model's output names definition.\n   * - An array of string indicating the output names.\n   * - An object that use output names as keys and OnnxValue or null as corresponding values.\n   *\n   * @remark\n   * different from input argument, in output, OnnxValue is optional. If an OnnxValue is present it will be\n   * used as a pre-allocated value by the inference engine; if omitted, inference engine will allocate buffer\n   * internally.\n   */\n  type FetchesType = readonly string[] | NullableOnnxValueMapType;\n\n  /**\n   * A inferencing return type is an object that uses output names as keys and OnnxValue as corresponding values.\n   */\n  type ReturnType = OnnxValueMapType;\n\n  // #endregion\n\n  // #region session options\n\n  /**\n   * A set of configurations for session behavior.\n   */\n  export interface SessionOptions extends OnnxModelOptions {\n    /**\n     * An array of execution provider options.\n     *\n     * An execution provider option can be a string indicating the name of the execution provider,\n     * or an object of corresponding type.\n     */\n    executionProviders?: readonly ExecutionProviderConfig[];\n\n    /**\n     * The intra OP threads number.\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n     */\n    intraOpNumThreads?: number;\n\n    /**\n     * The inter OP threads number.\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n     */\n    interOpNumThreads?: number;\n\n    /**\n     * The free dimension override.\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n     */\n    freeDimensionOverrides?: { readonly [dimensionName: string]: number };\n\n    /**\n     * The optimization level.\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n     */\n    graphOptimizationLevel?: 'disabled' | 'basic' | 'extended' | 'all';\n\n    /**\n     * Whether enable CPU memory arena.\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n     */\n    enableCpuMemArena?: boolean;\n\n    /**\n     * Whether enable memory pattern.\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n     */\n    enableMemPattern?: boolean;\n\n    /**\n     * Execution mode.\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n     */\n    executionMode?: 'sequential' | 'parallel';\n\n    /**\n     * Optimized model file path.\n     *\n     * If this setting is specified, the optimized model will be dumped. In browser, a blob will be created\n     * with a pop-up window.\n     */\n    optimizedModelFilePath?: string;\n\n    /**\n     * Whether enable profiling.\n     *\n     * This setting is a placeholder for a future use.\n     */\n    enableProfiling?: boolean;\n\n    /**\n     * File prefix for profiling.\n     *\n     * This setting is a placeholder for a future use.\n     */\n    profileFilePrefix?: string;\n\n    /**\n     * Log ID.\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n     */\n    logId?: string;\n\n    /**\n     * Log severity level. See\n     * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n     */\n    logSeverityLevel?: 0 | 1 | 2 | 3 | 4;\n\n    /**\n     * Log verbosity level.\n     *\n     * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n     */\n    logVerbosityLevel?: number;\n\n    /**\n     * Specify string as a preferred data location for all outputs, or an object that use output names as keys and a\n     * preferred data location as corresponding values.\n     *\n     * This setting is available only in ONNXRuntime Web for WebGL and WebGPU EP.\n     */\n    preferredOutputLocation?: OnnxValueDataLocation | { readonly [outputName: string]: OnnxValueDataLocation };\n\n    /**\n     * Whether enable graph capture.\n     * This setting is available only in ONNXRuntime Web for WebGPU EP.\n     */\n    enableGraphCapture?: boolean;\n\n    /**\n     * Store configurations for a session. See\n     * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n     * onnxruntime_session_options_config_keys.h\n     *\n     * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n     *\n     * @example\n     * ```js\n     * extra: {\n     *   session: {\n     *     set_denormal_as_zero: \"1\",\n     *     disable_prepacking: \"1\"\n     *   },\n     *   optimization: {\n     *     enable_gelu_approximation: \"1\"\n     *   }\n     * }\n     * ```\n     */\n    extra?: Record<string, unknown>;\n  }\n\n  // #region execution providers\n\n  // Currently, we have the following backends to support execution providers:\n  // Backend Node.js binding: supports 'cpu', 'dml' (win32), 'coreml' (macOS) and 'cuda' (linux).\n  // Backend WebAssembly: supports 'cpu', 'wasm', 'webgpu' and 'webnn'.\n  // Backend ONNX.js: supports 'webgl'.\n  // Backend React Native: supports 'cpu', 'xnnpack', 'coreml' (iOS), 'nnapi' (Android).\n  interface ExecutionProviderOptionMap {\n    coreml: CoreMLExecutionProviderOption;\n    cpu: CpuExecutionProviderOption;\n    cuda: CudaExecutionProviderOption;\n    dml: DmlExecutionProviderOption;\n    nnapi: NnapiExecutionProviderOption;\n    tensorrt: TensorRtExecutionProviderOption;\n    wasm: WebAssemblyExecutionProviderOption;\n    webgl: WebGLExecutionProviderOption;\n    webgpu: WebGpuExecutionProviderOption;\n    webnn: WebNNExecutionProviderOption;\n    qnn: QnnExecutionProviderOption;\n    xnnpack: XnnpackExecutionProviderOption;\n  }\n\n  type ExecutionProviderName = keyof ExecutionProviderOptionMap;\n  type ExecutionProviderConfig =\n    | ExecutionProviderOptionMap[ExecutionProviderName]\n    | ExecutionProviderOption\n    | ExecutionProviderName\n    | string;\n\n  export interface ExecutionProviderOption {\n    readonly name: string;\n  }\n  export interface CpuExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'cpu';\n    useArena?: boolean;\n  }\n  export interface CudaExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'cuda';\n    deviceId?: number;\n  }\n  export interface DmlExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'dml';\n    deviceId?: number;\n  }\n  export interface TensorRtExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'tensorrt';\n    deviceId?: number;\n  }\n  export interface WebAssemblyExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'wasm';\n  }\n  export interface WebGLExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'webgl';\n    // TODO: add flags\n  }\n  export interface XnnpackExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'xnnpack';\n  }\n  export interface WebGpuExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'webgpu';\n    preferredLayout?: 'NCHW' | 'NHWC';\n  }\n\n  // #region WebNN options\n\n  interface WebNNExecutionProviderName extends ExecutionProviderOption {\n    readonly name: 'webnn';\n  }\n\n  /**\n   * Represents a set of options for creating a WebNN MLContext.\n   *\n   * @see https://www.w3.org/TR/webnn/#dictdef-mlcontextoptions\n   */\n  export interface WebNNContextOptions {\n    deviceType?: 'cpu' | 'gpu' | 'npu';\n    numThreads?: number;\n    powerPreference?: 'default' | 'low-power' | 'high-performance';\n  }\n\n  /**\n   * Represents a set of options for WebNN execution provider without MLContext.\n   */\n  export interface WebNNOptionsWithoutMLContext extends WebNNExecutionProviderName, WebNNContextOptions {\n    context?: never;\n  }\n\n  /**\n   * Represents a set of options for WebNN execution provider with MLContext.\n   *\n   * When MLContext is provided, the deviceType is also required so that the WebNN EP can determine the preferred\n   * channel layout.\n   *\n   * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext\n   */\n  export interface WebNNOptionsWithMLContext\n    extends WebNNExecutionProviderName,\n      Omit<WebNNContextOptions, 'deviceType'>,\n      Required<Pick<WebNNContextOptions, 'deviceType'>> {\n    context: unknown /* MLContext */;\n  }\n\n  /**\n   * Represents a set of options for WebNN execution provider with MLContext which is created from GPUDevice.\n   *\n   * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext-gpudevice\n   */\n  export interface WebNNOptionsWebGpu extends WebNNExecutionProviderName {\n    context: unknown /* MLContext */;\n    gpuDevice: unknown /* GPUDevice */;\n  }\n\n  /**\n   * Options for WebNN execution provider.\n   */\n  export type WebNNExecutionProviderOption =\n    | WebNNOptionsWithoutMLContext\n    | WebNNOptionsWithMLContext\n    | WebNNOptionsWebGpu;\n\n  // #endregion\n\n  export interface QnnExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'qnn';\n    // TODO add flags\n  }\n  export interface CoreMLExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'coreml';\n    /**\n     * The bit flags for CoreML execution provider.\n     *\n     * ```\n     * COREML_FLAG_USE_CPU_ONLY = 0x001\n     * COREML_FLAG_ENABLE_ON_SUBGRAPH = 0x002\n     * COREML_FLAG_ONLY_ENABLE_DEVICE_WITH_ANE = 0x004\n     * COREML_FLAG_ONLY_ALLOW_STATIC_INPUT_SHAPES = 0x008\n     * COREML_FLAG_CREATE_MLPROGRAM = 0x010\n     * ```\n     *\n     * See include/onnxruntime/core/providers/coreml/coreml_provider_factory.h for more details.\n     *\n     * This flag is available only in ONNXRuntime (Node.js binding).\n     */\n    coreMlFlags?: number;\n    /**\n     * Specify whether to use CPU only in CoreML EP.\n     *\n     * This setting is available only in ONNXRuntime (react-native).\n     */\n    useCPUOnly?: boolean;\n    /**\n     * Specify whether to enable CoreML EP on subgraph.\n     *\n     * This setting is available only in ONNXRuntime (react-native).\n     */\n    enableOnSubgraph?: boolean;\n    /**\n     * Specify whether to only enable CoreML EP for Apple devices with ANE (Apple Neural Engine).\n     *\n     * This setting is available only in ONNXRuntime (react-native).\n     */\n    onlyEnableDeviceWithANE?: boolean;\n  }\n  export interface NnapiExecutionProviderOption extends ExecutionProviderOption {\n    readonly name: 'nnapi';\n    useFP16?: boolean;\n    useNCHW?: boolean;\n    cpuDisabled?: boolean;\n    cpuOnly?: boolean;\n  }\n  // #endregion\n\n  // #endregion\n\n  // #region run options\n\n  /**\n   * A set of configurations for inference run behavior\n   */\n  export interface RunOptions {\n    /**\n     * Log severity level. See\n     * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n     */\n    logSeverityLevel?: 0 | 1 | 2 | 3 | 4;\n\n    /**\n     * Log verbosity level.\n     *\n     * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n     */\n    logVerbosityLevel?: number;\n\n    /**\n     * Terminate all incomplete OrtRun calls as soon as possible if true\n     *\n     * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n     */\n    terminate?: boolean;\n\n    /**\n     * A tag for the Run() calls using this\n     *\n     * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n     */\n    tag?: string;\n\n    /**\n     * Set a single run configuration entry. See\n     * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n     * onnxruntime_run_options_config_keys.h\n     *\n     * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n     *\n     * @example\n     *\n     * ```js\n     * extra: {\n     *   memory: {\n     *     enable_memory_arena_shrinkage: \"1\",\n     *   }\n     * }\n     * ```\n     */\n    extra?: Record<string, unknown>;\n  }\n\n  // #endregion\n\n  // #region value metadata\n\n  // eslint-disable-next-line @typescript-eslint/no-empty-interface\n  interface ValueMetadata {\n    // TBD\n  }\n\n  // #endregion\n}\n\n/**\n * Represent a runtime instance of an ONNX model.\n */\nexport interface InferenceSession {\n  // #region run()\n\n  /**\n   * Execute the model asynchronously with the given feeds and options.\n   *\n   * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n   * @param options - Optional. A set of options that controls the behavior of model inference.\n   * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n   */\n  run(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions): Promise<InferenceSession.ReturnType>;\n\n  /**\n   * Execute the model asynchronously with the given feeds, fetches and options.\n   *\n   * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n   * @param fetches - Representation of the model output. See type description of `InferenceSession.OutputType` for\n   * detail.\n   * @param options - Optional. A set of options that controls the behavior of model inference.\n   * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n   */\n  run(\n    feeds: InferenceSession.FeedsType,\n    fetches: InferenceSession.FetchesType,\n    options?: InferenceSession.RunOptions,\n  ): Promise<InferenceSession.ReturnType>;\n\n  // #endregion\n\n  // #region release()\n\n  /**\n   * Release the inference session and the underlying resources.\n   */\n  release(): Promise<void>;\n\n  // #endregion\n\n  // #region profiling\n\n  /**\n   * Start profiling.\n   */\n  startProfiling(): void;\n\n  /**\n   * End profiling.\n   */\n  endProfiling(): void;\n\n  // #endregion\n\n  // #region metadata\n\n  /**\n   * Get input names of the loaded model.\n   */\n  readonly inputNames: readonly string[];\n\n  /**\n   * Get output names of the loaded model.\n   */\n  readonly outputNames: readonly string[];\n\n  // /**\n  //  * Get input metadata of the loaded model.\n  //  */\n  // readonly inputMetadata: ReadonlyArray<Readonly<InferenceSession.ValueMetadata>>;\n\n  // /**\n  //  * Get output metadata of the loaded model.\n  //  */\n  // readonly outputMetadata: ReadonlyArray<Readonly<InferenceSession.ValueMetadata>>;\n\n  // #endregion\n}\n\nexport interface InferenceSessionFactory {\n  // #region create()\n\n  /**\n   * Create a new inference session and load model asynchronously from an ONNX model file.\n   *\n   * @param uri - The URI or file path of the model to load.\n   * @param options - specify configuration for creating a new inference session.\n   * @returns A promise that resolves to an InferenceSession object.\n   */\n  create(uri: string, options?: InferenceSession.SessionOptions): Promise<InferenceSession>;\n\n  /**\n   * Create a new inference session and load model asynchronously from an array bufer.\n   *\n   * @param buffer - An ArrayBuffer representation of an ONNX model.\n   * @param options - specify configuration for creating a new inference session.\n   * @returns A promise that resolves to an InferenceSession object.\n   */\n  create(buffer: ArrayBufferLike, options?: InferenceSession.SessionOptions): Promise<InferenceSession>;\n\n  /**\n   * Create a new inference session and load model asynchronously from segment of an array bufer.\n   *\n   * @param buffer - An ArrayBuffer representation of an ONNX model.\n   * @param byteOffset - The beginning of the specified portion of the array buffer.\n   * @param byteLength - The length in bytes of the array buffer.\n   * @param options - specify configuration for creating a new inference session.\n   * @returns A promise that resolves to an InferenceSession object.\n   */\n  create(\n    buffer: ArrayBufferLike,\n    byteOffset: number,\n    byteLength?: number,\n    options?: InferenceSession.SessionOptions,\n  ): Promise<InferenceSession>;\n\n  /**\n   * Create a new inference session and load model asynchronously from a Uint8Array.\n   *\n   * @param buffer - A Uint8Array representation of an ONNX model.\n   * @param options - specify configuration for creating a new inference session.\n   * @returns A promise that resolves to an InferenceSession object.\n   */\n  create(buffer: Uint8Array, options?: InferenceSession.SessionOptions): Promise<InferenceSession>;\n\n  // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const InferenceSession: InferenceSessionFactory = InferenceSessionImpl;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { OptionsFormat, OptionsNormalizationParameters, OptionsTensorLayout } from './tensor-factory.js';\n\nexport interface TensorToDataUrlOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface TensorToImageDataOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface ConversionUtils {\n  /**\n   * creates a DataURL instance from tensor\n   *\n   * @param options - An optional object representing options for creating a DataURL instance from the tensor.\n   *\n   * The following default settings will be applied:\n   * - `format`: `'RGB'`\n   * - `tensorLayout`: `'NCHW'`\n   * @returns a DataURL string representing the image converted from tensor data\n   */\n  toDataURL(options?: TensorToDataUrlOptions): string;\n\n  /**\n   * creates an ImageData instance from tensor\n   *\n   * @param options - An optional object representing options for creating an ImageData instance from the tensor.\n   *\n   * The following default settings will be applied:\n   * - `format`: `'RGB'`\n   * - `tensorLayout`: `'NCHW'`\n   * @returns an ImageData instance representing the image converted from tensor data\n   */\n  toImageData(options?: TensorToImageDataOptions): ImageData;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor, TypedTensor } from './tensor.js';\n\nexport type ImageFormat = 'RGB' | 'RGBA' | 'BGR' | 'RBG';\nexport type ImageTensorLayout = 'NHWC' | 'NCHW';\n\n// the following region contains type definitions for constructing tensor from a specific location.\n\n// #region types for constructing a tensor from a specific location\n\n/**\n * represent common properties of the parameter for constructing a tensor from a specific location.\n */\ninterface CommonConstructorParameters<T> extends Pick<Tensor, 'dims'> {\n  /**\n   * Specify the data type of the tensor.\n   */\n  readonly type: T;\n}\n\n/**\n * represent the parameter for constructing a tensor from a GPU resource.\n */\ninterface GpuResourceConstructorParameters<T extends Tensor.Type> {\n  /**\n   * an optional callback function to download data from GPU to CPU.\n   *\n   * If not provided, the tensor treat the GPU data as external resource.\n   */\n  download?(): Promise<Tensor.DataTypeMap[T]>;\n\n  /**\n   * an optional callback function that will be called when the tensor is disposed.\n   *\n   * If not provided, the tensor treat the GPU data as external resource.\n   */\n  dispose?(): void;\n}\n\n/**\n * represent the parameter for constructing a tensor from a pinned CPU buffer\n */\nexport interface CpuPinnedConstructorParameters<T extends Tensor.CpuPinnedDataTypes = Tensor.CpuPinnedDataTypes>\n  extends CommonConstructorParameters<T> {\n  /**\n   * Specify the location of the data to be 'cpu-pinned'.\n   */\n  readonly location: 'cpu-pinned';\n  /**\n   * Specify the CPU pinned buffer that holds the tensor data.\n   */\n  readonly data: Tensor.DataTypeMap[T];\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGL texture\n */\nexport interface TextureConstructorParameters<T extends Tensor.TextureDataTypes = Tensor.TextureDataTypes>\n  extends CommonConstructorParameters<T>,\n    GpuResourceConstructorParameters<T> {\n  /**\n   * Specify the location of the data to be 'texture'.\n   */\n  readonly location: 'texture';\n  /**\n   * Specify the WebGL texture that holds the tensor data.\n   */\n  readonly texture: Tensor.TextureType;\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGPU buffer\n */\nexport interface GpuBufferConstructorParameters<T extends Tensor.GpuBufferDataTypes = Tensor.GpuBufferDataTypes>\n  extends CommonConstructorParameters<T>,\n    GpuResourceConstructorParameters<T> {\n  /**\n   * Specify the location of the data to be 'gpu-buffer'.\n   */\n  readonly location: 'gpu-buffer';\n  /**\n   * Specify the WebGPU buffer that holds the tensor data.\n   */\n  readonly gpuBuffer: Tensor.GpuBufferType;\n}\n\n// #endregion\n\n// the following region contains type definitions of each individual options.\n// the tensor factory functions use a composition of those options as the parameter type.\n\n// #region Options fields\n\nexport interface OptionsFormat {\n  /**\n   * Describes the image format represented in RGBA color space.\n   */\n  format?: ImageFormat;\n}\n\nexport interface OptionsTensorFormat {\n  /**\n   * Describes the image format of the tensor.\n   *\n   * NOTE: this is different from option 'format'. While option 'format' represents the original image, 'tensorFormat'\n   * represents the target format of the tensor. A transpose will be performed if they are different.\n   */\n  tensorFormat?: ImageFormat;\n}\n\nexport interface OptionsTensorDataType {\n  /**\n   * Describes the data type of the tensor.\n   */\n  dataType?: 'float32' | 'uint8';\n}\n\nexport interface OptionsTensorLayout {\n  /**\n   * Describes the tensor layout when representing data of one or more image(s).\n   */\n  tensorLayout?: ImageTensorLayout;\n}\n\nexport interface OptionsDimensions {\n  /**\n   * Describes the image height in pixel\n   */\n  height?: number;\n  /**\n   * Describes the image width in pixel\n   */\n  width?: number;\n}\n\nexport interface OptionResizedDimensions {\n  /**\n   * Describes the resized height. If omitted, original height will be used.\n   */\n  resizedHeight?: number;\n  /**\n   * Describes resized width - can be accessed via tensor dimensions as well\n   */\n  resizedWidth?: number;\n}\n\nexport interface OptionsNormalizationParameters {\n  /**\n   * Describes normalization parameters when preprocessing the image as model input.\n   *\n   * Data element are ranged from 0 to 255.\n   */\n  norm?: {\n    /**\n     * The 'bias' value for image normalization.\n     * - If omitted, use default value 0.\n     * - If it's a single number, apply to each channel\n     * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n     * for the corresponding image format\n     */\n    bias?: number | [number, number, number] | [number, number, number, number];\n    /**\n     * The 'mean' value for image normalization.\n     * - If omitted, use default value 255.\n     * - If it's a single number, apply to each channel\n     * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n     * for the corresponding image format\n     */\n    mean?: number | [number, number, number] | [number, number, number, number];\n  };\n}\n\n// #endregion\n\n// #region Options composition\n\nexport interface TensorFromImageDataOptions\n  extends OptionResizedDimensions,\n    OptionsTensorFormat,\n    OptionsTensorLayout,\n    OptionsTensorDataType,\n    OptionsNormalizationParameters {}\n\nexport interface TensorFromImageElementOptions\n  extends OptionResizedDimensions,\n    OptionsTensorFormat,\n    OptionsTensorLayout,\n    OptionsTensorDataType,\n    OptionsNormalizationParameters {}\n\nexport interface TensorFromUrlOptions\n  extends OptionsDimensions,\n    OptionResizedDimensions,\n    OptionsTensorFormat,\n    OptionsTensorLayout,\n    OptionsTensorDataType,\n    OptionsNormalizationParameters {}\n\nexport interface TensorFromImageBitmapOptions\n  extends OptionResizedDimensions,\n    OptionsTensorFormat,\n    OptionsTensorLayout,\n    OptionsTensorDataType,\n    OptionsNormalizationParameters {}\n\nexport interface TensorFromTextureOptions<T extends Tensor.TextureDataTypes>\n  extends Required<OptionsDimensions>,\n    OptionsFormat,\n    GpuResourceConstructorParameters<T> /* TODO: add more */ {}\n\nexport interface TensorFromGpuBufferOptions<T extends Tensor.GpuBufferDataTypes>\n  extends Pick<Tensor, 'dims'>,\n    GpuResourceConstructorParameters<T> {\n  /**\n   * Describes the data type of the tensor.\n   */\n  dataType?: T;\n}\n\n// #endregion\n\n/**\n * type TensorFactory defines the factory functions of 'Tensor' to create tensor instances from existing data or\n * resources.\n */\nexport interface TensorFactory {\n  /**\n   * create a tensor from an ImageData object\n   *\n   * @param imageData - the ImageData object to create tensor from\n   * @param options - An optional object representing options for creating tensor from ImageData.\n   *\n   * The following default settings will be applied:\n   * - `tensorFormat`: `'RGB'`\n   * - `tensorLayout`: `'NCHW'`\n   * - `dataType`: `'float32'`\n   * @returns A promise that resolves to a tensor object\n   */\n  fromImage(\n    imageData: ImageData,\n    options?: TensorFromImageDataOptions,\n  ): Promise<TypedTensor<'float32'> | TypedTensor<'uint8'>>;\n\n  /**\n   * create a tensor from a HTMLImageElement object\n   *\n   * @param imageElement - the HTMLImageElement object to create tensor from\n   * @param options - An optional object representing options for creating tensor from HTMLImageElement.\n   *\n   * The following default settings will be applied:\n   * - `tensorFormat`: `'RGB'`\n   * - `tensorLayout`: `'NCHW'`\n   * - `dataType`: `'float32'`\n   * @returns A promise that resolves to a tensor object\n   */\n  fromImage(\n    imageElement: HTMLImageElement,\n    options?: TensorFromImageElementOptions,\n  ): Promise<TypedTensor<'float32'> | TypedTensor<'uint8'>>;\n\n  /**\n   * create a tensor from URL\n   *\n   * @param urlSource - a string as a URL to the image or a data URL containing the image data.\n   * @param options - An optional object representing options for creating tensor from URL.\n   *\n   * The following default settings will be applied:\n   * - `tensorFormat`: `'RGB'`\n   * - `tensorLayout`: `'NCHW'`\n   * - `dataType`: `'float32'`\n   * @returns A promise that resolves to a tensor object\n   */\n  fromImage(urlSource: string, options?: TensorFromUrlOptions): Promise<TypedTensor<'float32'> | TypedTensor<'uint8'>>;\n\n  /**\n   * create a tensor from an ImageBitmap object\n   *\n   * @param bitmap - the ImageBitmap object to create tensor from\n   * @param options - An optional object representing options for creating tensor from URL.\n   *\n   * The following default settings will be applied:\n   * - `tensorFormat`: `'RGB'`\n   * - `tensorLayout`: `'NCHW'`\n   * - `dataType`: `'float32'`\n   * @returns A promise that resolves to a tensor object\n   */\n  fromImage(\n    bitmap: ImageBitmap,\n    options: TensorFromImageBitmapOptions,\n  ): Promise<TypedTensor<'float32'> | TypedTensor<'uint8'>>;\n\n  /**\n   * create a tensor from a WebGL texture\n   *\n   * @param texture - the WebGLTexture object to create tensor from\n   * @param options - An optional object representing options for creating tensor from WebGL texture.\n   *\n   * The options include following properties:\n   * - `width`: the width of the texture. Required.\n   * - `height`: the height of the texture. Required.\n   * - `format`: the format of the texture. If omitted, assume 'RGBA'.\n   * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n   * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n   * need to provide this function.\n   * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n   * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n   *\n   * @returns a tensor object\n   */\n  fromTexture<T extends Tensor.TextureDataTypes = 'float32'>(\n    texture: Tensor.TextureType,\n    options: TensorFromTextureOptions<T>,\n  ): TypedTensor<'float32'>;\n\n  /**\n   * create a tensor from a WebGPU buffer\n   *\n   * @param buffer - the GPUBuffer object to create tensor from\n   * @param options - An optional object representing options for creating tensor from WebGPU buffer.\n   *\n   * The options include following properties:\n   * - `dataType`: the data type of the tensor. If omitted, assume 'float32'.\n   * - `dims`: the dimension of the tensor. Required.\n   * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n   * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n   * need to provide this function.\n   * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n   * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n   *\n   * @returns a tensor object\n   */\n  fromGpuBuffer<T extends Tensor.GpuBufferDataTypes>(\n    buffer: Tensor.GpuBufferType,\n    options: TensorFromGpuBufferOptions<T>,\n  ): TypedTensor<T>;\n\n  /**\n   * create a tensor from a pre-allocated buffer. The buffer will be used as a pinned buffer.\n   *\n   * @param type - the tensor element type.\n   * @param buffer - a TypedArray corresponding to the type.\n   * @param dims - specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n   *\n   * @returns a tensor object\n   */\n  fromPinnedBuffer<T extends Exclude<Tensor.Type, 'string'>>(\n    type: T,\n    buffer: Tensor.DataTypeMap[T],\n    dims?: readonly number[],\n  ): TypedTensor<T>;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * A string that represents a file's URL or path.\n *\n * Path is vailable only in onnxruntime-node or onnxruntime-web running in Node.js.\n */\nexport type FileUrlOrPath = string;\n\n/**\n * A Blob object that represents a file.\n */\nexport type FileBlob = Blob;\n\n/**\n * A Uint8Array, ArrayBuffer or SharedArrayBuffer object that represents a file content.\n *\n * When it is an ArrayBuffer or SharedArrayBuffer, the whole buffer is assumed to be the file content.\n */\nexport type FileData = Uint8Array | ArrayBufferLike;\n\n/**\n * Represents a file that can be loaded by the ONNX Runtime JavaScript API.\n */\nexport type FileType = FileUrlOrPath | FileBlob | FileData;\n\n/**\n * Represents an external data file.\n */\nexport interface ExternalDataFileDescription {\n  /**\n   * Specify the external data file.\n   */\n  data: FileType;\n  /**\n   * Specify the file path.\n   */\n  path: string;\n}\n\n/**\n * Represents an external data file.\n *\n * When using a string, it should be a file URL or path that in the same directory as the model file.\n */\nexport type ExternalDataFileType = ExternalDataFileDescription | FileUrlOrPath;\n\n/**\n * Options for model loading.\n */\nexport interface OnnxModelOptions {\n  /**\n   * Specifying a list of files that represents the external data.\n   */\n  externalData?: readonly ExternalDataFileType[];\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from './tensor.js';\n\nexport type NonTensorType = never;\n\n/**\n * Type OnnxValue Represents both tensors and non-tensors value for model's inputs/outputs.\n *\n * NOTE: currently not support non-tensor\n */\nexport type OnnxValue = Tensor | NonTensorType;\n\n/**\n * Type OnnxValueDataLocation represents the location of the data of an OnnxValue.\n */\nexport type OnnxValueDataLocation = Tensor.DataLocation;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { resolveBackendAndExecutionProviders } from './backend-impl.js';\nimport { SessionHandler, TrainingSessionHandler } from './backend.js';\nimport { InferenceSession as InferenceSession } from './inference-session.js';\nimport { OnnxValue } from './onnx-value.js';\nimport { Tensor } from './tensor.js';\nimport { TrainingSession as TrainingSessionInterface, TrainingSessionCreateOptions } from './training-session.js';\n\ntype SessionOptions = InferenceSession.SessionOptions;\ntype FeedsType = InferenceSession.FeedsType;\ntype FetchesType = InferenceSession.FetchesType;\ntype ReturnType = InferenceSession.ReturnType;\ntype RunOptions = InferenceSession.RunOptions;\n\nconst noBackendErrMsg: string =\n  'Training backend could not be resolved. ' + \"Make sure you're using the correct configuration & WebAssembly files.\";\n\nexport class TrainingSession implements TrainingSessionInterface {\n  private constructor(handler: TrainingSessionHandler, hasOptimizerModel: boolean, hasEvalModel: boolean) {\n    this.handler = handler;\n    this.hasOptimizerModel = hasOptimizerModel;\n    this.hasEvalModel = hasEvalModel;\n  }\n  private handler: TrainingSessionHandler;\n  private hasOptimizerModel: boolean;\n  private hasEvalModel: boolean;\n\n  get trainingInputNames(): readonly string[] {\n    return this.handler.inputNames;\n  }\n  get trainingOutputNames(): readonly string[] {\n    return this.handler.outputNames;\n  }\n\n  get evalInputNames(): readonly string[] {\n    if (this.hasEvalModel) {\n      return this.handler.evalInputNames;\n    } else {\n      throw new Error('This training session has no evalModel loaded.');\n    }\n  }\n  get evalOutputNames(): readonly string[] {\n    if (this.hasEvalModel) {\n      return this.handler.evalOutputNames;\n    } else {\n      throw new Error('This training session has no evalModel loaded.');\n    }\n  }\n\n  static async create(\n    trainingOptions: TrainingSessionCreateOptions,\n    sessionOptions?: SessionOptions,\n  ): Promise<TrainingSession> {\n    const evalModel: string | Uint8Array = trainingOptions.evalModel || '';\n    const optimizerModel: string | Uint8Array = trainingOptions.optimizerModel || '';\n    const options: SessionOptions = sessionOptions || {};\n\n    // resolve backend, update session options with validated EPs, and create session handler\n    const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n    if (backend.createTrainingSessionHandler) {\n      const handler = await backend.createTrainingSessionHandler(\n        trainingOptions.checkpointState,\n        trainingOptions.trainModel,\n        evalModel,\n        optimizerModel,\n        optionsWithValidatedEPs,\n      );\n      return new TrainingSession(handler, !!trainingOptions.optimizerModel, !!trainingOptions.evalModel);\n    } else {\n      throw new Error(noBackendErrMsg);\n    }\n  }\n\n  /**\n   * Helper function for runTrainStep and future runStep methods that handles the type-narrowing conversion from\n   * the given parameters to SessionHandler.FetchesType and RunOptions.\n   *\n   * @param inputNames the feeds object is checked that they contain all input names in the provided list of input\n   * names.\n   * @param outputNames the fetches object is checked that their keys match up with valid names in the list of output\n   * names.\n   * @param feeds the required input\n   * @param arg1 narrowed & converted into the SessionHandler.FetchesType or RunOptions object\n   * @param arg2 optional RunOptions object.\n   * @returns\n   */\n  typeNarrowingForRunStep(\n    inputNames: readonly string[],\n    outputNames: readonly string[],\n    feeds: FeedsType,\n    arg1?: FetchesType | RunOptions,\n    arg2?: RunOptions,\n  ): [SessionHandler.FetchesType, RunOptions] {\n    const fetches: { [name: string]: OnnxValue | null } = {};\n    let options: RunOptions = {};\n    // check inputs\n    if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n      throw new TypeError(\n        \"'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.\",\n      );\n    }\n\n    let isFetchesEmpty = true;\n    // determine which override is being used\n    if (typeof arg1 === 'object') {\n      if (arg1 === null) {\n        throw new TypeError('Unexpected argument[1]: cannot be null.');\n      }\n      if (arg1 instanceof Tensor) {\n        throw new TypeError(\"'fetches' cannot be a Tensor\");\n      }\n\n      if (Array.isArray(arg1)) {\n        if (arg1.length === 0) {\n          throw new TypeError(\"'fetches' cannot be an empty array.\");\n        }\n        isFetchesEmpty = false;\n        // output names\n        for (const name of arg1) {\n          if (typeof name !== 'string') {\n            throw new TypeError(\"'fetches' must be a string array or an object.\");\n          }\n          if (outputNames.indexOf(name) === -1) {\n            throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n          }\n          fetches[name] = null;\n        }\n\n        if (typeof arg2 === 'object' && arg2 !== null) {\n          options = arg2;\n        } else if (typeof arg2 !== 'undefined') {\n          throw new TypeError(\"'options' must be an object.\");\n        }\n      } else {\n        // decide whether arg1 is fetches or options\n        // if any output name is present and its value is valid OnnxValue, we consider it fetches\n        let isFetches = false;\n        const arg1Keys = Object.getOwnPropertyNames(arg1);\n        for (const name of outputNames) {\n          if (arg1Keys.indexOf(name) !== -1) {\n            const v = (arg1 as InferenceSession.NullableOnnxValueMapType)[name];\n            if (v === null || v instanceof Tensor) {\n              isFetches = true;\n              isFetchesEmpty = false;\n              fetches[name] = v;\n            }\n          }\n        }\n\n        if (isFetches) {\n          if (typeof arg2 === 'object' && arg2 !== null) {\n            options = arg2;\n          } else if (typeof arg2 !== 'undefined') {\n            throw new TypeError(\"'options' must be an object.\");\n          }\n        } else {\n          options = arg1 as RunOptions;\n        }\n      }\n    } else if (typeof arg1 !== 'undefined') {\n      throw new TypeError(\"Unexpected argument[1]: must be 'fetches' or 'options'.\");\n    }\n\n    // check if all inputs are in feed\n    for (const name of inputNames) {\n      if (typeof feeds[name] === 'undefined') {\n        throw new Error(`input '${name}' is missing in 'feeds'.`);\n      }\n    }\n\n    // if no fetches is specified, we use the full output names list\n    if (isFetchesEmpty) {\n      for (const name of outputNames) {\n        fetches[name] = null;\n      }\n    }\n\n    return [fetches, options];\n  }\n\n  /**\n   * Helper method for runTrainStep and any other runStep methods. Takes the ReturnType result from the SessionHandler\n   * and changes it into a map of Tensors.\n   *\n   * @param results\n   * @returns\n   */\n  convertHandlerReturnTypeToMapOfTensors(results: SessionHandler.ReturnType): ReturnType {\n    const returnValue: { [name: string]: OnnxValue } = {};\n    for (const key in results) {\n      if (Object.hasOwnProperty.call(results, key)) {\n        const result = results[key];\n        if (result instanceof Tensor) {\n          returnValue[key] = result;\n        } else {\n          returnValue[key] = new Tensor(result.type, result.data, result.dims);\n        }\n      }\n    }\n    return returnValue;\n  }\n\n  async lazyResetGrad(): Promise<void> {\n    await this.handler.lazyResetGrad();\n  }\n\n  runTrainStep(feeds: FeedsType, options?: RunOptions): Promise<ReturnType>;\n  runTrainStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise<ReturnType>;\n  async runTrainStep(feeds: FeedsType, arg1?: FetchesType | RunOptions, arg2?: RunOptions): Promise<ReturnType> {\n    const [fetches, options] = this.typeNarrowingForRunStep(\n      this.trainingInputNames,\n      this.trainingOutputNames,\n      feeds,\n      arg1,\n      arg2,\n    );\n    const results = await this.handler.runTrainStep(feeds, fetches, options);\n    return this.convertHandlerReturnTypeToMapOfTensors(results);\n  }\n\n  async runOptimizerStep(options?: InferenceSession.RunOptions | undefined): Promise<void> {\n    if (this.hasOptimizerModel) {\n      await this.handler.runOptimizerStep(options || {});\n    } else {\n      throw new Error('This TrainingSession has no OptimizerModel loaded.');\n    }\n  }\n\n  runEvalStep(feeds: FeedsType, options?: RunOptions | undefined): Promise<ReturnType>;\n  runEvalStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions | undefined): Promise<ReturnType>;\n  async runEvalStep(feeds: FeedsType, arg1?: FetchesType | RunOptions, arg2?: RunOptions): Promise<ReturnType> {\n    if (this.hasEvalModel) {\n      const [fetches, options] = this.typeNarrowingForRunStep(\n        this.evalInputNames,\n        this.evalOutputNames,\n        feeds,\n        arg1,\n        arg2,\n      );\n      const results = await this.handler.runEvalStep(feeds, fetches, options);\n      return this.convertHandlerReturnTypeToMapOfTensors(results);\n    } else {\n      throw new Error('This TrainingSession has no EvalModel loaded.');\n    }\n  }\n\n  async getParametersSize(trainableOnly = true): Promise<number> {\n    return this.handler.getParametersSize(trainableOnly);\n  }\n\n  async loadParametersBuffer(array: Uint8Array, trainableOnly = true): Promise<void> {\n    const paramsSize = await this.getParametersSize(trainableOnly);\n    // checking that the size of the Uint8Array is equivalent to the byte length of a Float32Array of the number\n    // of parameters\n    if (array.length !== 4 * paramsSize) {\n      throw new Error(\n        'Size of the buffer passed into loadParametersBuffer must match the number of parameters in ' +\n          'the model. Please use getParametersSize method to check.',\n      );\n    }\n    return this.handler.loadParametersBuffer(array, trainableOnly);\n  }\n\n  async getContiguousParameters(trainableOnly = true): Promise<OnnxValue> {\n    return this.handler.getContiguousParameters(trainableOnly);\n  }\n\n  async release(): Promise<void> {\n    return this.handler.dispose();\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { InferenceSession } from './inference-session.js';\nimport { OnnxValue } from './onnx-value.js';\nimport { TrainingSession as TrainingSessionImpl } from './training-session-impl.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace TrainingSession {\n  /**\n   * Either URI file path (string) or Uint8Array containing model or checkpoint information.\n   */\n  type UriOrBuffer = string | Uint8Array;\n}\n\n/**\n * Represent a runtime instance of an ONNX training session,\n * which contains a model that can be trained, and, optionally,\n * an eval and optimizer model.\n */\nexport interface TrainingSession {\n  // #region run()\n\n  /**\n   * Lazily resets the gradients of all trainable parameters to zero. Should happen after the invocation of\n   * runOptimizerStep.\n   */\n  lazyResetGrad(): Promise<void>;\n\n  /**\n   * Run TrainStep asynchronously with the given feeds and options.\n   *\n   * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for\n   detail.\n   * @param options - Optional. A set of options that controls the behavior of model training.\n   * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n   */\n  runTrainStep(\n    feeds: InferenceSession.FeedsType,\n    options?: InferenceSession.RunOptions,\n  ): Promise<InferenceSession.ReturnType>;\n\n  /**\n   * Run a single train step with the given inputs and options.\n   *\n   * @param feeds - Representation of the model input.\n   * @param fetches - Representation of the model output.\n   * detail.\n   * @param options - Optional. A set of options that controls the behavior of model training.\n   * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n   values.\n   */\n  runTrainStep(\n    feeds: InferenceSession.FeedsType,\n    fetches: InferenceSession.FetchesType,\n    options?: InferenceSession.RunOptions,\n  ): Promise<InferenceSession.ReturnType>;\n\n  /**\n   * Runs a single optimizer step, which performs weight updates for the trainable parameters using the optimizer model.\n   *\n   * @param options - Optional. A set of options that controls the behavior of model optimizing.\n   */\n  runOptimizerStep(options?: InferenceSession.RunOptions): Promise<void>;\n\n  /**\n   * Run a single eval step with the given inputs and options using the eval model.\n   *\n   * @param feeds - Representation of the model input.\n   * @param options - Optional. A set of options that controls the behavior of model eval step.\n   * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n   values.\n   */\n  runEvalStep(\n    feeds: InferenceSession.FeedsType,\n    options?: InferenceSession.RunOptions,\n  ): Promise<InferenceSession.ReturnType>;\n\n  /**\n   * Run a single eval step with the given inputs and options using the eval model.\n   *\n   * @param feeds - Representation of the model input.\n   * @param fetches - Representation of the model output.\n   * detail.\n   * @param options - Optional. A set of options that controls the behavior of model eval step.\n   * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n   values.\n   */\n  runEvalStep(\n    feeds: InferenceSession.FeedsType,\n    fetches: InferenceSession.FetchesType,\n    options?: InferenceSession.RunOptions,\n  ): Promise<InferenceSession.ReturnType>;\n\n  // #endregion\n\n  // #region copy parameters\n\n  /**\n   * Retrieves the size of all parameters for the training state. Calculates the total number of primitive (datatype of\n   * the parameters) elements of all the parameters in the training state.\n   *\n   * @param trainableOnly - When set to true, the size is calculated for trainable params only. Default value is true.\n   */\n  getParametersSize(trainableOnly: boolean): Promise<number>;\n\n  /**\n   * Copies parameter values from the given buffer to the training state. Currently, only supporting models with\n   * parameters of type Float32.\n   *\n   * @param buffer - A Uint8Array representation of Float32 parameters.\n   * @param trainableOnly - True if trainable parameters only to be modified, false otherwise. Default value is true.\n   */\n  loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise<void>;\n\n  /**\n   * Copies the model parameters to a contiguous buffer. Usually used in the context of Federated Learning.\n   * Currently, only supporting models with parameters of type Float32.\n   *\n   * @param trainableOnly - When set to true, only trainable parameters are copied. Trainable parameters are parameters\n   * for which requires_grad is set to true. Default value is true.\n   * @returns A promise that resolves to a Float32 OnnxValue of the requested parameters.\n   */\n  getContiguousParameters(trainableOnly: boolean): Promise<OnnxValue>;\n  // #endregion\n\n  // #region release()\n\n  /**\n   * Release the inference session and the underlying resources.\n   */\n  release(): Promise<void>;\n  // #endregion\n\n  // #region metadata\n\n  /**\n   * Get input names of the loaded training model.\n   */\n  readonly trainingInputNames: readonly string[];\n\n  /**\n   * Get output names of the loaded training model.\n   */\n  readonly trainingOutputNames: readonly string[];\n\n  /**\n   * Get input names of the loaded eval model. Is an empty array if no eval model is loaded.\n   */\n  readonly evalInputNames: readonly string[];\n\n  /**\n   * Get output names of the loaded eval model. Is an empty array if no eval model is loaded.\n   */\n  readonly evalOutputNames: readonly string[];\n\n  // #endregion\n}\n\n/**\n * Represents the optional parameters that can be passed into the TrainingSessionFactory.\n */\nexport interface TrainingSessionCreateOptions {\n  /**\n   * URI or buffer for a .ckpt file that contains the checkpoint for the training model.\n   */\n  checkpointState: TrainingSession.UriOrBuffer;\n  /**\n   * URI or buffer for the .onnx training file.\n   */\n  trainModel: TrainingSession.UriOrBuffer;\n  /**\n   * Optional. URI or buffer for the .onnx optimizer model file.\n   */\n  optimizerModel?: TrainingSession.UriOrBuffer;\n  /**\n   * Optional. URI or buffer for the .onnx eval model file.\n   */\n  evalModel?: TrainingSession.UriOrBuffer;\n}\n\n/**\n * Defines method overload possibilities for creating a TrainingSession.\n */\nexport interface TrainingSessionFactory {\n  // #region create()\n\n  /**\n   * Creates a new TrainingSession and asynchronously loads any models passed in through trainingOptions\n   *\n   * @param trainingOptions specify models and checkpoints to load into the Training Session\n   * @param sessionOptions specify configuration for training session behavior\n   *\n   * @returns Promise that resolves to a TrainingSession object\n   */\n  create(\n    trainingOptions: TrainingSessionCreateOptions,\n    sessionOptions?: InferenceSession.SessionOptions,\n  ): Promise<TrainingSession>;\n\n  // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TrainingSession: TrainingSessionFactory = TrainingSessionImpl;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * # ONNX Runtime JavaScript API\n *\n * ONNX Runtime JavaScript API is a unified API for all JavaScript usages, including the following NPM packages:\n *\n * - [onnxruntime-node](https://www.npmjs.com/package/onnxruntime-node)\n * - [onnxruntime-web](https://www.npmjs.com/package/onnxruntime-web)\n * - [onnxruntime-react-native](https://www.npmjs.com/package/onnxruntime-react-native)\n *\n * See also:\n * - [Get Started](https://onnxruntime.ai/docs/get-started/with-javascript/)\n * - [Inference examples](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/js)\n *\n * @packageDocumentation\n */\n\nexport * from './backend.js';\nexport * from './env.js';\nexport * from './inference-session.js';\nexport * from './tensor.js';\nexport * from './tensor-conversion.js';\nexport * from './tensor-factory.js';\nexport * from './trace.js';\nexport * from './onnx-model.js';\nexport * from './onnx-value.js';\nexport * from './training-session.js';\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Env } from 'onnxruntime-common';\n\nimport { WebGLContext } from './backends/webgl/webgl-context';\n\nexport declare namespace Logger {\n  export interface SeverityTypeMap {\n    verbose: 'v';\n    info: 'i';\n    warning: 'w';\n    error: 'e';\n    fatal: 'f';\n  }\n\n  export type Severity = keyof SeverityTypeMap;\n\n  export type Provider = 'none' | 'console';\n\n  /**\n   * Logging config that used to control the behavior of logger\n   */\n  export interface Config {\n    /**\n     * Specify the logging provider. 'console' by default\n     */\n    provider?: Provider;\n    /**\n     * Specify the minimal logger serverity. 'warning' by default\n     */\n    minimalSeverity?: Logger.Severity;\n    /**\n     * Whether to output date time in log. true by default\n     */\n    logDateTime?: boolean;\n    /**\n     * Whether to output source information (Not yet supported). false by default\n     */\n    logSourceLocation?: boolean;\n  }\n\n  export interface CategorizedLogger {\n    verbose(content: string): void;\n    info(content: string): void;\n    warning(content: string): void;\n    error(content: string): void;\n    fatal(content: string): void;\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport interface Logger {\n  (category: string): Logger.CategorizedLogger;\n\n  verbose(content: string): void;\n  verbose(category: string, content: string): void;\n  info(content: string): void;\n  info(category: string, content: string): void;\n  warning(content: string): void;\n  warning(category: string, content: string): void;\n  error(content: string): void;\n  error(category: string, content: string): void;\n  fatal(content: string): void;\n  fatal(category: string, content: string): void;\n\n  /**\n   * Reset the logger configuration.\n   * @param config specify an optional default config\n   */\n  reset(config?: Logger.Config): void;\n  /**\n   * Set the logger's behavior on the given category\n   * @param category specify a category string. If '*' is specified, all previous configuration will be overwritten. If\n   * '' is specified, the default behavior will be updated.\n   * @param config the config object to indicate the logger's behavior\n   */\n  set(category: string, config: Logger.Config): void;\n\n  /**\n   * Set the logger's behavior from ort-common env\n   * @param env the env used to set logger. Currently only setting loglevel is supported through Env.\n   */\n  setWithEnv(env: Env): void;\n}\n\ninterface LoggerProvider {\n  log(severity: Logger.Severity, content: string, category?: string): void;\n}\nclass NoOpLoggerProvider implements LoggerProvider {\n  log(_severity: Logger.Severity, _content: string, _category?: string) {\n    // do nothing\n  }\n}\nclass ConsoleLoggerProvider implements LoggerProvider {\n  log(severity: Logger.Severity, content: string, category?: string) {\n    // eslint-disable-next-line no-console\n    console.log(`${this.color(severity)} ${category ? '\\x1b[35m' + category + '\\x1b[0m ' : ''}${content}`);\n  }\n\n  private color(severity: Logger.Severity) {\n    switch (severity) {\n      case 'verbose':\n        return '\\x1b[34;40mv\\x1b[0m';\n      case 'info':\n        return '\\x1b[32mi\\x1b[0m';\n      case 'warning':\n        return '\\x1b[30;43mw\\x1b[0m';\n      case 'error':\n        return '\\x1b[31;40me\\x1b[0m';\n      case 'fatal':\n        return '\\x1b[101mf\\x1b[0m';\n      default:\n        throw new Error(`unsupported severity: ${severity}`);\n    }\n  }\n}\n\nconst SEVERITY_VALUE = {\n  verbose: 1000,\n  info: 2000,\n  warning: 4000,\n  error: 5000,\n  fatal: 6000,\n};\n\nconst LOGGER_PROVIDER_MAP: { readonly [provider: string]: Readonly<LoggerProvider> } = {\n  ['none']: new NoOpLoggerProvider(),\n  ['console']: new ConsoleLoggerProvider(),\n};\nconst LOGGER_DEFAULT_CONFIG = {\n  provider: 'console',\n  minimalSeverity: 'warning',\n  logDateTime: true,\n  logSourceLocation: false,\n};\nlet LOGGER_CONFIG_MAP: { [category: string]: Readonly<Required<Logger.Config>> } = {\n  ['']: LOGGER_DEFAULT_CONFIG as Required<Logger.Config>,\n};\n\nfunction log(category: string): Logger.CategorizedLogger;\nfunction log(severity: Logger.Severity, content: string): void;\nfunction log(severity: Logger.Severity, category: string, content: string): void;\nfunction log(severity: Logger.Severity, arg1: string, arg2?: string): void;\nfunction log(\n  arg0: string | Logger.Severity,\n  arg1?: string,\n  arg2?: string | number,\n  arg3?: number,\n): Logger.CategorizedLogger | void {\n  if (arg1 === undefined) {\n    // log(category: string): Logger.CategorizedLogger;\n    return createCategorizedLogger(arg0);\n  } else if (arg2 === undefined) {\n    // log(severity, content);\n    logInternal(arg0 as Logger.Severity, arg1, 1);\n  } else if (typeof arg2 === 'number' && arg3 === undefined) {\n    // log(severity, content, stack)\n    logInternal(arg0 as Logger.Severity, arg1, arg2);\n  } else if (typeof arg2 === 'string' && arg3 === undefined) {\n    // log(severity, category, content)\n    logInternal(arg0 as Logger.Severity, arg2, 1, arg1);\n  } else if (typeof arg2 === 'string' && typeof arg3 === 'number') {\n    // log(severity, category, content, stack)\n    logInternal(arg0 as Logger.Severity, arg2, arg3, arg1);\n  } else {\n    throw new TypeError('input is valid');\n  }\n}\n\nfunction createCategorizedLogger(category: string): Logger.CategorizedLogger {\n  return {\n    verbose: log.verbose.bind(null, category),\n    info: log.info.bind(null, category),\n    warning: log.warning.bind(null, category),\n    error: log.error.bind(null, category),\n    fatal: log.fatal.bind(null, category),\n  };\n}\n\n// NOTE: argument 'category' is put the last parameter beacause typescript\n// doesn't allow optional argument put in front of required argument. This\n// order is different from a usual logging API.\nfunction logInternal(severity: Logger.Severity, content: string, _stack: number, category?: string) {\n  const config = LOGGER_CONFIG_MAP[category || ''] || LOGGER_CONFIG_MAP[''];\n  if (SEVERITY_VALUE[severity] < SEVERITY_VALUE[config.minimalSeverity]) {\n    return;\n  }\n\n  if (config.logDateTime) {\n    content = `${new Date().toISOString()}|${content}`;\n  }\n\n  if (config.logSourceLocation) {\n    // TODO: calculate source location from 'stack'\n  }\n\n  LOGGER_PROVIDER_MAP[config.provider].log(severity, content, category);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace log {\n  export function verbose(content: string): void;\n  export function verbose(category: string, content: string): void;\n  export function verbose(arg0: string, arg1?: string) {\n    log('verbose', arg0, arg1);\n  }\n  export function info(content: string): void;\n  export function info(category: string, content: string): void;\n  export function info(arg0: string, arg1?: string) {\n    log('info', arg0, arg1);\n  }\n  export function warning(content: string): void;\n  export function warning(category: string, content: string): void;\n  export function warning(arg0: string, arg1?: string) {\n    log('warning', arg0, arg1);\n  }\n  export function error(content: string): void;\n  export function error(category: string, content: string): void;\n  export function error(arg0: string, arg1?: string) {\n    log('error', arg0, arg1);\n  }\n  export function fatal(content: string): void;\n  export function fatal(category: string, content: string): void;\n  export function fatal(arg0: string, arg1?: string) {\n    log('fatal', arg0, arg1);\n  }\n\n  export function reset(config?: Logger.Config): void {\n    LOGGER_CONFIG_MAP = {};\n    set('', config || {});\n  }\n  export function set(category: string, config: Logger.Config): void {\n    if (category === '*') {\n      reset(config);\n    } else {\n      const previousConfig = LOGGER_CONFIG_MAP[category] || LOGGER_DEFAULT_CONFIG;\n      LOGGER_CONFIG_MAP[category] = {\n        provider: config.provider || previousConfig.provider,\n        minimalSeverity: config.minimalSeverity || previousConfig.minimalSeverity,\n        logDateTime: config.logDateTime === undefined ? previousConfig.logDateTime : config.logDateTime,\n        logSourceLocation:\n          config.logSourceLocation === undefined ? previousConfig.logSourceLocation : config.logSourceLocation,\n      };\n    }\n\n    // TODO: we want to support wildcard or regex?\n  }\n\n  export function setWithEnv(env: Env): void {\n    const config: Logger.Config = {};\n    if (env.logLevel) {\n      config.minimalSeverity = env.logLevel as Logger.Severity;\n    }\n    set('', config);\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare, @typescript-eslint/naming-convention\nexport const Logger: Logger = log;\n\nexport declare namespace Profiler {\n  export interface Config {\n    maxNumberEvents?: number;\n    flushBatchSize?: number;\n    flushIntervalInMilliseconds?: number;\n  }\n\n  export type EventCategory = 'session' | 'node' | 'op' | 'backend';\n\n  export interface Event {\n    end(): void | Promise<void>;\n  }\n}\n// TODO\n// class WebGLEvent implements Profiler.Event {}\n\nclass Event implements Profiler.Event {\n  constructor(\n    public category: Profiler.EventCategory,\n    public name: string,\n    public startTime: number,\n    private endCallback: (e: Event) => void | Promise<void>,\n    public timer?: WebGLQuery,\n    public ctx?: WebGLContext,\n  ) {}\n\n  async end() {\n    return this.endCallback(this);\n  }\n\n  async checkTimer(): Promise<number> {\n    if (this.ctx === undefined || this.timer === undefined) {\n      throw new Error('No webgl timer found');\n    } else {\n      this.ctx.endTimer();\n      return this.ctx.waitForQueryAndGetTime(this.timer);\n    }\n  }\n}\n\nclass EventRecord {\n  constructor(\n    public category: Profiler.EventCategory,\n    public name: string,\n    public startTime: number,\n    public endTime: number,\n  ) {}\n}\n\nexport class Profiler {\n  static create(config?: Profiler.Config): Profiler {\n    if (config === undefined) {\n      return new this();\n    }\n    return new this(config.maxNumberEvents, config.flushBatchSize, config.flushIntervalInMilliseconds);\n  }\n\n  private constructor(maxNumberEvents?: number, flushBatchSize?: number, flushIntervalInMilliseconds?: number) {\n    this._started = false;\n    this._maxNumberEvents = maxNumberEvents === undefined ? 10000 : maxNumberEvents;\n    this._flushBatchSize = flushBatchSize === undefined ? 10 : flushBatchSize;\n    this._flushIntervalInMilliseconds = flushIntervalInMilliseconds === undefined ? 5000 : flushIntervalInMilliseconds;\n  }\n\n  // start profiling\n  start() {\n    this._started = true;\n    this._timingEvents = [];\n    this._flushTime = now();\n    this._flushPointer = 0;\n  }\n\n  // stop profiling\n  stop() {\n    this._started = false;\n    for (; this._flushPointer < this._timingEvents.length; this._flushPointer++) {\n      this.logOneEvent(this._timingEvents[this._flushPointer]);\n    }\n  }\n\n  // create an event scope for the specific function\n  event<T>(category: Profiler.EventCategory, name: string, func: () => T, ctx?: WebGLContext): T;\n  event<T>(category: Profiler.EventCategory, name: string, func: () => Promise<T>, ctx?: WebGLContext): Promise<T>;\n\n  event<T>(\n    category: Profiler.EventCategory,\n    name: string,\n    func: () => T | Promise<T>,\n    ctx?: WebGLContext,\n  ): T | Promise<T> {\n    const event = this._started ? this.begin(category, name, ctx) : undefined;\n    let isPromise = false;\n\n    const res = func();\n\n    // we consider a then-able object is a promise\n    if (res && typeof (res as Promise<T>).then === 'function') {\n      isPromise = true;\n      return new Promise<T>((resolve, reject) => {\n        (res as Promise<T>).then(\n          async (value) => {\n            // fulfilled\n            if (event) {\n              await event.end();\n            }\n            resolve(value);\n          },\n          async (reason) => {\n            // rejected\n            if (event) {\n              await event.end();\n            }\n            reject(reason);\n          },\n        );\n      });\n    }\n    if (!isPromise && event) {\n      const eventRes = event.end();\n      if (eventRes && typeof eventRes.then === 'function') {\n        return new Promise<T>((resolve, reject) => {\n          eventRes.then(\n            () => {\n              // fulfilled\n              resolve(res);\n            },\n            (reason) => {\n              // rejected\n              reject(reason);\n            },\n          );\n        });\n      }\n    }\n    return res;\n  }\n\n  // begin an event\n  begin(category: Profiler.EventCategory, name: string, ctx?: WebGLContext): Event {\n    if (!this._started) {\n      throw new Error('profiler is not started yet');\n    }\n    if (ctx === undefined) {\n      const startTime = now();\n      this.flush(startTime);\n      return new Event(category, name, startTime, (e) => this.endSync(e));\n    } else {\n      const timer: WebGLQuery = ctx.beginTimer();\n      return new Event(category, name, 0, async (e) => this.end(e), timer, ctx);\n    }\n  }\n\n  // end the specific event\n  private async end(event: Event): Promise<void> {\n    const endTime: number = await event.checkTimer();\n    if (this._timingEvents.length < this._maxNumberEvents) {\n      this._timingEvents.push(new EventRecord(event.category, event.name, event.startTime, endTime));\n      this.flush(endTime);\n    }\n  }\n\n  private endSync(event: Event): void {\n    const endTime: number = now();\n    if (this._timingEvents.length < this._maxNumberEvents) {\n      this._timingEvents.push(new EventRecord(event.category, event.name, event.startTime, endTime));\n      this.flush(endTime);\n    }\n  }\n\n  private logOneEvent(event: EventRecord) {\n    Logger.verbose(\n      `Profiler.${event.category}`,\n      `${(event.endTime - event.startTime).toFixed(2)}ms on event '${event.name}' at ${event.endTime.toFixed(2)}`,\n    );\n  }\n\n  private flush(currentTime: number) {\n    if (\n      this._timingEvents.length - this._flushPointer >= this._flushBatchSize ||\n      currentTime - this._flushTime >= this._flushIntervalInMilliseconds\n    ) {\n      // should flush when either batch size accumlated or interval elepsed\n\n      for (\n        const previousPointer = this._flushPointer;\n        this._flushPointer < previousPointer + this._flushBatchSize && this._flushPointer < this._timingEvents.length;\n        this._flushPointer++\n      ) {\n        this.logOneEvent(this._timingEvents[this._flushPointer]);\n      }\n\n      this._flushTime = now();\n    }\n  }\n\n  get started() {\n    return this._started;\n  }\n  private _started = false;\n  private _timingEvents: EventRecord[];\n\n  private readonly _maxNumberEvents: number;\n\n  private readonly _flushBatchSize: number;\n  private readonly _flushIntervalInMilliseconds: number;\n\n  private _flushTime: number;\n  private _flushPointer = 0;\n}\n\n/**\n * returns a number to represent the current timestamp in a resolution as high as possible.\n */\nexport const now = typeof performance !== 'undefined' && performance.now ? () => performance.now() : Date.now;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Graph } from './graph';\nimport { OperatorImplementation, OperatorInitialization } from './operators';\n\nexport interface OpSet {\n  domain: string;\n  version: number;\n}\nexport declare namespace OpSet {\n  /**\n   * Domain of an opset, it can be an empty string(default value, represent for ai.onnx), or 'ai.onnx.ml'\n   */\n  type Domain = '' | 'ai.onnx.ml' | 'com.microsoft';\n  /**\n   * A resolve rule consists of 4 or 5 items: opType, opSetDomain, versionSelector, operatorImplementation and\n   * operatorInitialization (optional)\n   */\n  type ResolveRule =\n    | [string, Domain, string, OperatorImplementation<Graph.Node>]\n    | [string, Domain, string, OperatorImplementation<unknown>, OperatorInitialization<unknown>];\n}\n\nexport function resolveOperator(node: Graph.Node, opsets: readonly OpSet[], rules: readonly OpSet.ResolveRule[]) {\n  for (const rule of rules) {\n    const opType = rule[0];\n    const domain = rule[1];\n    const versionSelector = rule[2];\n    const opImpl = rule[3];\n    const opInit = rule[4];\n\n    if (node.opType === opType) {\n      // operator type matches\n      for (const opset of opsets) {\n        // opset '' and 'ai.onnx' are considered the same.\n        if (opset.domain === domain || (opset.domain === 'ai.onnx' && domain === '')) {\n          // opset domain found\n          if (matchSelector(opset.version, versionSelector)) {\n            return { opImpl, opInit };\n          }\n        }\n      }\n    }\n  }\n\n  throw new TypeError(\n    `cannot resolve operator '${node.opType}' with opsets: ${opsets\n      .map((set) => `${set.domain || 'ai.onnx'} v${set.version}`)\n      .join(', ')}`,\n  );\n}\n\nfunction matchSelector(version: number, selector: string): boolean {\n  if (selector.endsWith('+')) {\n    // minimum version match ('7+' expects version>=7)\n    const rangeStart = Number.parseInt(selector.substring(0, selector.length - 1), 10);\n    return !isNaN(rangeStart) && rangeStart <= version;\n  } else if (selector.split('-').length === 2) {\n    // range match ('6-8' expects 6<=version<=8)\n    const pair = selector.split('-');\n    const rangeStart = Number.parseInt(pair[0], 10);\n    const rangeEnd = Number.parseInt(pair[1], 10);\n    return !isNaN(rangeStart) && !isNaN(rangeEnd) && rangeStart <= version && version <= rangeEnd;\n  } else {\n    // exact match ('7' expects version===7)\n    return Number.parseInt(selector, 10) === version;\n  }\n}\n","\"use strict\";\r\nexports.__esModule = true;\r\nvar Guid = /** @class */ (function () {\r\n    function Guid(guid) {\r\n        if (!guid) {\r\n            throw new TypeError(\"Invalid argument; `value` has no value.\");\r\n        }\r\n        this.value = Guid.EMPTY;\r\n        if (guid && Guid.isGuid(guid)) {\r\n            this.value = guid;\r\n        }\r\n    }\r\n    Guid.isGuid = function (guid) {\r\n        var value = guid.toString();\r\n        return guid && (guid instanceof Guid || Guid.validator.test(value));\r\n    };\r\n    Guid.create = function () {\r\n        return new Guid([Guid.gen(2), Guid.gen(1), Guid.gen(1), Guid.gen(1), Guid.gen(3)].join(\"-\"));\r\n    };\r\n    Guid.createEmpty = function () {\r\n        return new Guid(\"emptyguid\");\r\n    };\r\n    Guid.parse = function (guid) {\r\n        return new Guid(guid);\r\n    };\r\n    Guid.raw = function () {\r\n        return [Guid.gen(2), Guid.gen(1), Guid.gen(1), Guid.gen(1), Guid.gen(3)].join(\"-\");\r\n    };\r\n    Guid.gen = function (count) {\r\n        var out = \"\";\r\n        for (var i = 0; i < count; i++) {\r\n            // tslint:disable-next-line:no-bitwise\r\n            out += (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\r\n        }\r\n        return out;\r\n    };\r\n    Guid.prototype.equals = function (other) {\r\n        // Comparing string `value` against provided `guid` will auto-call\r\n        // toString on `guid` for comparison\r\n        return Guid.isGuid(other) && this.value === other.toString();\r\n    };\r\n    Guid.prototype.isEmpty = function () {\r\n        return this.value === Guid.EMPTY;\r\n    };\r\n    Guid.prototype.toString = function () {\r\n        return this.value;\r\n    };\r\n    Guid.prototype.toJSON = function () {\r\n        return {\r\n            value: this.value\r\n        };\r\n    };\r\n    Guid.validator = new RegExp(\"^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$\", \"i\");\r\n    Guid.EMPTY = \"00000000-0000-0000-0000-000000000000\";\r\n    return Guid;\r\n}());\r\nexports.Guid = Guid;\r\n","/**\n * @license\n * Copyright 2009 The Closure Library Authors\n * Copyright 2020 Daniel Wirtz / The long.js Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// WebAssembly optimizations to do native i64 multiplication and divide\nvar wasm = null;\ntry {\n  wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\n    0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\n  ])), {}).exports;\n} catch (e) {\n  // no wasm support :(\n}\n\n/**\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\n *  See the from* functions below for more convenient ways of constructing Longs.\n * @exports Long\n * @class A Long class for representing a 64 bit two's-complement integer value.\n * @param {number} low The low (signed) 32 bits of the long\n * @param {number} high The high (signed) 32 bits of the long\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @constructor\n */\nfunction Long(low, high, unsigned) {\n\n  /**\n   * The low 32 bits as a signed value.\n   * @type {number}\n   */\n  this.low = low | 0;\n\n  /**\n   * The high 32 bits as a signed value.\n   * @type {number}\n   */\n  this.high = high | 0;\n\n  /**\n   * Whether unsigned or not.\n   * @type {boolean}\n   */\n  this.unsigned = !!unsigned;\n}\n\n// The internal representation of a long is the two given signed, 32-bit values.\n// We use 32-bit pieces because these are the size of integers on which\n// Javascript performs bit-operations.  For operations like addition and\n// multiplication, we split each number into 16 bit pieces, which can easily be\n// multiplied within Javascript's floating-point representation without overflow\n// or change in sign.\n//\n// In the algorithms below, we frequently reduce the negative case to the\n// positive case by negating the input(s) and then post-processing the result.\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n// a positive number, it overflows back into a negative).  Not handling this\n// case would often result in infinite recursion.\n//\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\n// methods on which they depend.\n\n/**\n * An indicator used to reliably determine if an object is a Long or not.\n * @type {boolean}\n * @const\n * @private\n */\nLong.prototype.__isLong__;\n\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\n\n/**\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n * @inner\n */\nfunction isLong(obj) {\n  return (obj && obj[\"__isLong__\"]) === true;\n}\n\n/**\n * @function\n * @param {*} value number\n * @returns {number}\n * @inner\n */\nfunction ctz32(value) {\n  var c = Math.clz32(value & -value);\n  return value ? 31 - c : c;\n}\n\n/**\n * Tests if the specified object is a Long.\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n */\nLong.isLong = isLong;\n\n/**\n * A cache of the Long representations of small integer values.\n * @type {!Object}\n * @inner\n */\nvar INT_CACHE = {};\n\n/**\n * A cache of the Long representations of small unsigned integer values.\n * @type {!Object}\n * @inner\n */\nvar UINT_CACHE = {};\n\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromInt(value, unsigned) {\n  var obj, cachedObj, cache;\n  if (unsigned) {\n    value >>>= 0;\n    if (cache = (0 <= value && value < 256)) {\n      cachedObj = UINT_CACHE[value];\n      if (cachedObj)\n        return cachedObj;\n    }\n    obj = fromBits(value, 0, true);\n    if (cache)\n      UINT_CACHE[value] = obj;\n    return obj;\n  } else {\n    value |= 0;\n    if (cache = (-128 <= value && value < 128)) {\n      cachedObj = INT_CACHE[value];\n      if (cachedObj)\n        return cachedObj;\n    }\n    obj = fromBits(value, value < 0 ? -1 : 0, false);\n    if (cache)\n      INT_CACHE[value] = obj;\n    return obj;\n  }\n}\n\n/**\n * Returns a Long representing the given 32 bit integer value.\n * @function\n * @param {number} value The 32 bit integer in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromInt = fromInt;\n\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromNumber(value, unsigned) {\n  if (isNaN(value))\n    return unsigned ? UZERO : ZERO;\n  if (unsigned) {\n    if (value < 0)\n      return UZERO;\n    if (value >= TWO_PWR_64_DBL)\n      return MAX_UNSIGNED_VALUE;\n  } else {\n    if (value <= -TWO_PWR_63_DBL)\n      return MIN_VALUE;\n    if (value + 1 >= TWO_PWR_63_DBL)\n      return MAX_VALUE;\n  }\n  if (value < 0)\n    return fromNumber(-value, unsigned).neg();\n  return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\n}\n\n/**\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\n * @function\n * @param {number} value The number in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromNumber = fromNumber;\n\n/**\n * @param {number} lowBits\n * @param {number} highBits\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromBits(lowBits, highBits, unsigned) {\n  return new Long(lowBits, highBits, unsigned);\n}\n\n/**\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\n *  assumed to use 32 bits.\n * @function\n * @param {number} lowBits The low 32 bits\n * @param {number} highBits The high 32 bits\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromBits = fromBits;\n\n/**\n * @function\n * @param {number} base\n * @param {number} exponent\n * @returns {number}\n * @inner\n */\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\n\n/**\n * @param {string} str\n * @param {(boolean|number)=} unsigned\n * @param {number=} radix\n * @returns {!Long}\n * @inner\n */\nfunction fromString(str, unsigned, radix) {\n  if (str.length === 0)\n    throw Error('empty string');\n  if (typeof unsigned === 'number') {\n    // For goog.math.long compatibility\n    radix = unsigned;\n    unsigned = false;\n  } else {\n    unsigned = !!unsigned;\n  }\n  if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\n    return unsigned ? UZERO : ZERO;\n  radix = radix || 10;\n  if (radix < 2 || 36 < radix)\n    throw RangeError('radix');\n\n  var p;\n  if ((p = str.indexOf('-')) > 0)\n    throw Error('interior hyphen');\n  else if (p === 0) {\n    return fromString(str.substring(1), unsigned, radix).neg();\n  }\n\n  // Do several (8) digits each time through the loop, so as to\n  // minimize the calls to the very expensive emulated div.\n  var radixToPower = fromNumber(pow_dbl(radix, 8));\n\n  var result = ZERO;\n  for (var i = 0; i < str.length; i += 8) {\n    var size = Math.min(8, str.length - i),\n      value = parseInt(str.substring(i, i + size), radix);\n    if (size < 8) {\n      var power = fromNumber(pow_dbl(radix, size));\n      result = result.mul(power).add(fromNumber(value));\n    } else {\n      result = result.mul(radixToPower);\n      result = result.add(fromNumber(value));\n    }\n  }\n  result.unsigned = unsigned;\n  return result;\n}\n\n/**\n * Returns a Long representation of the given string, written using the specified radix.\n * @function\n * @param {string} str The textual representation of the Long\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\n * @returns {!Long} The corresponding Long value\n */\nLong.fromString = fromString;\n\n/**\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromValue(val, unsigned) {\n  if (typeof val === 'number')\n    return fromNumber(val, unsigned);\n  if (typeof val === 'string')\n    return fromString(val, unsigned);\n  // Throws for non-objects, converts non-instanceof Long:\n  return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\n}\n\n/**\n * Converts the specified value to a Long using the appropriate from* function for its type.\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long}\n */\nLong.fromValue = fromValue;\n\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\n// no runtime penalty for these.\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_16_DBL = 1 << 16;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_24_DBL = 1 << 24;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\n\n/**\n * @type {!Long}\n * @const\n * @inner\n */\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\n\n/**\n * @type {!Long}\n * @inner\n */\nvar ZERO = fromInt(0);\n\n/**\n * Signed zero.\n * @type {!Long}\n */\nLong.ZERO = ZERO;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar UZERO = fromInt(0, true);\n\n/**\n * Unsigned zero.\n * @type {!Long}\n */\nLong.UZERO = UZERO;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar ONE = fromInt(1);\n\n/**\n * Signed one.\n * @type {!Long}\n */\nLong.ONE = ONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar UONE = fromInt(1, true);\n\n/**\n * Unsigned one.\n * @type {!Long}\n */\nLong.UONE = UONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar NEG_ONE = fromInt(-1);\n\n/**\n * Signed negative one.\n * @type {!Long}\n */\nLong.NEG_ONE = NEG_ONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MAX_VALUE = fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0, false);\n\n/**\n * Maximum signed value.\n * @type {!Long}\n */\nLong.MAX_VALUE = MAX_VALUE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF | 0, 0xFFFFFFFF | 0, true);\n\n/**\n * Maximum unsigned value.\n * @type {!Long}\n */\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MIN_VALUE = fromBits(0, 0x80000000 | 0, false);\n\n/**\n * Minimum signed value.\n * @type {!Long}\n */\nLong.MIN_VALUE = MIN_VALUE;\n\n/**\n * @alias Long.prototype\n * @inner\n */\nvar LongPrototype = Long.prototype;\n\n/**\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\n * @this {!Long}\n * @returns {number}\n */\nLongPrototype.toInt = function toInt() {\n  return this.unsigned ? this.low >>> 0 : this.low;\n};\n\n/**\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\n * @this {!Long}\n * @returns {number}\n */\nLongPrototype.toNumber = function toNumber() {\n  if (this.unsigned)\n    return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\n  return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\n};\n\n/**\n * Converts the Long to a string written in the specified radix.\n * @this {!Long}\n * @param {number=} radix Radix (2-36), defaults to 10\n * @returns {string}\n * @override\n * @throws {RangeError} If `radix` is out of range\n */\nLongPrototype.toString = function toString(radix) {\n  radix = radix || 10;\n  if (radix < 2 || 36 < radix)\n    throw RangeError('radix');\n  if (this.isZero())\n    return '0';\n  if (this.isNegative()) { // Unsigned Longs are never negative\n    if (this.eq(MIN_VALUE)) {\n      // We need to change the Long value before it can be negated, so we remove\n      // the bottom-most digit in this base and then recurse to do the rest.\n      var radixLong = fromNumber(radix),\n        div = this.div(radixLong),\n        rem1 = div.mul(radixLong).sub(this);\n      return div.toString(radix) + rem1.toInt().toString(radix);\n    } else\n      return '-' + this.neg().toString(radix);\n  }\n\n  // Do several (6) digits each time through the loop, so as to\n  // minimize the calls to the very expensive emulated div.\n  var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\n    rem = this;\n  var result = '';\n  while (true) {\n    var remDiv = rem.div(radixToPower),\n      intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\n      digits = intval.toString(radix);\n    rem = remDiv;\n    if (rem.isZero())\n      return digits + result;\n    else {\n      while (digits.length < 6)\n        digits = '0' + digits;\n      result = '' + digits + result;\n    }\n  }\n};\n\n/**\n * Gets the high 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed high bits\n */\nLongPrototype.getHighBits = function getHighBits() {\n  return this.high;\n};\n\n/**\n * Gets the high 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned high bits\n */\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\n  return this.high >>> 0;\n};\n\n/**\n * Gets the low 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed low bits\n */\nLongPrototype.getLowBits = function getLowBits() {\n  return this.low;\n};\n\n/**\n * Gets the low 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned low bits\n */\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\n  return this.low >>> 0;\n};\n\n/**\n * Gets the number of bits needed to represent the absolute value of this Long.\n * @this {!Long}\n * @returns {number}\n */\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\n  if (this.isNegative()) // Unsigned Longs are never negative\n    return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\n  var val = this.high != 0 ? this.high : this.low;\n  for (var bit = 31; bit > 0; bit--)\n    if ((val & (1 << bit)) != 0)\n      break;\n  return this.high != 0 ? bit + 33 : bit + 1;\n};\n\n/**\n * Tests if this Long's value equals zero.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isZero = function isZero() {\n  return this.high === 0 && this.low === 0;\n};\n\n/**\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\n * @returns {boolean}\n */\nLongPrototype.eqz = LongPrototype.isZero;\n\n/**\n * Tests if this Long's value is negative.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isNegative = function isNegative() {\n  return !this.unsigned && this.high < 0;\n};\n\n/**\n * Tests if this Long's value is positive or zero.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isPositive = function isPositive() {\n  return this.unsigned || this.high >= 0;\n};\n\n/**\n * Tests if this Long's value is odd.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isOdd = function isOdd() {\n  return (this.low & 1) === 1;\n};\n\n/**\n * Tests if this Long's value is even.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isEven = function isEven() {\n  return (this.low & 1) === 0;\n};\n\n/**\n * Tests if this Long's value equals the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.equals = function equals(other) {\n  if (!isLong(other))\n    other = fromValue(other);\n  if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\n    return false;\n  return this.high === other.high && this.low === other.low;\n};\n\n/**\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.eq = LongPrototype.equals;\n\n/**\n * Tests if this Long's value differs from the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.notEquals = function notEquals(other) {\n  return !this.eq(/* validates */ other);\n};\n\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.neq = LongPrototype.notEquals;\n\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.ne = LongPrototype.notEquals;\n\n/**\n * Tests if this Long's value is less than the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lessThan = function lessThan(other) {\n  return this.comp(/* validates */ other) < 0;\n};\n\n/**\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lt = LongPrototype.lessThan;\n\n/**\n * Tests if this Long's value is less than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\n  return this.comp(/* validates */ other) <= 0;\n};\n\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\n\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.le = LongPrototype.lessThanOrEqual;\n\n/**\n * Tests if this Long's value is greater than the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.greaterThan = function greaterThan(other) {\n  return this.comp(/* validates */ other) > 0;\n};\n\n/**\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.gt = LongPrototype.greaterThan;\n\n/**\n * Tests if this Long's value is greater than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\n  return this.comp(/* validates */ other) >= 0;\n};\n\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\n\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\n\n/**\n * Compares this Long's value with the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n *  if the given one is greater\n */\nLongPrototype.compare = function compare(other) {\n  if (!isLong(other))\n    other = fromValue(other);\n  if (this.eq(other))\n    return 0;\n  var thisNeg = this.isNegative(),\n    otherNeg = other.isNegative();\n  if (thisNeg && !otherNeg)\n    return -1;\n  if (!thisNeg && otherNeg)\n    return 1;\n  // At this point the sign bits are the same\n  if (!this.unsigned)\n    return this.sub(other).isNegative() ? -1 : 1;\n  // Both are positive if at least one is unsigned\n  return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\n};\n\n/**\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n *  if the given one is greater\n */\nLongPrototype.comp = LongPrototype.compare;\n\n/**\n * Negates this Long's value.\n * @this {!Long}\n * @returns {!Long} Negated Long\n */\nLongPrototype.negate = function negate() {\n  if (!this.unsigned && this.eq(MIN_VALUE))\n    return MIN_VALUE;\n  return this.not().add(ONE);\n};\n\n/**\n * Negates this Long's value. This is an alias of {@link Long#negate}.\n * @function\n * @returns {!Long} Negated Long\n */\nLongPrototype.neg = LongPrototype.negate;\n\n/**\n * Returns the sum of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} addend Addend\n * @returns {!Long} Sum\n */\nLongPrototype.add = function add(addend) {\n  if (!isLong(addend))\n    addend = fromValue(addend);\n\n  // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n  var a48 = this.high >>> 16;\n  var a32 = this.high & 0xFFFF;\n  var a16 = this.low >>> 16;\n  var a00 = this.low & 0xFFFF;\n\n  var b48 = addend.high >>> 16;\n  var b32 = addend.high & 0xFFFF;\n  var b16 = addend.low >>> 16;\n  var b00 = addend.low & 0xFFFF;\n\n  var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n  c00 += a00 + b00;\n  c16 += c00 >>> 16;\n  c00 &= 0xFFFF;\n  c16 += a16 + b16;\n  c32 += c16 >>> 16;\n  c16 &= 0xFFFF;\n  c32 += a32 + b32;\n  c48 += c32 >>> 16;\n  c32 &= 0xFFFF;\n  c48 += a48 + b48;\n  c48 &= 0xFFFF;\n  return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n};\n\n/**\n * Returns the difference of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\nLongPrototype.subtract = function subtract(subtrahend) {\n  if (!isLong(subtrahend))\n    subtrahend = fromValue(subtrahend);\n  return this.add(subtrahend.neg());\n};\n\n/**\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\n * @function\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\nLongPrototype.sub = LongPrototype.subtract;\n\n/**\n * Returns the product of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\nLongPrototype.multiply = function multiply(multiplier) {\n  if (this.isZero())\n    return this;\n  if (!isLong(multiplier))\n    multiplier = fromValue(multiplier);\n\n  // use wasm support if present\n  if (wasm) {\n    var low = wasm[\"mul\"](this.low,\n      this.high,\n      multiplier.low,\n      multiplier.high);\n    return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n  }\n\n  if (multiplier.isZero())\n    return this.unsigned ? UZERO : ZERO;\n  if (this.eq(MIN_VALUE))\n    return multiplier.isOdd() ? MIN_VALUE : ZERO;\n  if (multiplier.eq(MIN_VALUE))\n    return this.isOdd() ? MIN_VALUE : ZERO;\n\n  if (this.isNegative()) {\n    if (multiplier.isNegative())\n      return this.neg().mul(multiplier.neg());\n    else\n      return this.neg().mul(multiplier).neg();\n  } else if (multiplier.isNegative())\n    return this.mul(multiplier.neg()).neg();\n\n  // If both longs are small, use float multiplication\n  if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\n    return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\n\n  // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n  // We can skip products that would overflow.\n\n  var a48 = this.high >>> 16;\n  var a32 = this.high & 0xFFFF;\n  var a16 = this.low >>> 16;\n  var a00 = this.low & 0xFFFF;\n\n  var b48 = multiplier.high >>> 16;\n  var b32 = multiplier.high & 0xFFFF;\n  var b16 = multiplier.low >>> 16;\n  var b00 = multiplier.low & 0xFFFF;\n\n  var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n  c00 += a00 * b00;\n  c16 += c00 >>> 16;\n  c00 &= 0xFFFF;\n  c16 += a16 * b00;\n  c32 += c16 >>> 16;\n  c16 &= 0xFFFF;\n  c16 += a00 * b16;\n  c32 += c16 >>> 16;\n  c16 &= 0xFFFF;\n  c32 += a32 * b00;\n  c48 += c32 >>> 16;\n  c32 &= 0xFFFF;\n  c32 += a16 * b16;\n  c48 += c32 >>> 16;\n  c32 &= 0xFFFF;\n  c32 += a00 * b32;\n  c48 += c32 >>> 16;\n  c32 &= 0xFFFF;\n  c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n  c48 &= 0xFFFF;\n  return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n};\n\n/**\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\n * @function\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\nLongPrototype.mul = LongPrototype.multiply;\n\n/**\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\n *  unsigned if this Long is unsigned.\n * @this {!Long}\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\nLongPrototype.divide = function divide(divisor) {\n  if (!isLong(divisor))\n    divisor = fromValue(divisor);\n  if (divisor.isZero())\n    throw Error('division by zero');\n\n  // use wasm support if present\n  if (wasm) {\n    // guard against signed division overflow: the largest\n    // negative number / -1 would be 1 larger than the largest\n    // positive number, due to two's complement.\n    if (!this.unsigned &&\n      this.high === -0x80000000 &&\n      divisor.low === -1 && divisor.high === -1) {\n      // be consistent with non-wasm code path\n      return this;\n    }\n    var low = (this.unsigned ? wasm[\"div_u\"] : wasm[\"div_s\"])(\n      this.low,\n      this.high,\n      divisor.low,\n      divisor.high\n    );\n    return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n  }\n\n  if (this.isZero())\n    return this.unsigned ? UZERO : ZERO;\n  var approx, rem, res;\n  if (!this.unsigned) {\n    // This section is only relevant for signed longs and is derived from the\n    // closure library as a whole.\n    if (this.eq(MIN_VALUE)) {\n      if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\n        return MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE\n      else if (divisor.eq(MIN_VALUE))\n        return ONE;\n      else {\n        // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n        var halfThis = this.shr(1);\n        approx = halfThis.div(divisor).shl(1);\n        if (approx.eq(ZERO)) {\n          return divisor.isNegative() ? ONE : NEG_ONE;\n        } else {\n          rem = this.sub(divisor.mul(approx));\n          res = approx.add(rem.div(divisor));\n          return res;\n        }\n      }\n    } else if (divisor.eq(MIN_VALUE))\n      return this.unsigned ? UZERO : ZERO;\n    if (this.isNegative()) {\n      if (divisor.isNegative())\n        return this.neg().div(divisor.neg());\n      return this.neg().div(divisor).neg();\n    } else if (divisor.isNegative())\n      return this.div(divisor.neg()).neg();\n    res = ZERO;\n  } else {\n    // The algorithm below has not been made for unsigned longs. It's therefore\n    // required to take special care of the MSB prior to running it.\n    if (!divisor.unsigned)\n      divisor = divisor.toUnsigned();\n    if (divisor.gt(this))\n      return UZERO;\n    if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\n      return UONE;\n    res = UZERO;\n  }\n\n  // Repeat the following until the remainder is less than other:  find a\n  // floating-point that approximates remainder / other *from below*, add this\n  // into the result, and subtract it from the remainder.  It is critical that\n  // the approximate value is less than or equal to the real value so that the\n  // remainder never becomes negative.\n  rem = this;\n  while (rem.gte(divisor)) {\n    // Approximate the result of division. This may be a little greater or\n    // smaller than the actual value.\n    approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\n\n    // We will tweak the approximate result by changing it in the 48-th digit or\n    // the smallest non-fractional digit, whichever is larger.\n    var log2 = Math.ceil(Math.log(approx) / Math.LN2),\n      delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\n\n      // Decrease the approximation until it is smaller than the remainder.  Note\n      // that if it is too large, the product overflows and is negative.\n      approxRes = fromNumber(approx),\n      approxRem = approxRes.mul(divisor);\n    while (approxRem.isNegative() || approxRem.gt(rem)) {\n      approx -= delta;\n      approxRes = fromNumber(approx, this.unsigned);\n      approxRem = approxRes.mul(divisor);\n    }\n\n    // We know the answer can't be zero... and actually, zero would cause\n    // infinite recursion since we would make no progress.\n    if (approxRes.isZero())\n      approxRes = ONE;\n\n    res = res.add(approxRes);\n    rem = rem.sub(approxRem);\n  }\n  return res;\n};\n\n/**\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\nLongPrototype.div = LongPrototype.divide;\n\n/**\n * Returns this Long modulo the specified.\n * @this {!Long}\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.modulo = function modulo(divisor) {\n  if (!isLong(divisor))\n    divisor = fromValue(divisor);\n\n  // use wasm support if present\n  if (wasm) {\n    var low = (this.unsigned ? wasm[\"rem_u\"] : wasm[\"rem_s\"])(\n      this.low,\n      this.high,\n      divisor.low,\n      divisor.high\n    );\n    return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n  }\n\n  return this.sub(this.div(divisor).mul(divisor));\n};\n\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.mod = LongPrototype.modulo;\n\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.rem = LongPrototype.modulo;\n\n/**\n * Returns the bitwise NOT of this Long.\n * @this {!Long}\n * @returns {!Long}\n */\nLongPrototype.not = function not() {\n  return fromBits(~this.low, ~this.high, this.unsigned);\n};\n\n/**\n * Returns count leading zeros of this Long.\n * @this {!Long}\n * @returns {!number}\n */\nLongPrototype.countLeadingZeros = function countLeadingZeros() {\n  return this.high ? Math.clz32(this.high) : Math.clz32(this.low) + 32;\n};\n\n/**\n * Returns count leading zeros. This is an alias of {@link Long#countLeadingZeros}.\n * @function\n * @param {!Long}\n * @returns {!number}\n */\nLongPrototype.clz = LongPrototype.countLeadingZeros;\n\n/**\n * Returns count trailing zeros of this Long.\n * @this {!Long}\n * @returns {!number}\n */\nLongPrototype.countTrailingZeros = function countTrailingZeros() {\n  return this.low ? ctz32(this.low) : ctz32(this.high) + 32;\n};\n\n/**\n * Returns count trailing zeros. This is an alias of {@link Long#countTrailingZeros}.\n * @function\n * @param {!Long}\n * @returns {!number}\n */\nLongPrototype.ctz = LongPrototype.countTrailingZeros;\n\n/**\n * Returns the bitwise AND of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.and = function and(other) {\n  if (!isLong(other))\n    other = fromValue(other);\n  return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\n};\n\n/**\n * Returns the bitwise OR of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.or = function or(other) {\n  if (!isLong(other))\n    other = fromValue(other);\n  return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\n};\n\n/**\n * Returns the bitwise XOR of this Long and the given one.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.xor = function xor(other) {\n  if (!isLong(other))\n    other = fromValue(other);\n  return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\n};\n\n/**\n * Returns this Long with bits shifted to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\n  if (isLong(numBits))\n    numBits = numBits.toInt();\n  if ((numBits &= 63) === 0)\n    return this;\n  else if (numBits < 32)\n    return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\n  else\n    return fromBits(0, this.low << (numBits - 32), this.unsigned);\n};\n\n/**\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shl = LongPrototype.shiftLeft;\n\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftRight = function shiftRight(numBits) {\n  if (isLong(numBits))\n    numBits = numBits.toInt();\n  if ((numBits &= 63) === 0)\n    return this;\n  else if (numBits < 32)\n    return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\n  else\n    return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\n};\n\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shr = LongPrototype.shiftRight;\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\n  if (isLong(numBits)) numBits = numBits.toInt();\n  if ((numBits &= 63) === 0) return this;\n  if (numBits < 32) return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >>> numBits, this.unsigned);\n  if (numBits === 32) return fromBits(this.high, 0, this.unsigned);\n  return fromBits(this.high >>> (numBits - 32), 0, this.unsigned);\n};\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\n\n/**\n * Returns this Long with bits rotated to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotateLeft = function rotateLeft(numBits) {\n  var b;\n  if (isLong(numBits)) numBits = numBits.toInt();\n  if ((numBits &= 63) === 0) return this;\n  if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);\n  if (numBits < 32) {\n    b = (32 - numBits);\n    return fromBits(((this.low << numBits) | (this.high >>> b)), ((this.high << numBits) | (this.low >>> b)), this.unsigned);\n  }\n  numBits -= 32;\n  b = (32 - numBits);\n  return fromBits(((this.high << numBits) | (this.low >>> b)), ((this.low << numBits) | (this.high >>> b)), this.unsigned);\n}\n/**\n * Returns this Long with bits rotated to the left by the given amount. This is an alias of {@link Long#rotateLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotl = LongPrototype.rotateLeft;\n\n/**\n * Returns this Long with bits rotated to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotateRight = function rotateRight(numBits) {\n  var b;\n  if (isLong(numBits)) numBits = numBits.toInt();\n  if ((numBits &= 63) === 0) return this;\n  if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);\n  if (numBits < 32) {\n    b = (32 - numBits);\n    return fromBits(((this.high << b) | (this.low >>> numBits)), ((this.low << b) | (this.high >>> numBits)), this.unsigned);\n  }\n  numBits -= 32;\n  b = (32 - numBits);\n  return fromBits(((this.low << b) | (this.high >>> numBits)), ((this.high << b) | (this.low >>> numBits)), this.unsigned);\n}\n/**\n * Returns this Long with bits rotated to the right by the given amount. This is an alias of {@link Long#rotateRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotr = LongPrototype.rotateRight;\n\n/**\n * Converts this Long to signed.\n * @this {!Long}\n * @returns {!Long} Signed long\n */\nLongPrototype.toSigned = function toSigned() {\n  if (!this.unsigned)\n    return this;\n  return fromBits(this.low, this.high, false);\n};\n\n/**\n * Converts this Long to unsigned.\n * @this {!Long}\n * @returns {!Long} Unsigned long\n */\nLongPrototype.toUnsigned = function toUnsigned() {\n  if (this.unsigned)\n    return this;\n  return fromBits(this.low, this.high, true);\n};\n\n/**\n * Converts this Long to its byte representation.\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @this {!Long}\n * @returns {!Array.<number>} Byte representation\n */\nLongPrototype.toBytes = function toBytes(le) {\n  return le ? this.toBytesLE() : this.toBytesBE();\n};\n\n/**\n * Converts this Long to its little endian byte representation.\n * @this {!Long}\n * @returns {!Array.<number>} Little endian byte representation\n */\nLongPrototype.toBytesLE = function toBytesLE() {\n  var hi = this.high,\n    lo = this.low;\n  return [\n    lo & 0xff,\n    lo >>> 8 & 0xff,\n    lo >>> 16 & 0xff,\n    lo >>> 24,\n    hi & 0xff,\n    hi >>> 8 & 0xff,\n    hi >>> 16 & 0xff,\n    hi >>> 24\n  ];\n};\n\n/**\n * Converts this Long to its big endian byte representation.\n * @this {!Long}\n * @returns {!Array.<number>} Big endian byte representation\n */\nLongPrototype.toBytesBE = function toBytesBE() {\n  var hi = this.high,\n    lo = this.low;\n  return [\n    hi >>> 24,\n    hi >>> 16 & 0xff,\n    hi >>> 8 & 0xff,\n    hi & 0xff,\n    lo >>> 24,\n    lo >>> 16 & 0xff,\n    lo >>> 8 & 0xff,\n    lo & 0xff\n  ];\n};\n\n/**\n * Creates a Long from its byte representation.\n * @param {!Array.<number>} bytes Byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\n  return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\n};\n\n/**\n * Creates a Long from its little endian byte representation.\n * @param {!Array.<number>} bytes Little endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\n  return new Long(\n    bytes[0] |\n    bytes[1] << 8 |\n    bytes[2] << 16 |\n    bytes[3] << 24,\n    bytes[4] |\n    bytes[5] << 8 |\n    bytes[6] << 16 |\n    bytes[7] << 24,\n    unsigned\n  );\n};\n\n/**\n * Creates a Long from its big endian byte representation.\n * @param {!Array.<number>} bytes Big endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\n  return new Long(\n    bytes[4] << 24 |\n    bytes[5] << 16 |\n    bytes[6] << 8 |\n    bytes[7],\n    bytes[0] << 24 |\n    bytes[1] << 16 |\n    bytes[2] << 8 |\n    bytes[3],\n    unsigned\n  );\n};\n\nexport default Long;\n","/// @file\n/// @addtogroup flatbuffers_javascript_api\n/// @{\n/// @cond FLATBUFFERS_INTERNAL\n\n/**\n * @fileoverview\n *\n * Need to suppress 'global this' error so the Node.js export line doesn't cause\n * closure compile to error out.\n * @suppress {globalThis}\n */\n\n/**\n * @const\n * @namespace\n */\nvar flatbuffers = {};\n\n/**\n * @typedef {number}\n */\nflatbuffers.Offset;\n\n/**\n * @typedef {{\n *   bb: flatbuffers.ByteBuffer,\n *   bb_pos: number\n * }}\n */\nflatbuffers.Table;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZEOF_SHORT = 2;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZEOF_INT = 4;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.FILE_IDENTIFIER_LENGTH = 4;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZE_PREFIX_LENGTH = 4;\n\n/**\n * @enum {number}\n */\nflatbuffers.Encoding = {\n  UTF8_BYTES: 1,\n  UTF16_STRING: 2\n};\n\n/**\n * @type {Int32Array}\n * @const\n */\nflatbuffers.int32 = new Int32Array(2);\n\n/**\n * @type {Float32Array}\n * @const\n */\nflatbuffers.float32 = new Float32Array(flatbuffers.int32.buffer);\n\n/**\n * @type {Float64Array}\n * @const\n */\nflatbuffers.float64 = new Float64Array(flatbuffers.int32.buffer);\n\n/**\n * @type {boolean}\n * @const\n */\nflatbuffers.isLittleEndian = new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\n\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @constructor\n * @param {number} low\n * @param {number} high\n */\nflatbuffers.Long = function(low, high) {\n  /**\n   * @type {number}\n   * @const\n   */\n  this.low = low | 0;\n\n  /**\n   * @type {number}\n   * @const\n   */\n  this.high = high | 0;\n};\n\n/**\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.Long.create = function(low, high) {\n  // Special-case zero to avoid GC overhead for default values\n  return low == 0 && high == 0 ? flatbuffers.Long.ZERO : new flatbuffers.Long(low, high);\n};\n\n/**\n * @returns {number}\n */\nflatbuffers.Long.prototype.toFloat64 = function() {\n  return (this.low >>> 0) + this.high * 0x100000000;\n};\n\n/**\n * @param {flatbuffers.Long} other\n * @returns {boolean}\n */\nflatbuffers.Long.prototype.equals = function(other) {\n  return this.low == other.low && this.high == other.high;\n};\n\n/**\n * @type {!flatbuffers.Long}\n * @const\n */\nflatbuffers.Long.ZERO = new flatbuffers.Long(0, 0);\n\n/// @endcond\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Create a FlatBufferBuilder.\n *\n * @constructor\n * @param {number=} opt_initial_size\n */\nflatbuffers.Builder = function(opt_initial_size) {\n  if (!opt_initial_size) {\n    var initial_size = 1024;\n  } else {\n    var initial_size = opt_initial_size;\n  }\n\n  /**\n   * @type {flatbuffers.ByteBuffer}\n   * @private\n   */\n  this.bb = flatbuffers.ByteBuffer.allocate(initial_size);\n\n  /**\n   * Remaining space in the ByteBuffer.\n   *\n   * @type {number}\n   * @private\n   */\n  this.space = initial_size;\n\n  /**\n   * Minimum alignment encountered so far.\n   *\n   * @type {number}\n   * @private\n   */\n  this.minalign = 1;\n\n  /**\n   * The vtable for the current table.\n   *\n   * @type {Array.<number>}\n   * @private\n   */\n  this.vtable = null;\n\n  /**\n   * The amount of fields we're actually using.\n   *\n   * @type {number}\n   * @private\n   */\n  this.vtable_in_use = 0;\n\n  /**\n   * Whether we are currently serializing a table.\n   *\n   * @type {boolean}\n   * @private\n   */\n  this.isNested = false;\n\n  /**\n   * Starting offset of the current struct/table.\n   *\n   * @type {number}\n   * @private\n   */\n  this.object_start = 0;\n\n  /**\n   * List of offsets of all vtables.\n   *\n   * @type {Array.<number>}\n   * @private\n   */\n  this.vtables = [];\n\n  /**\n   * For the current vector being built.\n   *\n   * @type {number}\n   * @private\n   */\n  this.vector_num_elems = 0;\n\n  /**\n   * False omits default values from the serialized data\n   *\n   * @type {boolean}\n   * @private\n   */\n  this.force_defaults = false;\n};\n\nflatbuffers.Builder.prototype.clear = function() {\n  this.bb.clear();\n  this.space = this.bb.capacity();\n  this.minalign = 1;\n  this.vtable = null;\n  this.vtable_in_use = 0;\n  this.isNested = false;\n  this.object_start = 0;\n  this.vtables = [];\n  this.vector_num_elems = 0;\n  this.force_defaults = false;\n};\n\n/**\n * In order to save space, fields that are set to their default value\n * don't get serialized into the buffer. Forcing defaults provides a\n * way to manually disable this optimization.\n *\n * @param {boolean} forceDefaults true always serializes default values\n */\nflatbuffers.Builder.prototype.forceDefaults = function(forceDefaults) {\n  this.force_defaults = forceDefaults;\n};\n\n/**\n * Get the ByteBuffer representing the FlatBuffer. Only call this after you've\n * called finish(). The actual data starts at the ByteBuffer's current position,\n * not necessarily at 0.\n *\n * @returns {flatbuffers.ByteBuffer}\n */\nflatbuffers.Builder.prototype.dataBuffer = function() {\n  return this.bb;\n};\n\n/**\n * Get the bytes representing the FlatBuffer. Only call this after you've\n * called finish().\n *\n * @returns {!Uint8Array}\n */\nflatbuffers.Builder.prototype.asUint8Array = function() {\n  return this.bb.bytes().subarray(this.bb.position(), this.bb.position() + this.offset());\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Prepare to write an element of `size` after `additional_bytes` have been\n * written, e.g. if you write a string, you need to align such the int length\n * field is aligned to 4 bytes, and the string data follows it directly. If all\n * you need to do is alignment, `additional_bytes` will be 0.\n *\n * @param {number} size This is the of the new element to write\n * @param {number} additional_bytes The padding size\n */\nflatbuffers.Builder.prototype.prep = function(size, additional_bytes) {\n  // Track the biggest thing we've ever aligned to.\n  if (size > this.minalign) {\n    this.minalign = size;\n  }\n\n  // Find the amount of alignment needed such that `size` is properly\n  // aligned after `additional_bytes`\n  var align_size = ((~(this.bb.capacity() - this.space + additional_bytes)) + 1) & (size - 1);\n\n  // Reallocate the buffer if needed.\n  while (this.space < align_size + size + additional_bytes) {\n    var old_buf_size = this.bb.capacity();\n    this.bb = flatbuffers.Builder.growByteBuffer(this.bb);\n    this.space += this.bb.capacity() - old_buf_size;\n  }\n\n  this.pad(align_size);\n};\n\n/**\n * @param {number} byte_size\n */\nflatbuffers.Builder.prototype.pad = function(byte_size) {\n  for (var i = 0; i < byte_size; i++) {\n    this.bb.writeInt8(--this.space, 0);\n  }\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt8 = function(value) {\n  this.bb.writeInt8(this.space -= 1, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt16 = function(value) {\n  this.bb.writeInt16(this.space -= 2, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt32 = function(value) {\n  this.bb.writeInt32(this.space -= 4, value);\n};\n\n/**\n * @param {flatbuffers.Long} value\n */\nflatbuffers.Builder.prototype.writeInt64 = function(value) {\n  this.bb.writeInt64(this.space -= 8, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeFloat32 = function(value) {\n  this.bb.writeFloat32(this.space -= 4, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeFloat64 = function(value) {\n  this.bb.writeFloat64(this.space -= 8, value);\n};\n/// @endcond\n\n/**\n * Add an `int8` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int8` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt8 = function(value) {\n  this.prep(1, 0);\n  this.writeInt8(value);\n};\n\n/**\n * Add an `int16` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int16` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt16 = function(value) {\n  this.prep(2, 0);\n  this.writeInt16(value);\n};\n\n/**\n * Add an `int32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int32` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt32 = function(value) {\n  this.prep(4, 0);\n  this.writeInt32(value);\n};\n\n/**\n * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {flatbuffers.Long} value The `int64` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt64 = function(value) {\n  this.prep(8, 0);\n  this.writeInt64(value);\n};\n\n/**\n * Add a `float32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `float32` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addFloat32 = function(value) {\n  this.prep(4, 0);\n  this.writeFloat32(value);\n};\n\n/**\n * Add a `float64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `float64` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addFloat64 = function(value) {\n  this.prep(8, 0);\n  this.writeFloat64(value);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt8 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addInt8(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt16 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addInt16(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt32 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addInt32(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {flatbuffers.Long} value\n * @param {flatbuffers.Long} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt64 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || !value.equals(defaultValue)) {\n    this.addInt64(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldFloat32 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addFloat32(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldFloat64 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addFloat64(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {flatbuffers.Offset} value\n * @param {flatbuffers.Offset} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldOffset = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addOffset(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * Structs are stored inline, so nothing additional is being added. `d` is always 0.\n *\n * @param {number} voffset\n * @param {flatbuffers.Offset} value\n * @param {flatbuffers.Offset} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldStruct = function(voffset, value, defaultValue) {\n  if (value != defaultValue) {\n    this.nested(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * Structures are always stored inline, they need to be created right\n * where they're used.  You'll get this assertion failure if you\n * created it elsewhere.\n *\n * @param {flatbuffers.Offset} obj The offset of the created object\n */\nflatbuffers.Builder.prototype.nested = function(obj) {\n  if (obj != this.offset()) {\n    throw new Error('FlatBuffers: struct must be serialized inline.');\n  }\n};\n\n/**\n * Should not be creating any other object, string or vector\n * while an object is being constructed\n */\nflatbuffers.Builder.prototype.notNested = function() {\n  if (this.isNested) {\n    throw new Error('FlatBuffers: object serialization must not be nested.');\n  }\n};\n\n/**\n * Set the current vtable at `voffset` to the current location in the buffer.\n *\n * @param {number} voffset\n */\nflatbuffers.Builder.prototype.slot = function(voffset) {\n  this.vtable[voffset] = this.offset();\n};\n\n/**\n * @returns {flatbuffers.Offset} Offset relative to the end of the buffer.\n */\nflatbuffers.Builder.prototype.offset = function() {\n  return this.bb.capacity() - this.space;\n};\n\n/**\n * Doubles the size of the backing ByteBuffer and copies the old data towards\n * the end of the new buffer (since we build the buffer backwards).\n *\n * @param {flatbuffers.ByteBuffer} bb The current buffer with the existing data\n * @returns {!flatbuffers.ByteBuffer} A new byte buffer with the old data copied\n * to it. The data is located at the end of the buffer.\n *\n * uint8Array.set() formally takes {Array<number>|ArrayBufferView}, so to pass\n * it a uint8Array we need to suppress the type check:\n * @suppress {checkTypes}\n */\nflatbuffers.Builder.growByteBuffer = function(bb) {\n  var old_buf_size = bb.capacity();\n\n  // Ensure we don't grow beyond what fits in an int.\n  if (old_buf_size & 0xC0000000) {\n    throw new Error('FlatBuffers: cannot grow buffer beyond 2 gigabytes.');\n  }\n\n  var new_buf_size = old_buf_size << 1;\n  var nbb = flatbuffers.ByteBuffer.allocate(new_buf_size);\n  nbb.setPosition(new_buf_size - old_buf_size);\n  nbb.bytes().set(bb.bytes(), new_buf_size - old_buf_size);\n  return nbb;\n};\n/// @endcond\n\n/**\n * Adds on offset, relative to where it will be written.\n *\n * @param {flatbuffers.Offset} offset The offset to add.\n */\nflatbuffers.Builder.prototype.addOffset = function(offset) {\n  this.prep(flatbuffers.SIZEOF_INT, 0); // Ensure alignment is already done.\n  this.writeInt32(this.offset() - offset + flatbuffers.SIZEOF_INT);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Start encoding a new object in the buffer.  Users will not usually need to\n * call this directly. The FlatBuffers compiler will generate helper methods\n * that call this method internally.\n *\n * @param {number} numfields\n */\nflatbuffers.Builder.prototype.startObject = function(numfields) {\n  this.notNested();\n  if (this.vtable == null) {\n    this.vtable = [];\n  }\n  this.vtable_in_use = numfields;\n  for (var i = 0; i < numfields; i++) {\n    this.vtable[i] = 0; // This will push additional elements as needed\n  }\n  this.isNested = true;\n  this.object_start = this.offset();\n};\n\n/**\n * Finish off writing the object that is under construction.\n *\n * @returns {flatbuffers.Offset} The offset to the object inside `dataBuffer`\n */\nflatbuffers.Builder.prototype.endObject = function() {\n  if (this.vtable == null || !this.isNested) {\n    throw new Error('FlatBuffers: endObject called without startObject');\n  }\n\n  this.addInt32(0);\n  var vtableloc = this.offset();\n\n  // Trim trailing zeroes.\n  var i = this.vtable_in_use - 1;\n  for (; i >= 0 && this.vtable[i] == 0; i--) {}\n  var trimmed_size = i + 1;\n\n  // Write out the current vtable.\n  for (; i >= 0; i--) {\n    // Offset relative to the start of the table.\n    this.addInt16(this.vtable[i] != 0 ? vtableloc - this.vtable[i] : 0);\n  }\n\n  var standard_fields = 2; // The fields below:\n  this.addInt16(vtableloc - this.object_start);\n  var len = (trimmed_size + standard_fields) * flatbuffers.SIZEOF_SHORT;\n  this.addInt16(len);\n\n  // Search for an existing vtable that matches the current one.\n  var existing_vtable = 0;\n  var vt1 = this.space;\nouter_loop:\n  for (i = 0; i < this.vtables.length; i++) {\n    var vt2 = this.bb.capacity() - this.vtables[i];\n    if (len == this.bb.readInt16(vt2)) {\n      for (var j = flatbuffers.SIZEOF_SHORT; j < len; j += flatbuffers.SIZEOF_SHORT) {\n        if (this.bb.readInt16(vt1 + j) != this.bb.readInt16(vt2 + j)) {\n          continue outer_loop;\n        }\n      }\n      existing_vtable = this.vtables[i];\n      break;\n    }\n  }\n\n  if (existing_vtable) {\n    // Found a match:\n    // Remove the current vtable.\n    this.space = this.bb.capacity() - vtableloc;\n\n    // Point table to existing vtable.\n    this.bb.writeInt32(this.space, existing_vtable - vtableloc);\n  } else {\n    // No match:\n    // Add the location of the current vtable to the list of vtables.\n    this.vtables.push(this.offset());\n\n    // Point table to current vtable.\n    this.bb.writeInt32(this.bb.capacity() - vtableloc, this.offset() - vtableloc);\n  }\n\n  this.isNested = false;\n  return vtableloc;\n};\n/// @endcond\n\n/**\n * Finalize a buffer, poiting to the given `root_table`.\n *\n * @param {flatbuffers.Offset} root_table\n * @param {string=} opt_file_identifier\n * @param {boolean=} opt_size_prefix\n */\nflatbuffers.Builder.prototype.finish = function(root_table, opt_file_identifier, opt_size_prefix) {\n  var size_prefix = opt_size_prefix ? flatbuffers.SIZE_PREFIX_LENGTH : 0;\n  if (opt_file_identifier) {\n    var file_identifier = opt_file_identifier;\n    this.prep(this.minalign, flatbuffers.SIZEOF_INT +\n      flatbuffers.FILE_IDENTIFIER_LENGTH + size_prefix);\n    if (file_identifier.length != flatbuffers.FILE_IDENTIFIER_LENGTH) {\n      throw new Error('FlatBuffers: file identifier must be length ' +\n        flatbuffers.FILE_IDENTIFIER_LENGTH);\n    }\n    for (var i = flatbuffers.FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--) {\n      this.writeInt8(file_identifier.charCodeAt(i));\n    }\n  }\n  this.prep(this.minalign, flatbuffers.SIZEOF_INT + size_prefix);\n  this.addOffset(root_table);\n  if (size_prefix) {\n    this.addInt32(this.bb.capacity() - this.space);\n  }\n  this.bb.setPosition(this.space);\n};\n\n/**\n * Finalize a size prefixed buffer, pointing to the given `root_table`.\n *\n * @param {flatbuffers.Offset} root_table\n * @param {string=} opt_file_identifier\n */\nflatbuffers.Builder.prototype.finishSizePrefixed = function (root_table, opt_file_identifier) {\n  this.finish(root_table, opt_file_identifier, true);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * This checks a required field has been set in a given table that has\n * just been constructed.\n *\n * @param {flatbuffers.Offset} table\n * @param {number} field\n */\nflatbuffers.Builder.prototype.requiredField = function(table, field) {\n  var table_start = this.bb.capacity() - table;\n  var vtable_start = table_start - this.bb.readInt32(table_start);\n  var ok = this.bb.readInt16(vtable_start + field) != 0;\n\n  // If this fails, the caller will show what field needs to be set.\n  if (!ok) {\n    throw new Error('FlatBuffers: field ' + field + ' must be set');\n  }\n};\n\n/**\n * Start a new array/vector of objects.  Users usually will not call\n * this directly. The FlatBuffers compiler will create a start/end\n * method for vector types in generated code.\n *\n * @param {number} elem_size The size of each element in the array\n * @param {number} num_elems The number of elements in the array\n * @param {number} alignment The alignment of the array\n */\nflatbuffers.Builder.prototype.startVector = function(elem_size, num_elems, alignment) {\n  this.notNested();\n  this.vector_num_elems = num_elems;\n  this.prep(flatbuffers.SIZEOF_INT, elem_size * num_elems);\n  this.prep(alignment, elem_size * num_elems); // Just in case alignment > int.\n};\n\n/**\n * Finish off the creation of an array and all its elements. The array must be\n * created with `startVector`.\n *\n * @returns {flatbuffers.Offset} The offset at which the newly created array\n * starts.\n */\nflatbuffers.Builder.prototype.endVector = function() {\n  this.writeInt32(this.vector_num_elems);\n  return this.offset();\n};\n/// @endcond\n\n/**\n * Encode the string `s` in the buffer using UTF-8. If a Uint8Array is passed\n * instead of a string, it is assumed to contain valid UTF-8 encoded data.\n *\n * @param {string|Uint8Array} s The string to encode\n * @return {flatbuffers.Offset} The offset in the buffer where the encoded string starts\n */\nflatbuffers.Builder.prototype.createString = function(s) {\n  if (s instanceof Uint8Array) {\n    var utf8 = s;\n  } else {\n    var utf8 = [];\n    var i = 0;\n\n    while (i < s.length) {\n      var codePoint;\n\n      // Decode UTF-16\n      var a = s.charCodeAt(i++);\n      if (a < 0xD800 || a >= 0xDC00) {\n        codePoint = a;\n      } else {\n        var b = s.charCodeAt(i++);\n        codePoint = (a << 10) + b + (0x10000 - (0xD800 << 10) - 0xDC00);\n      }\n\n      // Encode UTF-8\n      if (codePoint < 0x80) {\n        utf8.push(codePoint);\n      } else {\n        if (codePoint < 0x800) {\n          utf8.push(((codePoint >> 6) & 0x1F) | 0xC0);\n        } else {\n          if (codePoint < 0x10000) {\n            utf8.push(((codePoint >> 12) & 0x0F) | 0xE0);\n          } else {\n            utf8.push(\n              ((codePoint >> 18) & 0x07) | 0xF0,\n              ((codePoint >> 12) & 0x3F) | 0x80);\n          }\n          utf8.push(((codePoint >> 6) & 0x3F) | 0x80);\n        }\n        utf8.push((codePoint & 0x3F) | 0x80);\n      }\n    }\n  }\n\n  this.addInt8(0);\n  this.startVector(1, utf8.length, 1);\n  this.bb.setPosition(this.space -= utf8.length);\n  for (var i = 0, offset = this.space, bytes = this.bb.bytes(); i < utf8.length; i++) {\n    bytes[offset++] = utf8[i];\n  }\n  return this.endVector();\n};\n\n/**\n * A helper function to avoid generated code depending on this file directly.\n *\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.Builder.prototype.createLong = function(low, high) {\n  return flatbuffers.Long.create(low, high);\n};\n////////////////////////////////////////////////////////////////////////////////\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Create a new ByteBuffer with a given array of bytes (`Uint8Array`).\n *\n * @constructor\n * @param {Uint8Array} bytes\n */\nflatbuffers.ByteBuffer = function(bytes) {\n  /**\n   * @type {Uint8Array}\n   * @private\n   */\n  this.bytes_ = bytes;\n\n  /**\n   * @type {number}\n   * @private\n   */\n  this.position_ = 0;\n};\n\n/**\n * Create and allocate a new ByteBuffer with a given size.\n *\n * @param {number} byte_size\n * @returns {!flatbuffers.ByteBuffer}\n */\nflatbuffers.ByteBuffer.allocate = function(byte_size) {\n  return new flatbuffers.ByteBuffer(new Uint8Array(byte_size));\n};\n\nflatbuffers.ByteBuffer.prototype.clear = function() {\n  this.position_ = 0;\n};\n\n/**\n * Get the underlying `Uint8Array`.\n *\n * @returns {Uint8Array}\n */\nflatbuffers.ByteBuffer.prototype.bytes = function() {\n  return this.bytes_;\n};\n\n/**\n * Get the buffer's position.\n *\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.position = function() {\n  return this.position_;\n};\n\n/**\n * Set the buffer's position.\n *\n * @param {number} position\n */\nflatbuffers.ByteBuffer.prototype.setPosition = function(position) {\n  this.position_ = position;\n};\n\n/**\n * Get the buffer's capacity.\n *\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.capacity = function() {\n  return this.bytes_.length;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt8 = function(offset) {\n  return this.readUint8(offset) << 24 >> 24;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint8 = function(offset) {\n  return this.bytes_[offset];\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt16 = function(offset) {\n  return this.readUint16(offset) << 16 >> 16;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint16 = function(offset) {\n  return this.bytes_[offset] | this.bytes_[offset + 1] << 8;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt32 = function(offset) {\n  return this.bytes_[offset] | this.bytes_[offset + 1] << 8 | this.bytes_[offset + 2] << 16 | this.bytes_[offset + 3] << 24;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint32 = function(offset) {\n  return this.readInt32(offset) >>> 0;\n};\n\n/**\n * @param {number} offset\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.readInt64 = function(offset) {\n  return new flatbuffers.Long(this.readInt32(offset), this.readInt32(offset + 4));\n};\n\n/**\n * @param {number} offset\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.readUint64 = function(offset) {\n  return new flatbuffers.Long(this.readUint32(offset), this.readUint32(offset + 4));\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readFloat32 = function(offset) {\n  flatbuffers.int32[0] = this.readInt32(offset);\n  return flatbuffers.float32[0];\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readFloat64 = function(offset) {\n  flatbuffers.int32[flatbuffers.isLittleEndian ? 0 : 1] = this.readInt32(offset);\n  flatbuffers.int32[flatbuffers.isLittleEndian ? 1 : 0] = this.readInt32(offset + 4);\n  return flatbuffers.float64[0];\n};\n\n/**\n * @param {number} offset\n * @param {number|boolean} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt8 = function(offset, value) {\n  this.bytes_[offset] = /** @type {number} */(value);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint8 = function(offset, value) {\n  this.bytes_[offset] = value;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt16 = function(offset, value) {\n  this.bytes_[offset] = value;\n  this.bytes_[offset + 1] = value >> 8;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint16 = function(offset, value) {\n    this.bytes_[offset] = value;\n    this.bytes_[offset + 1] = value >> 8;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt32 = function(offset, value) {\n  this.bytes_[offset] = value;\n  this.bytes_[offset + 1] = value >> 8;\n  this.bytes_[offset + 2] = value >> 16;\n  this.bytes_[offset + 3] = value >> 24;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint32 = function(offset, value) {\n    this.bytes_[offset] = value;\n    this.bytes_[offset + 1] = value >> 8;\n    this.bytes_[offset + 2] = value >> 16;\n    this.bytes_[offset + 3] = value >> 24;\n};\n\n/**\n * @param {number} offset\n * @param {flatbuffers.Long} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt64 = function(offset, value) {\n  this.writeInt32(offset, value.low);\n  this.writeInt32(offset + 4, value.high);\n};\n\n/**\n * @param {number} offset\n * @param {flatbuffers.Long} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint64 = function(offset, value) {\n    this.writeUint32(offset, value.low);\n    this.writeUint32(offset + 4, value.high);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeFloat32 = function(offset, value) {\n  flatbuffers.float32[0] = value;\n  this.writeInt32(offset, flatbuffers.int32[0]);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeFloat64 = function(offset, value) {\n  flatbuffers.float64[0] = value;\n  this.writeInt32(offset, flatbuffers.int32[flatbuffers.isLittleEndian ? 0 : 1]);\n  this.writeInt32(offset + 4, flatbuffers.int32[flatbuffers.isLittleEndian ? 1 : 0]);\n};\n\n/**\n * Return the file identifier.   Behavior is undefined for FlatBuffers whose\n * schema does not include a file_identifier (likely points at padding or the\n * start of a the root vtable).\n * @returns {string}\n */\nflatbuffers.ByteBuffer.prototype.getBufferIdentifier = function() {\n  if (this.bytes_.length < this.position_ + flatbuffers.SIZEOF_INT +\n      flatbuffers.FILE_IDENTIFIER_LENGTH) {\n    throw new Error(\n        'FlatBuffers: ByteBuffer is too short to contain an identifier.');\n  }\n  var result = \"\";\n  for (var i = 0; i < flatbuffers.FILE_IDENTIFIER_LENGTH; i++) {\n    result += String.fromCharCode(\n        this.readInt8(this.position_ + flatbuffers.SIZEOF_INT + i));\n  }\n  return result;\n};\n\n/**\n * Look up a field in the vtable, return an offset into the object, or 0 if the\n * field is not present.\n *\n * @param {number} bb_pos\n * @param {number} vtable_offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__offset = function(bb_pos, vtable_offset) {\n  var vtable = bb_pos - this.readInt32(bb_pos);\n  return vtable_offset < this.readInt16(vtable) ? this.readInt16(vtable + vtable_offset) : 0;\n};\n\n/**\n * Initialize any Table-derived type to point to the union at the given offset.\n *\n * @param {flatbuffers.Table} t\n * @param {number} offset\n * @returns {flatbuffers.Table}\n */\nflatbuffers.ByteBuffer.prototype.__union = function(t, offset) {\n  t.bb_pos = offset + this.readInt32(offset);\n  t.bb = this;\n  return t;\n};\n\n/**\n * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer.\n * This allocates a new string and converts to wide chars upon each access.\n *\n * To avoid the conversion to UTF-16, pass flatbuffers.Encoding.UTF8_BYTES as\n * the \"optionalEncoding\" argument. This is useful for avoiding conversion to\n * and from UTF-16 when the data will just be packaged back up in another\n * FlatBuffer later on.\n *\n * @param {number} offset\n * @param {flatbuffers.Encoding=} opt_encoding Defaults to UTF16_STRING\n * @returns {string|!Uint8Array}\n */\nflatbuffers.ByteBuffer.prototype.__string = function(offset, opt_encoding) {\n  offset += this.readInt32(offset);\n\n  var length = this.readInt32(offset);\n  var result = '';\n  var i = 0;\n\n  offset += flatbuffers.SIZEOF_INT;\n\n  if (opt_encoding === flatbuffers.Encoding.UTF8_BYTES) {\n    return this.bytes_.subarray(offset, offset + length);\n  }\n\n  while (i < length) {\n    var codePoint;\n\n    // Decode UTF-8\n    var a = this.readUint8(offset + i++);\n    if (a < 0xC0) {\n      codePoint = a;\n    } else {\n      var b = this.readUint8(offset + i++);\n      if (a < 0xE0) {\n        codePoint =\n          ((a & 0x1F) << 6) |\n          (b & 0x3F);\n      } else {\n        var c = this.readUint8(offset + i++);\n        if (a < 0xF0) {\n          codePoint =\n            ((a & 0x0F) << 12) |\n            ((b & 0x3F) << 6) |\n            (c & 0x3F);\n        } else {\n          var d = this.readUint8(offset + i++);\n          codePoint =\n            ((a & 0x07) << 18) |\n            ((b & 0x3F) << 12) |\n            ((c & 0x3F) << 6) |\n            (d & 0x3F);\n        }\n      }\n    }\n\n    // Encode UTF-16\n    if (codePoint < 0x10000) {\n      result += String.fromCharCode(codePoint);\n    } else {\n      codePoint -= 0x10000;\n      result += String.fromCharCode(\n        (codePoint >> 10) + 0xD800,\n        (codePoint & ((1 << 10) - 1)) + 0xDC00);\n    }\n  }\n\n  return result;\n};\n\n/**\n * Retrieve the relative offset stored at \"offset\"\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__indirect = function(offset) {\n  return offset + this.readInt32(offset);\n};\n\n/**\n * Get the start of data of a vector whose offset is stored at \"offset\" in this object.\n *\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__vector = function(offset) {\n  return offset + this.readInt32(offset) + flatbuffers.SIZEOF_INT; // data starts after the length\n};\n\n/**\n * Get the length of a vector whose offset is stored at \"offset\" in this object.\n *\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__vector_len = function(offset) {\n  return this.readInt32(offset + this.readInt32(offset));\n};\n\n/**\n * @param {string} ident\n * @returns {boolean}\n */\nflatbuffers.ByteBuffer.prototype.__has_identifier = function(ident) {\n  if (ident.length != flatbuffers.FILE_IDENTIFIER_LENGTH) {\n    throw new Error('FlatBuffers: file identifier must be length ' +\n                    flatbuffers.FILE_IDENTIFIER_LENGTH);\n  }\n  for (var i = 0; i < flatbuffers.FILE_IDENTIFIER_LENGTH; i++) {\n    if (ident.charCodeAt(i) != this.readInt8(this.position_ + flatbuffers.SIZEOF_INT + i)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n/**\n * A helper function to avoid generated code depending on this file directly.\n *\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.createLong = function(low, high) {\n  return flatbuffers.Long.create(low, high);\n};\n\n// Exports for Node.js and RequireJS\nexport { flatbuffers };\n\n/// @endcond\n/// @}\n","// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable */\n\nimport { flatbuffers } from 'flatbuffers';\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n  export enum AttributeType {\n    UNDEFINED = 0,\n    FLOAT = 1,\n    INT = 2,\n    STRING = 3,\n    TENSOR = 4,\n    GRAPH = 5,\n    FLOATS = 6,\n    INTS = 7,\n    STRINGS = 8,\n    TENSORS = 9,\n    GRAPHS = 10,\n    SPARSE_TENSOR = 11,\n    SPARSE_TENSORS = 12,\n  }\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n  export enum DimensionValueType {\n    UNKNOWN = 0,\n    VALUE = 1,\n    PARAM = 2,\n  }\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n  export enum TensorDataType {\n    UNDEFINED = 0,\n    FLOAT = 1,\n    UINT8 = 2,\n    INT8 = 3,\n    UINT16 = 4,\n    INT16 = 5,\n    INT32 = 6,\n    INT64 = 7,\n    STRING = 8,\n    BOOL = 9,\n    FLOAT16 = 10,\n    DOUBLE = 11,\n    UINT32 = 12,\n    UINT64 = 13,\n    COMPLEX64 = 14,\n    COMPLEX128 = 15,\n    BFLOAT16 = 16,\n    FLOAT8E4M3FN = 17,\n    FLOAT8E4M3FNUZ = 18,\n    FLOAT8E5M2 = 19,\n    FLOAT8E5M2FNUZ = 20,\n  }\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n  export enum NodeType {\n    Primitive = 0,\n    Fused = 1,\n  }\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n  export enum TypeInfoValue {\n    NONE = 0,\n    tensor_type = 1,\n    sequence_type = 2,\n    map_type = 3,\n  }\n}\n\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class Shape {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns Shape\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): Shape {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Shape= obj\n     * @returns Shape\n     */\n    static getRootAsShape(bb: flatbuffers.ByteBuffer, obj?: Shape): Shape {\n      return (obj || new Shape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Shape= obj\n     * @returns Shape\n     */\n    static getSizePrefixedRootAsShape(bb: flatbuffers.ByteBuffer, obj?: Shape): Shape {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new Shape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.Dimension= obj\n     * @returns onnxruntime.experimental.fbs.Dimension\n     */\n    dim(index: number, obj?: onnxruntime.experimental.fbs.Dimension): onnxruntime.experimental.fbs.Dimension | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Dimension()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    dimLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startShape(builder: flatbuffers.Builder) {\n      builder.startObject(1);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset dimOffset\n     */\n    static addDim(builder: flatbuffers.Builder, dimOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, dimOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createDimVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startDimVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endShape(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createShape(builder: flatbuffers.Builder, dimOffset: flatbuffers.Offset): flatbuffers.Offset {\n      Shape.startShape(builder);\n      Shape.addDim(builder, dimOffset);\n      return Shape.endShape(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class Dimension {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns Dimension\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): Dimension {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Dimension= obj\n     * @returns Dimension\n     */\n    static getRootAsDimension(bb: flatbuffers.ByteBuffer, obj?: Dimension): Dimension {\n      return (obj || new Dimension()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Dimension= obj\n     * @returns Dimension\n     */\n    static getSizePrefixedRootAsDimension(bb: flatbuffers.ByteBuffer, obj?: Dimension): Dimension {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new Dimension()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.DimensionValue= obj\n     * @returns onnxruntime.experimental.fbs.DimensionValue|null\n     */\n    value(obj?: onnxruntime.experimental.fbs.DimensionValue): onnxruntime.experimental.fbs.DimensionValue | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.DimensionValue()).__init(\n            this.bb!.__indirect(this.bb_pos + offset),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    denotation(): string | null;\n    denotation(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    denotation(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startDimension(builder: flatbuffers.Builder) {\n      builder.startObject(2);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset valueOffset\n     */\n    static addValue(builder: flatbuffers.Builder, valueOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, valueOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset denotationOffset\n     */\n    static addDenotation(builder: flatbuffers.Builder, denotationOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, denotationOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endDimension(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createDimension(\n      builder: flatbuffers.Builder,\n      valueOffset: flatbuffers.Offset,\n      denotationOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      Dimension.startDimension(builder);\n      Dimension.addValue(builder, valueOffset);\n      Dimension.addDenotation(builder, denotationOffset);\n      return Dimension.endDimension(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class DimensionValue {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns DimensionValue\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): DimensionValue {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param DimensionValue= obj\n     * @returns DimensionValue\n     */\n    static getRootAsDimensionValue(bb: flatbuffers.ByteBuffer, obj?: DimensionValue): DimensionValue {\n      return (obj || new DimensionValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param DimensionValue= obj\n     * @returns DimensionValue\n     */\n    static getSizePrefixedRootAsDimensionValue(bb: flatbuffers.ByteBuffer, obj?: DimensionValue): DimensionValue {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new DimensionValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @returns onnxruntime.experimental.fbs.DimensionValueType\n     */\n    dimType(): onnxruntime.experimental.fbs.DimensionValueType {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? /**  */ this.bb!.readInt8(this.bb_pos + offset)\n        : onnxruntime.experimental.fbs.DimensionValueType.UNKNOWN;\n    }\n\n    /**\n     * @returns flatbuffers.Long\n     */\n    dimValue(): flatbuffers.Long {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    dimParam(): string | null;\n    dimParam(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    dimParam(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startDimensionValue(builder: flatbuffers.Builder) {\n      builder.startObject(3);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param onnxruntime.experimental.fbs.DimensionValueType dimType\n     */\n    static addDimType(builder: flatbuffers.Builder, dimType: onnxruntime.experimental.fbs.DimensionValueType) {\n      builder.addFieldInt8(0, dimType, onnxruntime.experimental.fbs.DimensionValueType.UNKNOWN);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Long dimValue\n     */\n    static addDimValue(builder: flatbuffers.Builder, dimValue: flatbuffers.Long) {\n      builder.addFieldInt64(1, dimValue, builder.createLong(0, 0));\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset dimParamOffset\n     */\n    static addDimParam(builder: flatbuffers.Builder, dimParamOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, dimParamOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endDimensionValue(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createDimensionValue(\n      builder: flatbuffers.Builder,\n      dimType: onnxruntime.experimental.fbs.DimensionValueType,\n      dimValue: flatbuffers.Long,\n      dimParamOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      DimensionValue.startDimensionValue(builder);\n      DimensionValue.addDimType(builder, dimType);\n      DimensionValue.addDimValue(builder, dimValue);\n      DimensionValue.addDimParam(builder, dimParamOffset);\n      return DimensionValue.endDimensionValue(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class TensorTypeAndShape {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns TensorTypeAndShape\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): TensorTypeAndShape {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param TensorTypeAndShape= obj\n     * @returns TensorTypeAndShape\n     */\n    static getRootAsTensorTypeAndShape(bb: flatbuffers.ByteBuffer, obj?: TensorTypeAndShape): TensorTypeAndShape {\n      return (obj || new TensorTypeAndShape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param TensorTypeAndShape= obj\n     * @returns TensorTypeAndShape\n     */\n    static getSizePrefixedRootAsTensorTypeAndShape(\n      bb: flatbuffers.ByteBuffer,\n      obj?: TensorTypeAndShape,\n    ): TensorTypeAndShape {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new TensorTypeAndShape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @returns onnxruntime.experimental.fbs.TensorDataType\n     */\n    elemType(): onnxruntime.experimental.fbs.TensorDataType {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? /**  */ this.bb!.readInt32(this.bb_pos + offset)\n        : onnxruntime.experimental.fbs.TensorDataType.UNDEFINED;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.Shape= obj\n     * @returns onnxruntime.experimental.fbs.Shape|null\n     */\n    shape(obj?: onnxruntime.experimental.fbs.Shape): onnxruntime.experimental.fbs.Shape | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Shape()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!)\n        : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startTensorTypeAndShape(builder: flatbuffers.Builder) {\n      builder.startObject(2);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param onnxruntime.experimental.fbs.TensorDataType elemType\n     */\n    static addElemType(builder: flatbuffers.Builder, elemType: onnxruntime.experimental.fbs.TensorDataType) {\n      builder.addFieldInt32(0, elemType, onnxruntime.experimental.fbs.TensorDataType.UNDEFINED);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset shapeOffset\n     */\n    static addShape(builder: flatbuffers.Builder, shapeOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, shapeOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endTensorTypeAndShape(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createTensorTypeAndShape(\n      builder: flatbuffers.Builder,\n      elemType: onnxruntime.experimental.fbs.TensorDataType,\n      shapeOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      TensorTypeAndShape.startTensorTypeAndShape(builder);\n      TensorTypeAndShape.addElemType(builder, elemType);\n      TensorTypeAndShape.addShape(builder, shapeOffset);\n      return TensorTypeAndShape.endTensorTypeAndShape(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class MapType {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns MapType\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): MapType {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param MapType= obj\n     * @returns MapType\n     */\n    static getRootAsMapType(bb: flatbuffers.ByteBuffer, obj?: MapType): MapType {\n      return (obj || new MapType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param MapType= obj\n     * @returns MapType\n     */\n    static getSizePrefixedRootAsMapType(bb: flatbuffers.ByteBuffer, obj?: MapType): MapType {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new MapType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @returns onnxruntime.experimental.fbs.TensorDataType\n     */\n    keyType(): onnxruntime.experimental.fbs.TensorDataType {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? /**  */ this.bb!.readInt32(this.bb_pos + offset)\n        : onnxruntime.experimental.fbs.TensorDataType.UNDEFINED;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.TypeInfo= obj\n     * @returns onnxruntime.experimental.fbs.TypeInfo|null\n     */\n    valueType(obj?: onnxruntime.experimental.fbs.TypeInfo): onnxruntime.experimental.fbs.TypeInfo | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.TypeInfo()).__init(\n            this.bb!.__indirect(this.bb_pos + offset),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startMapType(builder: flatbuffers.Builder) {\n      builder.startObject(2);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param onnxruntime.experimental.fbs.TensorDataType keyType\n     */\n    static addKeyType(builder: flatbuffers.Builder, keyType: onnxruntime.experimental.fbs.TensorDataType) {\n      builder.addFieldInt32(0, keyType, onnxruntime.experimental.fbs.TensorDataType.UNDEFINED);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset valueTypeOffset\n     */\n    static addValueType(builder: flatbuffers.Builder, valueTypeOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, valueTypeOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endMapType(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createMapType(\n      builder: flatbuffers.Builder,\n      keyType: onnxruntime.experimental.fbs.TensorDataType,\n      valueTypeOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      MapType.startMapType(builder);\n      MapType.addKeyType(builder, keyType);\n      MapType.addValueType(builder, valueTypeOffset);\n      return MapType.endMapType(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class SequenceType {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns SequenceType\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): SequenceType {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param SequenceType= obj\n     * @returns SequenceType\n     */\n    static getRootAsSequenceType(bb: flatbuffers.ByteBuffer, obj?: SequenceType): SequenceType {\n      return (obj || new SequenceType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param SequenceType= obj\n     * @returns SequenceType\n     */\n    static getSizePrefixedRootAsSequenceType(bb: flatbuffers.ByteBuffer, obj?: SequenceType): SequenceType {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new SequenceType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.TypeInfo= obj\n     * @returns onnxruntime.experimental.fbs.TypeInfo|null\n     */\n    elemType(obj?: onnxruntime.experimental.fbs.TypeInfo): onnxruntime.experimental.fbs.TypeInfo | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.TypeInfo()).__init(\n            this.bb!.__indirect(this.bb_pos + offset),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startSequenceType(builder: flatbuffers.Builder) {\n      builder.startObject(1);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset elemTypeOffset\n     */\n    static addElemType(builder: flatbuffers.Builder, elemTypeOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, elemTypeOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endSequenceType(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createSequenceType(builder: flatbuffers.Builder, elemTypeOffset: flatbuffers.Offset): flatbuffers.Offset {\n      SequenceType.startSequenceType(builder);\n      SequenceType.addElemType(builder, elemTypeOffset);\n      return SequenceType.endSequenceType(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class EdgeEnd {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns EdgeEnd\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): EdgeEnd {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @returns number\n     */\n    nodeIndex(): number {\n      return this.bb!.readUint32(this.bb_pos);\n    }\n\n    /**\n     * @returns number\n     */\n    srcArgIndex(): number {\n      return this.bb!.readInt32(this.bb_pos + 4);\n    }\n\n    /**\n     * @returns number\n     */\n    dstArgIndex(): number {\n      return this.bb!.readInt32(this.bb_pos + 8);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number node_index\n     * @param number src_arg_index\n     * @param number dst_arg_index\n     * @returns flatbuffers.Offset\n     */\n    static createEdgeEnd(\n      builder: flatbuffers.Builder,\n      node_index: number,\n      src_arg_index: number,\n      dst_arg_index: number,\n    ): flatbuffers.Offset {\n      builder.prep(4, 12);\n      builder.writeInt32(dst_arg_index);\n      builder.writeInt32(src_arg_index);\n      builder.writeInt32(node_index);\n      return builder.offset();\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class NodeEdge {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns NodeEdge\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): NodeEdge {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param NodeEdge= obj\n     * @returns NodeEdge\n     */\n    static getRootAsNodeEdge(bb: flatbuffers.ByteBuffer, obj?: NodeEdge): NodeEdge {\n      return (obj || new NodeEdge()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param NodeEdge= obj\n     * @returns NodeEdge\n     */\n    static getSizePrefixedRootAsNodeEdge(bb: flatbuffers.ByteBuffer, obj?: NodeEdge): NodeEdge {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new NodeEdge()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @returns number\n     */\n    nodeIndex(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.EdgeEnd= obj\n     * @returns onnxruntime.experimental.fbs.EdgeEnd\n     */\n    inputEdges(index: number, obj?: onnxruntime.experimental.fbs.EdgeEnd): onnxruntime.experimental.fbs.EdgeEnd | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.EdgeEnd()).__init(\n            this.bb!.__vector(this.bb_pos + offset) + index * 12,\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    inputEdgesLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.EdgeEnd= obj\n     * @returns onnxruntime.experimental.fbs.EdgeEnd\n     */\n    outputEdges(\n      index: number,\n      obj?: onnxruntime.experimental.fbs.EdgeEnd,\n    ): onnxruntime.experimental.fbs.EdgeEnd | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.EdgeEnd()).__init(\n            this.bb!.__vector(this.bb_pos + offset) + index * 12,\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    outputEdgesLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startNodeEdge(builder: flatbuffers.Builder) {\n      builder.startObject(3);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number nodeIndex\n     */\n    static addNodeIndex(builder: flatbuffers.Builder, nodeIndex: number) {\n      builder.addFieldInt32(0, nodeIndex, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset inputEdgesOffset\n     */\n    static addInputEdges(builder: flatbuffers.Builder, inputEdgesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, inputEdgesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startInputEdgesVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(12, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset outputEdgesOffset\n     */\n    static addOutputEdges(builder: flatbuffers.Builder, outputEdgesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, outputEdgesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startOutputEdgesVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(12, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endNodeEdge(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createNodeEdge(\n      builder: flatbuffers.Builder,\n      nodeIndex: number,\n      inputEdgesOffset: flatbuffers.Offset,\n      outputEdgesOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      NodeEdge.startNodeEdge(builder);\n      NodeEdge.addNodeIndex(builder, nodeIndex);\n      NodeEdge.addInputEdges(builder, inputEdgesOffset);\n      NodeEdge.addOutputEdges(builder, outputEdgesOffset);\n      return NodeEdge.endNodeEdge(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class Node {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns Node\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): Node {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Node= obj\n     * @returns Node\n     */\n    static getRootAsNode(bb: flatbuffers.ByteBuffer, obj?: Node): Node {\n      return (obj || new Node()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Node= obj\n     * @returns Node\n     */\n    static getSizePrefixedRootAsNode(bb: flatbuffers.ByteBuffer, obj?: Node): Node {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new Node()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    name(): string | null;\n    name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    name(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    docString(): string | null;\n    docString(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    docString(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    domain(): string | null;\n    domain(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    domain(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns number\n     */\n    sinceVersion(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 10);\n      return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @returns number\n     */\n    index(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 12);\n      return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    opType(): string | null;\n    opType(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    opType(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 14);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns onnxruntime.experimental.fbs.NodeType\n     */\n    type(): onnxruntime.experimental.fbs.NodeType {\n      let offset = this.bb!.__offset(this.bb_pos, 16);\n      return offset\n        ? /**  */ this.bb!.readInt32(this.bb_pos + offset)\n        : onnxruntime.experimental.fbs.NodeType.Primitive;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    executionProviderType(): string | null;\n    executionProviderType(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    executionProviderType(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 18);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param number index\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array\n     */\n    inputs(index: number): string;\n    inputs(index: number, optionalEncoding: flatbuffers.Encoding): string | Uint8Array;\n    inputs(index: number, optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 20);\n      return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns number\n     */\n    inputsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 20);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array\n     */\n    outputs(index: number): string;\n    outputs(index: number, optionalEncoding: flatbuffers.Encoding): string | Uint8Array;\n    outputs(index: number, optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 22);\n      return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns number\n     */\n    outputsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 22);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.Attribute= obj\n     * @returns onnxruntime.experimental.fbs.Attribute\n     */\n    attributes(\n      index: number,\n      obj?: onnxruntime.experimental.fbs.Attribute,\n    ): onnxruntime.experimental.fbs.Attribute | null {\n      let offset = this.bb!.__offset(this.bb_pos, 24);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Attribute()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    attributesLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 24);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @returns number\n     */\n    inputArgCounts(index: number): number | null {\n      let offset = this.bb!.__offset(this.bb_pos, 26);\n      return offset ? this.bb!.readInt32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n    }\n\n    /**\n     * @returns number\n     */\n    inputArgCountsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 26);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @returns Int32Array\n     */\n    inputArgCountsArray(): Int32Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 26);\n      return offset\n        ? new Int32Array(\n            this.bb!.bytes().buffer,\n            this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n            this.bb!.__vector_len(this.bb_pos + offset),\n          )\n        : null;\n    }\n\n    /**\n     * @param number index\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array\n     */\n    implicitInputs(index: number): string;\n    implicitInputs(index: number, optionalEncoding: flatbuffers.Encoding): string | Uint8Array;\n    implicitInputs(index: number, optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 28);\n      return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns number\n     */\n    implicitInputsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 28);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startNode(builder: flatbuffers.Builder) {\n      builder.startObject(13);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset nameOffset\n     */\n    static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, nameOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset docStringOffset\n     */\n    static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, docStringOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset domainOffset\n     */\n    static addDomain(builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, domainOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number sinceVersion\n     */\n    static addSinceVersion(builder: flatbuffers.Builder, sinceVersion: number) {\n      builder.addFieldInt32(3, sinceVersion, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number index\n     */\n    static addIndex(builder: flatbuffers.Builder, index: number) {\n      builder.addFieldInt32(4, index, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset opTypeOffset\n     */\n    static addOpType(builder: flatbuffers.Builder, opTypeOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(5, opTypeOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param onnxruntime.experimental.fbs.NodeType type\n     */\n    static addType(builder: flatbuffers.Builder, type: onnxruntime.experimental.fbs.NodeType) {\n      builder.addFieldInt32(6, type, onnxruntime.experimental.fbs.NodeType.Primitive);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset executionProviderTypeOffset\n     */\n    static addExecutionProviderType(builder: flatbuffers.Builder, executionProviderTypeOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(7, executionProviderTypeOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset inputsOffset\n     */\n    static addInputs(builder: flatbuffers.Builder, inputsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(8, inputsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createInputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startInputsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset outputsOffset\n     */\n    static addOutputs(builder: flatbuffers.Builder, outputsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(9, outputsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createOutputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startOutputsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset attributesOffset\n     */\n    static addAttributes(builder: flatbuffers.Builder, attributesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(10, attributesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createAttributesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startAttributesVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset inputArgCountsOffset\n     */\n    static addInputArgCounts(builder: flatbuffers.Builder, inputArgCountsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(11, inputArgCountsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<number> data\n     * @returns flatbuffers.Offset\n     */\n    static createInputArgCountsVector(builder: flatbuffers.Builder, data: number[] | Uint8Array): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addInt32(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startInputArgCountsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset implicitInputsOffset\n     */\n    static addImplicitInputs(builder: flatbuffers.Builder, implicitInputsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(12, implicitInputsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createImplicitInputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startImplicitInputsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endNode(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createNode(\n      builder: flatbuffers.Builder,\n      nameOffset: flatbuffers.Offset,\n      docStringOffset: flatbuffers.Offset,\n      domainOffset: flatbuffers.Offset,\n      sinceVersion: number,\n      index: number,\n      opTypeOffset: flatbuffers.Offset,\n      type: onnxruntime.experimental.fbs.NodeType,\n      executionProviderTypeOffset: flatbuffers.Offset,\n      inputsOffset: flatbuffers.Offset,\n      outputsOffset: flatbuffers.Offset,\n      attributesOffset: flatbuffers.Offset,\n      inputArgCountsOffset: flatbuffers.Offset,\n      implicitInputsOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      Node.startNode(builder);\n      Node.addName(builder, nameOffset);\n      Node.addDocString(builder, docStringOffset);\n      Node.addDomain(builder, domainOffset);\n      Node.addSinceVersion(builder, sinceVersion);\n      Node.addIndex(builder, index);\n      Node.addOpType(builder, opTypeOffset);\n      Node.addType(builder, type);\n      Node.addExecutionProviderType(builder, executionProviderTypeOffset);\n      Node.addInputs(builder, inputsOffset);\n      Node.addOutputs(builder, outputsOffset);\n      Node.addAttributes(builder, attributesOffset);\n      Node.addInputArgCounts(builder, inputArgCountsOffset);\n      Node.addImplicitInputs(builder, implicitInputsOffset);\n      return Node.endNode(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class ValueInfo {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns ValueInfo\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): ValueInfo {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param ValueInfo= obj\n     * @returns ValueInfo\n     */\n    static getRootAsValueInfo(bb: flatbuffers.ByteBuffer, obj?: ValueInfo): ValueInfo {\n      return (obj || new ValueInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param ValueInfo= obj\n     * @returns ValueInfo\n     */\n    static getSizePrefixedRootAsValueInfo(bb: flatbuffers.ByteBuffer, obj?: ValueInfo): ValueInfo {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new ValueInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    name(): string | null;\n    name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    name(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    docString(): string | null;\n    docString(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    docString(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.TypeInfo= obj\n     * @returns onnxruntime.experimental.fbs.TypeInfo|null\n     */\n    type(obj?: onnxruntime.experimental.fbs.TypeInfo): onnxruntime.experimental.fbs.TypeInfo | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.TypeInfo()).__init(\n            this.bb!.__indirect(this.bb_pos + offset),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startValueInfo(builder: flatbuffers.Builder) {\n      builder.startObject(3);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset nameOffset\n     */\n    static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, nameOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset docStringOffset\n     */\n    static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, docStringOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset typeOffset\n     */\n    static addType(builder: flatbuffers.Builder, typeOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, typeOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endValueInfo(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createValueInfo(\n      builder: flatbuffers.Builder,\n      nameOffset: flatbuffers.Offset,\n      docStringOffset: flatbuffers.Offset,\n      typeOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      ValueInfo.startValueInfo(builder);\n      ValueInfo.addName(builder, nameOffset);\n      ValueInfo.addDocString(builder, docStringOffset);\n      ValueInfo.addType(builder, typeOffset);\n      return ValueInfo.endValueInfo(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class TypeInfo {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns TypeInfo\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): TypeInfo {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param TypeInfo= obj\n     * @returns TypeInfo\n     */\n    static getRootAsTypeInfo(bb: flatbuffers.ByteBuffer, obj?: TypeInfo): TypeInfo {\n      return (obj || new TypeInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param TypeInfo= obj\n     * @returns TypeInfo\n     */\n    static getSizePrefixedRootAsTypeInfo(bb: flatbuffers.ByteBuffer, obj?: TypeInfo): TypeInfo {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new TypeInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    denotation(): string | null;\n    denotation(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    denotation(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns onnxruntime.experimental.fbs.TypeInfoValue\n     */\n    valueType(): onnxruntime.experimental.fbs.TypeInfoValue {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? /**  */ this.bb!.readUint8(this.bb_pos + offset)\n        : onnxruntime.experimental.fbs.TypeInfoValue.NONE;\n    }\n\n    /**\n     * @param flatbuffers.Table obj\n     * @returns ?flatbuffers.Table\n     */\n    value<T extends flatbuffers.Table>(obj: T): T | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startTypeInfo(builder: flatbuffers.Builder) {\n      builder.startObject(3);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset denotationOffset\n     */\n    static addDenotation(builder: flatbuffers.Builder, denotationOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, denotationOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param onnxruntime.experimental.fbs.TypeInfoValue valueType\n     */\n    static addValueType(builder: flatbuffers.Builder, valueType: onnxruntime.experimental.fbs.TypeInfoValue) {\n      builder.addFieldInt8(1, valueType, onnxruntime.experimental.fbs.TypeInfoValue.NONE);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset valueOffset\n     */\n    static addValue(builder: flatbuffers.Builder, valueOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, valueOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endTypeInfo(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createTypeInfo(\n      builder: flatbuffers.Builder,\n      denotationOffset: flatbuffers.Offset,\n      valueType: onnxruntime.experimental.fbs.TypeInfoValue,\n      valueOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      TypeInfo.startTypeInfo(builder);\n      TypeInfo.addDenotation(builder, denotationOffset);\n      TypeInfo.addValueType(builder, valueType);\n      TypeInfo.addValue(builder, valueOffset);\n      return TypeInfo.endTypeInfo(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class OperatorSetId {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns OperatorSetId\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): OperatorSetId {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param OperatorSetId= obj\n     * @returns OperatorSetId\n     */\n    static getRootAsOperatorSetId(bb: flatbuffers.ByteBuffer, obj?: OperatorSetId): OperatorSetId {\n      return (obj || new OperatorSetId()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param OperatorSetId= obj\n     * @returns OperatorSetId\n     */\n    static getSizePrefixedRootAsOperatorSetId(bb: flatbuffers.ByteBuffer, obj?: OperatorSetId): OperatorSetId {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new OperatorSetId()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    domain(): string | null;\n    domain(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    domain(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns flatbuffers.Long\n     */\n    version(): flatbuffers.Long {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startOperatorSetId(builder: flatbuffers.Builder) {\n      builder.startObject(2);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset domainOffset\n     */\n    static addDomain(builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, domainOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Long version\n     */\n    static addVersion(builder: flatbuffers.Builder, version: flatbuffers.Long) {\n      builder.addFieldInt64(1, version, builder.createLong(0, 0));\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endOperatorSetId(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createOperatorSetId(\n      builder: flatbuffers.Builder,\n      domainOffset: flatbuffers.Offset,\n      version: flatbuffers.Long,\n    ): flatbuffers.Offset {\n      OperatorSetId.startOperatorSetId(builder);\n      OperatorSetId.addDomain(builder, domainOffset);\n      OperatorSetId.addVersion(builder, version);\n      return OperatorSetId.endOperatorSetId(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class Tensor {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns Tensor\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): Tensor {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Tensor= obj\n     * @returns Tensor\n     */\n    static getRootAsTensor(bb: flatbuffers.ByteBuffer, obj?: Tensor): Tensor {\n      return (obj || new Tensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Tensor= obj\n     * @returns Tensor\n     */\n    static getSizePrefixedRootAsTensor(bb: flatbuffers.ByteBuffer, obj?: Tensor): Tensor {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new Tensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    name(): string | null;\n    name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    name(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    docString(): string | null;\n    docString(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    docString(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param number index\n     * @returns flatbuffers.Long\n     */\n    dims(index: number): flatbuffers.Long | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset\n        ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8)\n        : this.bb!.createLong(0, 0);\n    }\n\n    /**\n     * @returns number\n     */\n    dimsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @returns onnxruntime.experimental.fbs.TensorDataType\n     */\n    dataType(): onnxruntime.experimental.fbs.TensorDataType {\n      let offset = this.bb!.__offset(this.bb_pos, 10);\n      return offset\n        ? /**  */ this.bb!.readInt32(this.bb_pos + offset)\n        : onnxruntime.experimental.fbs.TensorDataType.UNDEFINED;\n    }\n\n    /**\n     * @param number index\n     * @returns number\n     */\n    rawData(index: number): number | null {\n      let offset = this.bb!.__offset(this.bb_pos, 12);\n      return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n    }\n\n    /**\n     * @returns number\n     */\n    rawDataLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 12);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @returns Uint8Array\n     */\n    rawDataArray(): Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 12);\n      return offset\n        ? new Uint8Array(\n            this.bb!.bytes().buffer,\n            this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n            this.bb!.__vector_len(this.bb_pos + offset),\n          )\n        : null;\n    }\n\n    /**\n     * @param number index\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array\n     */\n    stringData(index: number): string;\n    stringData(index: number, optionalEncoding: flatbuffers.Encoding): string | Uint8Array;\n    stringData(index: number, optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 14);\n      return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns number\n     */\n    stringDataLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 14);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startTensor(builder: flatbuffers.Builder) {\n      builder.startObject(6);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset nameOffset\n     */\n    static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, nameOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset docStringOffset\n     */\n    static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, docStringOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset dimsOffset\n     */\n    static addDims(builder: flatbuffers.Builder, dimsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, dimsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Long> data\n     * @returns flatbuffers.Offset\n     */\n    static createDimsVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n      builder.startVector(8, data.length, 8);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addInt64(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startDimsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(8, numElems, 8);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param onnxruntime.experimental.fbs.TensorDataType dataType\n     */\n    static addDataType(builder: flatbuffers.Builder, dataType: onnxruntime.experimental.fbs.TensorDataType) {\n      builder.addFieldInt32(3, dataType, onnxruntime.experimental.fbs.TensorDataType.UNDEFINED);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset rawDataOffset\n     */\n    static addRawData(builder: flatbuffers.Builder, rawDataOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(4, rawDataOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<number> data\n     * @returns flatbuffers.Offset\n     */\n    static createRawDataVector(builder: flatbuffers.Builder, data: number[] | Uint8Array): flatbuffers.Offset {\n      builder.startVector(1, data.length, 1);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addInt8(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startRawDataVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(1, numElems, 1);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset stringDataOffset\n     */\n    static addStringData(builder: flatbuffers.Builder, stringDataOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(5, stringDataOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createStringDataVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startStringDataVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endTensor(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createTensor(\n      builder: flatbuffers.Builder,\n      nameOffset: flatbuffers.Offset,\n      docStringOffset: flatbuffers.Offset,\n      dimsOffset: flatbuffers.Offset,\n      dataType: onnxruntime.experimental.fbs.TensorDataType,\n      rawDataOffset: flatbuffers.Offset,\n      stringDataOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      Tensor.startTensor(builder);\n      Tensor.addName(builder, nameOffset);\n      Tensor.addDocString(builder, docStringOffset);\n      Tensor.addDims(builder, dimsOffset);\n      Tensor.addDataType(builder, dataType);\n      Tensor.addRawData(builder, rawDataOffset);\n      Tensor.addStringData(builder, stringDataOffset);\n      return Tensor.endTensor(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class SparseTensor {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns SparseTensor\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): SparseTensor {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param SparseTensor= obj\n     * @returns SparseTensor\n     */\n    static getRootAsSparseTensor(bb: flatbuffers.ByteBuffer, obj?: SparseTensor): SparseTensor {\n      return (obj || new SparseTensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param SparseTensor= obj\n     * @returns SparseTensor\n     */\n    static getSizePrefixedRootAsSparseTensor(bb: flatbuffers.ByteBuffer, obj?: SparseTensor): SparseTensor {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new SparseTensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.Tensor= obj\n     * @returns onnxruntime.experimental.fbs.Tensor|null\n     */\n    values(obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Tensor()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!)\n        : null;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.Tensor= obj\n     * @returns onnxruntime.experimental.fbs.Tensor|null\n     */\n    indices(obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Tensor()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!)\n        : null;\n    }\n\n    /**\n     * @param number index\n     * @returns flatbuffers.Long\n     */\n    dims(index: number): flatbuffers.Long | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset\n        ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8)\n        : this.bb!.createLong(0, 0);\n    }\n\n    /**\n     * @returns number\n     */\n    dimsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startSparseTensor(builder: flatbuffers.Builder) {\n      builder.startObject(3);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset valuesOffset\n     */\n    static addValues(builder: flatbuffers.Builder, valuesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, valuesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset indicesOffset\n     */\n    static addIndices(builder: flatbuffers.Builder, indicesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, indicesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset dimsOffset\n     */\n    static addDims(builder: flatbuffers.Builder, dimsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, dimsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Long> data\n     * @returns flatbuffers.Offset\n     */\n    static createDimsVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n      builder.startVector(8, data.length, 8);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addInt64(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startDimsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(8, numElems, 8);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endSparseTensor(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createSparseTensor(\n      builder: flatbuffers.Builder,\n      valuesOffset: flatbuffers.Offset,\n      indicesOffset: flatbuffers.Offset,\n      dimsOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      SparseTensor.startSparseTensor(builder);\n      SparseTensor.addValues(builder, valuesOffset);\n      SparseTensor.addIndices(builder, indicesOffset);\n      SparseTensor.addDims(builder, dimsOffset);\n      return SparseTensor.endSparseTensor(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class Attribute {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns Attribute\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): Attribute {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Attribute= obj\n     * @returns Attribute\n     */\n    static getRootAsAttribute(bb: flatbuffers.ByteBuffer, obj?: Attribute): Attribute {\n      return (obj || new Attribute()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Attribute= obj\n     * @returns Attribute\n     */\n    static getSizePrefixedRootAsAttribute(bb: flatbuffers.ByteBuffer, obj?: Attribute): Attribute {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new Attribute()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    name(): string | null;\n    name(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    name(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    docString(): string | null;\n    docString(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    docString(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns onnxruntime.experimental.fbs.AttributeType\n     */\n    type(): onnxruntime.experimental.fbs.AttributeType {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset\n        ? /**  */ this.bb!.readInt32(this.bb_pos + offset)\n        : onnxruntime.experimental.fbs.AttributeType.UNDEFINED;\n    }\n\n    /**\n     * @returns number\n     */\n    f(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 10);\n      return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0;\n    }\n\n    /**\n     * @returns flatbuffers.Long\n     */\n    i(): flatbuffers.Long {\n      let offset = this.bb!.__offset(this.bb_pos, 12);\n      return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    s(): string | null;\n    s(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    s(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 14);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.Tensor= obj\n     * @returns onnxruntime.experimental.fbs.Tensor|null\n     */\n    t(obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor | null {\n      let offset = this.bb!.__offset(this.bb_pos, 16);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Tensor()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!)\n        : null;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.Graph= obj\n     * @returns onnxruntime.experimental.fbs.Graph|null\n     */\n    g(obj?: onnxruntime.experimental.fbs.Graph): onnxruntime.experimental.fbs.Graph | null {\n      let offset = this.bb!.__offset(this.bb_pos, 18);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Graph()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!)\n        : null;\n    }\n\n    /**\n     * @param number index\n     * @returns number\n     */\n    floats(index: number): number | null {\n      let offset = this.bb!.__offset(this.bb_pos, 20);\n      return offset ? this.bb!.readFloat32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n    }\n\n    /**\n     * @returns number\n     */\n    floatsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 20);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @returns Float32Array\n     */\n    floatsArray(): Float32Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 20);\n      return offset\n        ? new Float32Array(\n            this.bb!.bytes().buffer,\n            this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n            this.bb!.__vector_len(this.bb_pos + offset),\n          )\n        : null;\n    }\n\n    /**\n     * @param number index\n     * @returns flatbuffers.Long\n     */\n    ints(index: number): flatbuffers.Long | null {\n      let offset = this.bb!.__offset(this.bb_pos, 22);\n      return offset\n        ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8)\n        : this.bb!.createLong(0, 0);\n    }\n\n    /**\n     * @returns number\n     */\n    intsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 22);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array\n     */\n    strings(index: number): string;\n    strings(index: number, optionalEncoding: flatbuffers.Encoding): string | Uint8Array;\n    strings(index: number, optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 24);\n      return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns number\n     */\n    stringsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 24);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.Tensor= obj\n     * @returns onnxruntime.experimental.fbs.Tensor\n     */\n    tensors(index: number, obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor | null {\n      let offset = this.bb!.__offset(this.bb_pos, 26);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Tensor()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    tensorsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 26);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.Graph= obj\n     * @returns onnxruntime.experimental.fbs.Graph\n     */\n    graphs(index: number, obj?: onnxruntime.experimental.fbs.Graph): onnxruntime.experimental.fbs.Graph | null {\n      let offset = this.bb!.__offset(this.bb_pos, 28);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Graph()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    graphsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 28);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startAttribute(builder: flatbuffers.Builder) {\n      builder.startObject(13);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset nameOffset\n     */\n    static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, nameOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset docStringOffset\n     */\n    static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, docStringOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param onnxruntime.experimental.fbs.AttributeType type\n     */\n    static addType(builder: flatbuffers.Builder, type: onnxruntime.experimental.fbs.AttributeType) {\n      builder.addFieldInt32(2, type, onnxruntime.experimental.fbs.AttributeType.UNDEFINED);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number f\n     */\n    static addF(builder: flatbuffers.Builder, f: number) {\n      builder.addFieldFloat32(3, f, 0.0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Long i\n     */\n    static addI(builder: flatbuffers.Builder, i: flatbuffers.Long) {\n      builder.addFieldInt64(4, i, builder.createLong(0, 0));\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset sOffset\n     */\n    static addS(builder: flatbuffers.Builder, sOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(5, sOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset tOffset\n     */\n    static addT(builder: flatbuffers.Builder, tOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(6, tOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset gOffset\n     */\n    static addG(builder: flatbuffers.Builder, gOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(7, gOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset floatsOffset\n     */\n    static addFloats(builder: flatbuffers.Builder, floatsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(8, floatsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<number> data\n     * @returns flatbuffers.Offset\n     */\n    static createFloatsVector(builder: flatbuffers.Builder, data: number[] | Uint8Array): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addFloat32(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startFloatsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset intsOffset\n     */\n    static addInts(builder: flatbuffers.Builder, intsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(9, intsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Long> data\n     * @returns flatbuffers.Offset\n     */\n    static createIntsVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n      builder.startVector(8, data.length, 8);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addInt64(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startIntsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(8, numElems, 8);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset stringsOffset\n     */\n    static addStrings(builder: flatbuffers.Builder, stringsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(10, stringsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createStringsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startStringsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset tensorsOffset\n     */\n    static addTensors(builder: flatbuffers.Builder, tensorsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(11, tensorsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createTensorsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startTensorsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset graphsOffset\n     */\n    static addGraphs(builder: flatbuffers.Builder, graphsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(12, graphsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createGraphsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startGraphsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endAttribute(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createAttribute(\n      builder: flatbuffers.Builder,\n      nameOffset: flatbuffers.Offset,\n      docStringOffset: flatbuffers.Offset,\n      type: onnxruntime.experimental.fbs.AttributeType,\n      f: number,\n      i: flatbuffers.Long,\n      sOffset: flatbuffers.Offset,\n      tOffset: flatbuffers.Offset,\n      gOffset: flatbuffers.Offset,\n      floatsOffset: flatbuffers.Offset,\n      intsOffset: flatbuffers.Offset,\n      stringsOffset: flatbuffers.Offset,\n      tensorsOffset: flatbuffers.Offset,\n      graphsOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      Attribute.startAttribute(builder);\n      Attribute.addName(builder, nameOffset);\n      Attribute.addDocString(builder, docStringOffset);\n      Attribute.addType(builder, type);\n      Attribute.addF(builder, f);\n      Attribute.addI(builder, i);\n      Attribute.addS(builder, sOffset);\n      Attribute.addT(builder, tOffset);\n      Attribute.addG(builder, gOffset);\n      Attribute.addFloats(builder, floatsOffset);\n      Attribute.addInts(builder, intsOffset);\n      Attribute.addStrings(builder, stringsOffset);\n      Attribute.addTensors(builder, tensorsOffset);\n      Attribute.addGraphs(builder, graphsOffset);\n      return Attribute.endAttribute(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class Graph {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns Graph\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): Graph {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Graph= obj\n     * @returns Graph\n     */\n    static getRootAsGraph(bb: flatbuffers.ByteBuffer, obj?: Graph): Graph {\n      return (obj || new Graph()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Graph= obj\n     * @returns Graph\n     */\n    static getSizePrefixedRootAsGraph(bb: flatbuffers.ByteBuffer, obj?: Graph): Graph {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new Graph()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.Tensor= obj\n     * @returns onnxruntime.experimental.fbs.Tensor\n     */\n    initializers(index: number, obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Tensor()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    initializersLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.ValueInfo= obj\n     * @returns onnxruntime.experimental.fbs.ValueInfo\n     */\n    nodeArgs(\n      index: number,\n      obj?: onnxruntime.experimental.fbs.ValueInfo,\n    ): onnxruntime.experimental.fbs.ValueInfo | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.ValueInfo()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    nodeArgsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.Node= obj\n     * @returns onnxruntime.experimental.fbs.Node\n     */\n    nodes(index: number, obj?: onnxruntime.experimental.fbs.Node): onnxruntime.experimental.fbs.Node | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Node()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    nodesLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @returns number\n     */\n    maxNodeIndex(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 10);\n      return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.NodeEdge= obj\n     * @returns onnxruntime.experimental.fbs.NodeEdge\n     */\n    nodeEdges(\n      index: number,\n      obj?: onnxruntime.experimental.fbs.NodeEdge,\n    ): onnxruntime.experimental.fbs.NodeEdge | null {\n      let offset = this.bb!.__offset(this.bb_pos, 12);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.NodeEdge()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    nodeEdgesLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 12);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array\n     */\n    inputs(index: number): string;\n    inputs(index: number, optionalEncoding: flatbuffers.Encoding): string | Uint8Array;\n    inputs(index: number, optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 14);\n      return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns number\n     */\n    inputsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 14);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array\n     */\n    outputs(index: number): string;\n    outputs(index: number, optionalEncoding: flatbuffers.Encoding): string | Uint8Array;\n    outputs(index: number, optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 16);\n      return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns number\n     */\n    outputsLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 16);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.SparseTensor= obj\n     * @returns onnxruntime.experimental.fbs.SparseTensor\n     */\n    sparseInitializers(\n      index: number,\n      obj?: onnxruntime.experimental.fbs.SparseTensor,\n    ): onnxruntime.experimental.fbs.SparseTensor | null {\n      let offset = this.bb!.__offset(this.bb_pos, 18);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.SparseTensor()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    sparseInitializersLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 18);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startGraph(builder: flatbuffers.Builder) {\n      builder.startObject(8);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset initializersOffset\n     */\n    static addInitializers(builder: flatbuffers.Builder, initializersOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, initializersOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createInitializersVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startInitializersVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset nodeArgsOffset\n     */\n    static addNodeArgs(builder: flatbuffers.Builder, nodeArgsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, nodeArgsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createNodeArgsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startNodeArgsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset nodesOffset\n     */\n    static addNodes(builder: flatbuffers.Builder, nodesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, nodesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createNodesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startNodesVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number maxNodeIndex\n     */\n    static addMaxNodeIndex(builder: flatbuffers.Builder, maxNodeIndex: number) {\n      builder.addFieldInt32(3, maxNodeIndex, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset nodeEdgesOffset\n     */\n    static addNodeEdges(builder: flatbuffers.Builder, nodeEdgesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(4, nodeEdgesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createNodeEdgesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startNodeEdgesVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset inputsOffset\n     */\n    static addInputs(builder: flatbuffers.Builder, inputsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(5, inputsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createInputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startInputsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset outputsOffset\n     */\n    static addOutputs(builder: flatbuffers.Builder, outputsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(6, outputsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createOutputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startOutputsVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset sparseInitializersOffset\n     */\n    static addSparseInitializers(builder: flatbuffers.Builder, sparseInitializersOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(7, sparseInitializersOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createSparseInitializersVector(\n      builder: flatbuffers.Builder,\n      data: flatbuffers.Offset[],\n    ): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startSparseInitializersVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endGraph(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createGraph(\n      builder: flatbuffers.Builder,\n      initializersOffset: flatbuffers.Offset,\n      nodeArgsOffset: flatbuffers.Offset,\n      nodesOffset: flatbuffers.Offset,\n      maxNodeIndex: number,\n      nodeEdgesOffset: flatbuffers.Offset,\n      inputsOffset: flatbuffers.Offset,\n      outputsOffset: flatbuffers.Offset,\n      sparseInitializersOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      Graph.startGraph(builder);\n      Graph.addInitializers(builder, initializersOffset);\n      Graph.addNodeArgs(builder, nodeArgsOffset);\n      Graph.addNodes(builder, nodesOffset);\n      Graph.addMaxNodeIndex(builder, maxNodeIndex);\n      Graph.addNodeEdges(builder, nodeEdgesOffset);\n      Graph.addInputs(builder, inputsOffset);\n      Graph.addOutputs(builder, outputsOffset);\n      Graph.addSparseInitializers(builder, sparseInitializersOffset);\n      return Graph.endGraph(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class Model {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns Model\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): Model {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Model= obj\n     * @returns Model\n     */\n    static getRootAsModel(bb: flatbuffers.ByteBuffer, obj?: Model): Model {\n      return (obj || new Model()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param Model= obj\n     * @returns Model\n     */\n    static getSizePrefixedRootAsModel(bb: flatbuffers.ByteBuffer, obj?: Model): Model {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new Model()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @returns flatbuffers.Long\n     */\n    irVersion(): flatbuffers.Long {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.OperatorSetId= obj\n     * @returns onnxruntime.experimental.fbs.OperatorSetId\n     */\n    opsetImport(\n      index: number,\n      obj?: onnxruntime.experimental.fbs.OperatorSetId,\n    ): onnxruntime.experimental.fbs.OperatorSetId | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.OperatorSetId()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    opsetImportLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    producerName(): string | null;\n    producerName(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    producerName(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    producerVersion(): string | null;\n    producerVersion(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    producerVersion(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 10);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    domain(): string | null;\n    domain(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    domain(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 12);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @returns flatbuffers.Long\n     */\n    modelVersion(): flatbuffers.Long {\n      let offset = this.bb!.__offset(this.bb_pos, 14);\n      return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    docString(): string | null;\n    docString(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    docString(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 16);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.Graph= obj\n     * @returns onnxruntime.experimental.fbs.Graph|null\n     */\n    graph(obj?: onnxruntime.experimental.fbs.Graph): onnxruntime.experimental.fbs.Graph | null {\n      let offset = this.bb!.__offset(this.bb_pos, 18);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Graph()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!)\n        : null;\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    graphDocString(): string | null;\n    graphDocString(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    graphDocString(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 20);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startModel(builder: flatbuffers.Builder) {\n      builder.startObject(9);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Long irVersion\n     */\n    static addIrVersion(builder: flatbuffers.Builder, irVersion: flatbuffers.Long) {\n      builder.addFieldInt64(0, irVersion, builder.createLong(0, 0));\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset opsetImportOffset\n     */\n    static addOpsetImport(builder: flatbuffers.Builder, opsetImportOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, opsetImportOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createOpsetImportVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startOpsetImportVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset producerNameOffset\n     */\n    static addProducerName(builder: flatbuffers.Builder, producerNameOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, producerNameOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset producerVersionOffset\n     */\n    static addProducerVersion(builder: flatbuffers.Builder, producerVersionOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(3, producerVersionOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset domainOffset\n     */\n    static addDomain(builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(4, domainOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Long modelVersion\n     */\n    static addModelVersion(builder: flatbuffers.Builder, modelVersion: flatbuffers.Long) {\n      builder.addFieldInt64(5, modelVersion, builder.createLong(0, 0));\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset docStringOffset\n     */\n    static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(6, docStringOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset graphOffset\n     */\n    static addGraph(builder: flatbuffers.Builder, graphOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(7, graphOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset graphDocStringOffset\n     */\n    static addGraphDocString(builder: flatbuffers.Builder, graphDocStringOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(8, graphDocStringOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endModel(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createModel(\n      builder: flatbuffers.Builder,\n      irVersion: flatbuffers.Long,\n      opsetImportOffset: flatbuffers.Offset,\n      producerNameOffset: flatbuffers.Offset,\n      producerVersionOffset: flatbuffers.Offset,\n      domainOffset: flatbuffers.Offset,\n      modelVersion: flatbuffers.Long,\n      docStringOffset: flatbuffers.Offset,\n      graphOffset: flatbuffers.Offset,\n      graphDocStringOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      Model.startModel(builder);\n      Model.addIrVersion(builder, irVersion);\n      Model.addOpsetImport(builder, opsetImportOffset);\n      Model.addProducerName(builder, producerNameOffset);\n      Model.addProducerVersion(builder, producerVersionOffset);\n      Model.addDomain(builder, domainOffset);\n      Model.addModelVersion(builder, modelVersion);\n      Model.addDocString(builder, docStringOffset);\n      Model.addGraph(builder, graphOffset);\n      Model.addGraphDocString(builder, graphDocStringOffset);\n      return Model.endModel(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class KernelCreateInfos {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns KernelCreateInfos\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): KernelCreateInfos {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param KernelCreateInfos= obj\n     * @returns KernelCreateInfos\n     */\n    static getRootAsKernelCreateInfos(bb: flatbuffers.ByteBuffer, obj?: KernelCreateInfos): KernelCreateInfos {\n      return (obj || new KernelCreateInfos()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param KernelCreateInfos= obj\n     * @returns KernelCreateInfos\n     */\n    static getSizePrefixedRootAsKernelCreateInfos(\n      bb: flatbuffers.ByteBuffer,\n      obj?: KernelCreateInfos,\n    ): KernelCreateInfos {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new KernelCreateInfos()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param number index\n     * @returns number\n     */\n    nodeIndices(index: number): number | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n    }\n\n    /**\n     * @returns number\n     */\n    nodeIndicesLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @returns Uint32Array\n     */\n    nodeIndicesArray(): Uint32Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? new Uint32Array(\n            this.bb!.bytes().buffer,\n            this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n            this.bb!.__vector_len(this.bb_pos + offset),\n          )\n        : null;\n    }\n\n    /**\n     * @param number index\n     * @returns flatbuffers.Long\n     */\n    kernelDefHashes(index: number): flatbuffers.Long | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? this.bb!.readUint64(this.bb!.__vector(this.bb_pos + offset) + index * 8)\n        : this.bb!.createLong(0, 0);\n    }\n\n    /**\n     * @returns number\n     */\n    kernelDefHashesLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startKernelCreateInfos(builder: flatbuffers.Builder) {\n      builder.startObject(2);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset nodeIndicesOffset\n     */\n    static addNodeIndices(builder: flatbuffers.Builder, nodeIndicesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, nodeIndicesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<number> data\n     * @returns flatbuffers.Offset\n     */\n    static createNodeIndicesVector(builder: flatbuffers.Builder, data: number[] | Uint8Array): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addInt32(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startNodeIndicesVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset kernelDefHashesOffset\n     */\n    static addKernelDefHashes(builder: flatbuffers.Builder, kernelDefHashesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, kernelDefHashesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Long> data\n     * @returns flatbuffers.Offset\n     */\n    static createKernelDefHashesVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n      builder.startVector(8, data.length, 8);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addInt64(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startKernelDefHashesVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(8, numElems, 8);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endKernelCreateInfos(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createKernelCreateInfos(\n      builder: flatbuffers.Builder,\n      nodeIndicesOffset: flatbuffers.Offset,\n      kernelDefHashesOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      KernelCreateInfos.startKernelCreateInfos(builder);\n      KernelCreateInfos.addNodeIndices(builder, nodeIndicesOffset);\n      KernelCreateInfos.addKernelDefHashes(builder, kernelDefHashesOffset);\n      return KernelCreateInfos.endKernelCreateInfos(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class SubGraphSessionState {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns SubGraphSessionState\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): SubGraphSessionState {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param SubGraphSessionState= obj\n     * @returns SubGraphSessionState\n     */\n    static getRootAsSubGraphSessionState(bb: flatbuffers.ByteBuffer, obj?: SubGraphSessionState): SubGraphSessionState {\n      return (obj || new SubGraphSessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param SubGraphSessionState= obj\n     * @returns SubGraphSessionState\n     */\n    static getSizePrefixedRootAsSubGraphSessionState(\n      bb: flatbuffers.ByteBuffer,\n      obj?: SubGraphSessionState,\n    ): SubGraphSessionState {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new SubGraphSessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    graphId(): string | null;\n    graphId(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    graphId(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.SessionState= obj\n     * @returns onnxruntime.experimental.fbs.SessionState|null\n     */\n    sessionState(obj?: onnxruntime.experimental.fbs.SessionState): onnxruntime.experimental.fbs.SessionState | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.SessionState()).__init(\n            this.bb!.__indirect(this.bb_pos + offset),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startSubGraphSessionState(builder: flatbuffers.Builder) {\n      builder.startObject(2);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset graphIdOffset\n     */\n    static addGraphId(builder: flatbuffers.Builder, graphIdOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, graphIdOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset sessionStateOffset\n     */\n    static addSessionState(builder: flatbuffers.Builder, sessionStateOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, sessionStateOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endSubGraphSessionState(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      builder.requiredField(offset, 4); // graph_id\n      return offset;\n    }\n\n    static createSubGraphSessionState(\n      builder: flatbuffers.Builder,\n      graphIdOffset: flatbuffers.Offset,\n      sessionStateOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      SubGraphSessionState.startSubGraphSessionState(builder);\n      SubGraphSessionState.addGraphId(builder, graphIdOffset);\n      SubGraphSessionState.addSessionState(builder, sessionStateOffset);\n      return SubGraphSessionState.endSubGraphSessionState(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class SessionState {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns SessionState\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): SessionState {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param SessionState= obj\n     * @returns SessionState\n     */\n    static getRootAsSessionState(bb: flatbuffers.ByteBuffer, obj?: SessionState): SessionState {\n      return (obj || new SessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param SessionState= obj\n     * @returns SessionState\n     */\n    static getSizePrefixedRootAsSessionState(bb: flatbuffers.ByteBuffer, obj?: SessionState): SessionState {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new SessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.KernelCreateInfos= obj\n     * @returns onnxruntime.experimental.fbs.KernelCreateInfos|null\n     */\n    kernels(\n      obj?: onnxruntime.experimental.fbs.KernelCreateInfos,\n    ): onnxruntime.experimental.fbs.KernelCreateInfos | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.KernelCreateInfos()).__init(\n            this.bb!.__indirect(this.bb_pos + offset),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @param number index\n     * @param onnxruntime.experimental.fbs.SubGraphSessionState= obj\n     * @returns onnxruntime.experimental.fbs.SubGraphSessionState\n     */\n    subGraphSessionStates(\n      index: number,\n      obj?: onnxruntime.experimental.fbs.SubGraphSessionState,\n    ): onnxruntime.experimental.fbs.SubGraphSessionState | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.SubGraphSessionState()).__init(\n            this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @returns number\n     */\n    subGraphSessionStatesLength(): number {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startSessionState(builder: flatbuffers.Builder) {\n      builder.startObject(2);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset kernelsOffset\n     */\n    static addKernels(builder: flatbuffers.Builder, kernelsOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, kernelsOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset subGraphSessionStatesOffset\n     */\n    static addSubGraphSessionStates(builder: flatbuffers.Builder, subGraphSessionStatesOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, subGraphSessionStatesOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param Array.<flatbuffers.Offset> data\n     * @returns flatbuffers.Offset\n     */\n    static createSubGraphSessionStatesVector(\n      builder: flatbuffers.Builder,\n      data: flatbuffers.Offset[],\n    ): flatbuffers.Offset {\n      builder.startVector(4, data.length, 4);\n      for (let i = data.length - 1; i >= 0; i--) {\n        builder.addOffset(data[i]);\n      }\n      return builder.endVector();\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param number numElems\n     */\n    static startSubGraphSessionStatesVector(builder: flatbuffers.Builder, numElems: number) {\n      builder.startVector(4, numElems, 4);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endSessionState(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    static createSessionState(\n      builder: flatbuffers.Builder,\n      kernelsOffset: flatbuffers.Offset,\n      subGraphSessionStatesOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      SessionState.startSessionState(builder);\n      SessionState.addKernels(builder, kernelsOffset);\n      SessionState.addSubGraphSessionStates(builder, subGraphSessionStatesOffset);\n      return SessionState.endSessionState(builder);\n    }\n  }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n  export class InferenceSession {\n    bb: flatbuffers.ByteBuffer | null = null;\n\n    bb_pos = 0;\n    /**\n     * @param number i\n     * @param flatbuffers.ByteBuffer bb\n     * @returns InferenceSession\n     */\n    __init(i: number, bb: flatbuffers.ByteBuffer): InferenceSession {\n      this.bb_pos = i;\n      this.bb = bb;\n      return this;\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param InferenceSession= obj\n     * @returns InferenceSession\n     */\n    static getRootAsInferenceSession(bb: flatbuffers.ByteBuffer, obj?: InferenceSession): InferenceSession {\n      return (obj || new InferenceSession()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @param InferenceSession= obj\n     * @returns InferenceSession\n     */\n    static getSizePrefixedRootAsInferenceSession(bb: flatbuffers.ByteBuffer, obj?: InferenceSession): InferenceSession {\n      bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n      return (obj || new InferenceSession()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n    }\n\n    /**\n     * @param flatbuffers.ByteBuffer bb\n     * @returns boolean\n     */\n    static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean {\n      return bb.__has_identifier('ORTM');\n    }\n\n    /**\n     * @param flatbuffers.Encoding= optionalEncoding\n     * @returns string|Uint8Array|null\n     */\n    ortVersion(): string | null;\n    ortVersion(optionalEncoding: flatbuffers.Encoding): string | Uint8Array | null;\n    ortVersion(optionalEncoding?: any): string | Uint8Array | null {\n      let offset = this.bb!.__offset(this.bb_pos, 4);\n      return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.Model= obj\n     * @returns onnxruntime.experimental.fbs.Model|null\n     */\n    model(obj?: onnxruntime.experimental.fbs.Model): onnxruntime.experimental.fbs.Model | null {\n      let offset = this.bb!.__offset(this.bb_pos, 6);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.Model()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!)\n        : null;\n    }\n\n    /**\n     * @param onnxruntime.experimental.fbs.SessionState= obj\n     * @returns onnxruntime.experimental.fbs.SessionState|null\n     */\n    sessionState(obj?: onnxruntime.experimental.fbs.SessionState): onnxruntime.experimental.fbs.SessionState | null {\n      let offset = this.bb!.__offset(this.bb_pos, 8);\n      return offset\n        ? (obj || new onnxruntime.experimental.fbs.SessionState()).__init(\n            this.bb!.__indirect(this.bb_pos + offset),\n            this.bb!,\n          )\n        : null;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     */\n    static startInferenceSession(builder: flatbuffers.Builder) {\n      builder.startObject(3);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset ortVersionOffset\n     */\n    static addOrtVersion(builder: flatbuffers.Builder, ortVersionOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(0, ortVersionOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset modelOffset\n     */\n    static addModel(builder: flatbuffers.Builder, modelOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(1, modelOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset sessionStateOffset\n     */\n    static addSessionState(builder: flatbuffers.Builder, sessionStateOffset: flatbuffers.Offset) {\n      builder.addFieldOffset(2, sessionStateOffset, 0);\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @returns flatbuffers.Offset\n     */\n    static endInferenceSession(builder: flatbuffers.Builder): flatbuffers.Offset {\n      let offset = builder.endObject();\n      return offset;\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset offset\n     */\n    static finishInferenceSessionBuffer(builder: flatbuffers.Builder, offset: flatbuffers.Offset) {\n      builder.finish(offset, 'ORTM');\n    }\n\n    /**\n     * @param flatbuffers.Builder builder\n     * @param flatbuffers.Offset offset\n     */\n    static finishSizePrefixedInferenceSessionBuffer(builder: flatbuffers.Builder, offset: flatbuffers.Offset) {\n      builder.finish(offset, 'ORTM', true);\n    }\n\n    static createInferenceSession(\n      builder: flatbuffers.Builder,\n      ortVersionOffset: flatbuffers.Offset,\n      modelOffset: flatbuffers.Offset,\n      sessionStateOffset: flatbuffers.Offset,\n    ): flatbuffers.Offset {\n      InferenceSession.startInferenceSession(builder);\n      InferenceSession.addOrtVersion(builder, ortVersionOffset);\n      InferenceSession.addModel(builder, modelOffset);\n      InferenceSession.addSessionState(builder, sessionStateOffset);\n      return InferenceSession.endInferenceSession(builder);\n    }\n  }\n}\n","\"use strict\";\r\nmodule.exports = asPromise;\r\n\r\n/**\r\n * Callback as used by {@link util.asPromise}.\r\n * @typedef asPromiseCallback\r\n * @type {function}\r\n * @param {Error|null} error Error, if any\r\n * @param {...*} params Additional arguments\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Returns a promise from a node-style callback function.\r\n * @memberof util\r\n * @param {asPromiseCallback} fn Function to call\r\n * @param {*} ctx Function context\r\n * @param {...*} params Function arguments\r\n * @returns {Promise<*>} Promisified function\r\n */\r\nfunction asPromise(fn, ctx/*, varargs */) {\r\n    var params  = new Array(arguments.length - 1),\r\n        offset  = 0,\r\n        index   = 2,\r\n        pending = true;\r\n    while (index < arguments.length)\r\n        params[offset++] = arguments[index++];\r\n    return new Promise(function executor(resolve, reject) {\r\n        params[offset] = function callback(err/*, varargs */) {\r\n            if (pending) {\r\n                pending = false;\r\n                if (err)\r\n                    reject(err);\r\n                else {\r\n                    var params = new Array(arguments.length - 1),\r\n                        offset = 0;\r\n                    while (offset < params.length)\r\n                        params[offset++] = arguments[offset];\r\n                    resolve.apply(null, params);\r\n                }\r\n            }\r\n        };\r\n        try {\r\n            fn.apply(ctx || null, params);\r\n        } catch (err) {\r\n            if (pending) {\r\n                pending = false;\r\n                reject(err);\r\n            }\r\n        }\r\n    });\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal base64 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar base64 = exports;\r\n\r\n/**\r\n * Calculates the byte length of a base64 encoded string.\r\n * @param {string} string Base64 encoded string\r\n * @returns {number} Byte length\r\n */\r\nbase64.length = function length(string) {\r\n    var p = string.length;\r\n    if (!p)\r\n        return 0;\r\n    var n = 0;\r\n    while (--p % 4 > 1 && string.charAt(p) === \"=\")\r\n        ++n;\r\n    return Math.ceil(string.length * 3) / 4 - n;\r\n};\r\n\r\n// Base64 encoding table\r\nvar b64 = new Array(64);\r\n\r\n// Base64 decoding table\r\nvar s64 = new Array(123);\r\n\r\n// 65..90, 97..122, 48..57, 43, 47\r\nfor (var i = 0; i < 64;)\r\n    s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n\r\n/**\r\n * Encodes a buffer to a base64 encoded string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} Base64 encoded string\r\n */\r\nbase64.encode = function encode(buffer, start, end) {\r\n    var parts = null,\r\n        chunk = [];\r\n    var i = 0, // output index\r\n        j = 0, // goto index\r\n        t;     // temporary\r\n    while (start < end) {\r\n        var b = buffer[start++];\r\n        switch (j) {\r\n            case 0:\r\n                chunk[i++] = b64[b >> 2];\r\n                t = (b & 3) << 4;\r\n                j = 1;\r\n                break;\r\n            case 1:\r\n                chunk[i++] = b64[t | b >> 4];\r\n                t = (b & 15) << 2;\r\n                j = 2;\r\n                break;\r\n            case 2:\r\n                chunk[i++] = b64[t | b >> 6];\r\n                chunk[i++] = b64[b & 63];\r\n                j = 0;\r\n                break;\r\n        }\r\n        if (i > 8191) {\r\n            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n            i = 0;\r\n        }\r\n    }\r\n    if (j) {\r\n        chunk[i++] = b64[t];\r\n        chunk[i++] = 61;\r\n        if (j === 1)\r\n            chunk[i++] = 61;\r\n    }\r\n    if (parts) {\r\n        if (i)\r\n            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n        return parts.join(\"\");\r\n    }\r\n    return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\nvar invalidEncoding = \"invalid encoding\";\r\n\r\n/**\r\n * Decodes a base64 encoded string to a buffer.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Number of bytes written\r\n * @throws {Error} If encoding is invalid\r\n */\r\nbase64.decode = function decode(string, buffer, offset) {\r\n    var start = offset;\r\n    var j = 0, // goto index\r\n        t;     // temporary\r\n    for (var i = 0; i < string.length;) {\r\n        var c = string.charCodeAt(i++);\r\n        if (c === 61 && j > 1)\r\n            break;\r\n        if ((c = s64[c]) === undefined)\r\n            throw Error(invalidEncoding);\r\n        switch (j) {\r\n            case 0:\r\n                t = c;\r\n                j = 1;\r\n                break;\r\n            case 1:\r\n                buffer[offset++] = t << 2 | (c & 48) >> 4;\r\n                t = c;\r\n                j = 2;\r\n                break;\r\n            case 2:\r\n                buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r\n                t = c;\r\n                j = 3;\r\n                break;\r\n            case 3:\r\n                buffer[offset++] = (t & 3) << 6 | c;\r\n                j = 0;\r\n                break;\r\n        }\r\n    }\r\n    if (j === 1)\r\n        throw Error(invalidEncoding);\r\n    return offset - start;\r\n};\r\n\r\n/**\r\n * Tests if the specified string appears to be base64 encoded.\r\n * @param {string} string String to test\r\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\r\n */\r\nbase64.test = function test(string) {\r\n    return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r\n};\r\n","\"use strict\";\r\nmodule.exports = EventEmitter;\r\n\r\n/**\r\n * Constructs a new event emitter instance.\r\n * @classdesc A minimal event emitter.\r\n * @memberof util\r\n * @constructor\r\n */\r\nfunction EventEmitter() {\r\n\r\n    /**\r\n     * Registered listeners.\r\n     * @type {Object.<string,*>}\r\n     * @private\r\n     */\r\n    this._listeners = {};\r\n}\r\n\r\n/**\r\n * Registers an event listener.\r\n * @param {string} evt Event name\r\n * @param {function} fn Listener\r\n * @param {*} [ctx] Listener context\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\r\n    (this._listeners[evt] || (this._listeners[evt] = [])).push({\r\n        fn  : fn,\r\n        ctx : ctx || this\r\n    });\r\n    return this;\r\n};\r\n\r\n/**\r\n * Removes an event listener or any matching listeners if arguments are omitted.\r\n * @param {string} [evt] Event name. Removes all listeners if omitted.\r\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.off = function off(evt, fn) {\r\n    if (evt === undefined)\r\n        this._listeners = {};\r\n    else {\r\n        if (fn === undefined)\r\n            this._listeners[evt] = [];\r\n        else {\r\n            var listeners = this._listeners[evt];\r\n            for (var i = 0; i < listeners.length;)\r\n                if (listeners[i].fn === fn)\r\n                    listeners.splice(i, 1);\r\n                else\r\n                    ++i;\r\n        }\r\n    }\r\n    return this;\r\n};\r\n\r\n/**\r\n * Emits an event by calling its listeners with the specified arguments.\r\n * @param {string} evt Event name\r\n * @param {...*} args Arguments\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.emit = function emit(evt) {\r\n    var listeners = this._listeners[evt];\r\n    if (listeners) {\r\n        var args = [],\r\n            i = 1;\r\n        for (; i < arguments.length;)\r\n            args.push(arguments[i++]);\r\n        for (i = 0; i < listeners.length;)\r\n            listeners[i].fn.apply(listeners[i++].ctx, args);\r\n    }\r\n    return this;\r\n};\r\n","\"use strict\";\r\n\r\nmodule.exports = factory(factory);\r\n\r\n/**\r\n * Reads / writes floats / doubles from / to buffers.\r\n * @name util.float\r\n * @namespace\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using little endian byte order.\r\n * @name util.float.writeFloatLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using big endian byte order.\r\n * @name util.float.writeFloatBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using little endian byte order.\r\n * @name util.float.readFloatLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using big endian byte order.\r\n * @name util.float.readFloatBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using little endian byte order.\r\n * @name util.float.writeDoubleLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using big endian byte order.\r\n * @name util.float.writeDoubleBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using little endian byte order.\r\n * @name util.float.readDoubleLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using big endian byte order.\r\n * @name util.float.readDoubleBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n// Factory function for the purpose of node-based testing in modified global environments\r\nfunction factory(exports) {\r\n\r\n    // float: typed array\r\n    if (typeof Float32Array !== \"undefined\") (function() {\r\n\r\n        var f32 = new Float32Array([ -0 ]),\r\n            f8b = new Uint8Array(f32.buffer),\r\n            le  = f8b[3] === 128;\r\n\r\n        function writeFloat_f32_cpy(val, buf, pos) {\r\n            f32[0] = val;\r\n            buf[pos    ] = f8b[0];\r\n            buf[pos + 1] = f8b[1];\r\n            buf[pos + 2] = f8b[2];\r\n            buf[pos + 3] = f8b[3];\r\n        }\r\n\r\n        function writeFloat_f32_rev(val, buf, pos) {\r\n            f32[0] = val;\r\n            buf[pos    ] = f8b[3];\r\n            buf[pos + 1] = f8b[2];\r\n            buf[pos + 2] = f8b[1];\r\n            buf[pos + 3] = f8b[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\r\n        /* istanbul ignore next */\r\n        exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\r\n\r\n        function readFloat_f32_cpy(buf, pos) {\r\n            f8b[0] = buf[pos    ];\r\n            f8b[1] = buf[pos + 1];\r\n            f8b[2] = buf[pos + 2];\r\n            f8b[3] = buf[pos + 3];\r\n            return f32[0];\r\n        }\r\n\r\n        function readFloat_f32_rev(buf, pos) {\r\n            f8b[3] = buf[pos    ];\r\n            f8b[2] = buf[pos + 1];\r\n            f8b[1] = buf[pos + 2];\r\n            f8b[0] = buf[pos + 3];\r\n            return f32[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\r\n        /* istanbul ignore next */\r\n        exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\r\n\r\n    // float: ieee754\r\n    })(); else (function() {\r\n\r\n        function writeFloat_ieee754(writeUint, val, buf, pos) {\r\n            var sign = val < 0 ? 1 : 0;\r\n            if (sign)\r\n                val = -val;\r\n            if (val === 0)\r\n                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\r\n            else if (isNaN(val))\r\n                writeUint(2143289344, buf, pos);\r\n            else if (val > 3.4028234663852886e+38) // +-Infinity\r\n                writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\r\n            else if (val < 1.1754943508222875e-38) // denormal\r\n                writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\r\n            else {\r\n                var exponent = Math.floor(Math.log(val) / Math.LN2),\r\n                    mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\r\n                writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\r\n            }\r\n        }\r\n\r\n        exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\r\n        exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\r\n\r\n        function readFloat_ieee754(readUint, buf, pos) {\r\n            var uint = readUint(buf, pos),\r\n                sign = (uint >> 31) * 2 + 1,\r\n                exponent = uint >>> 23 & 255,\r\n                mantissa = uint & 8388607;\r\n            return exponent === 255\r\n                ? mantissa\r\n                ? NaN\r\n                : sign * Infinity\r\n                : exponent === 0 // denormal\r\n                ? sign * 1.401298464324817e-45 * mantissa\r\n                : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\r\n        }\r\n\r\n        exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\r\n        exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\r\n\r\n    })();\r\n\r\n    // double: typed array\r\n    if (typeof Float64Array !== \"undefined\") (function() {\r\n\r\n        var f64 = new Float64Array([-0]),\r\n            f8b = new Uint8Array(f64.buffer),\r\n            le  = f8b[7] === 128;\r\n\r\n        function writeDouble_f64_cpy(val, buf, pos) {\r\n            f64[0] = val;\r\n            buf[pos    ] = f8b[0];\r\n            buf[pos + 1] = f8b[1];\r\n            buf[pos + 2] = f8b[2];\r\n            buf[pos + 3] = f8b[3];\r\n            buf[pos + 4] = f8b[4];\r\n            buf[pos + 5] = f8b[5];\r\n            buf[pos + 6] = f8b[6];\r\n            buf[pos + 7] = f8b[7];\r\n        }\r\n\r\n        function writeDouble_f64_rev(val, buf, pos) {\r\n            f64[0] = val;\r\n            buf[pos    ] = f8b[7];\r\n            buf[pos + 1] = f8b[6];\r\n            buf[pos + 2] = f8b[5];\r\n            buf[pos + 3] = f8b[4];\r\n            buf[pos + 4] = f8b[3];\r\n            buf[pos + 5] = f8b[2];\r\n            buf[pos + 6] = f8b[1];\r\n            buf[pos + 7] = f8b[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\r\n        /* istanbul ignore next */\r\n        exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\r\n\r\n        function readDouble_f64_cpy(buf, pos) {\r\n            f8b[0] = buf[pos    ];\r\n            f8b[1] = buf[pos + 1];\r\n            f8b[2] = buf[pos + 2];\r\n            f8b[3] = buf[pos + 3];\r\n            f8b[4] = buf[pos + 4];\r\n            f8b[5] = buf[pos + 5];\r\n            f8b[6] = buf[pos + 6];\r\n            f8b[7] = buf[pos + 7];\r\n            return f64[0];\r\n        }\r\n\r\n        function readDouble_f64_rev(buf, pos) {\r\n            f8b[7] = buf[pos    ];\r\n            f8b[6] = buf[pos + 1];\r\n            f8b[5] = buf[pos + 2];\r\n            f8b[4] = buf[pos + 3];\r\n            f8b[3] = buf[pos + 4];\r\n            f8b[2] = buf[pos + 5];\r\n            f8b[1] = buf[pos + 6];\r\n            f8b[0] = buf[pos + 7];\r\n            return f64[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\r\n        /* istanbul ignore next */\r\n        exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\r\n\r\n    // double: ieee754\r\n    })(); else (function() {\r\n\r\n        function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\r\n            var sign = val < 0 ? 1 : 0;\r\n            if (sign)\r\n                val = -val;\r\n            if (val === 0) {\r\n                writeUint(0, buf, pos + off0);\r\n                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\r\n            } else if (isNaN(val)) {\r\n                writeUint(0, buf, pos + off0);\r\n                writeUint(2146959360, buf, pos + off1);\r\n            } else if (val > 1.7976931348623157e+308) { // +-Infinity\r\n                writeUint(0, buf, pos + off0);\r\n                writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\r\n            } else {\r\n                var mantissa;\r\n                if (val < 2.2250738585072014e-308) { // denormal\r\n                    mantissa = val / 5e-324;\r\n                    writeUint(mantissa >>> 0, buf, pos + off0);\r\n                    writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\r\n                } else {\r\n                    var exponent = Math.floor(Math.log(val) / Math.LN2);\r\n                    if (exponent === 1024)\r\n                        exponent = 1023;\r\n                    mantissa = val * Math.pow(2, -exponent);\r\n                    writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\r\n                    writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\r\n                }\r\n            }\r\n        }\r\n\r\n        exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\r\n        exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\r\n\r\n        function readDouble_ieee754(readUint, off0, off1, buf, pos) {\r\n            var lo = readUint(buf, pos + off0),\r\n                hi = readUint(buf, pos + off1);\r\n            var sign = (hi >> 31) * 2 + 1,\r\n                exponent = hi >>> 20 & 2047,\r\n                mantissa = 4294967296 * (hi & 1048575) + lo;\r\n            return exponent === 2047\r\n                ? mantissa\r\n                ? NaN\r\n                : sign * Infinity\r\n                : exponent === 0 // denormal\r\n                ? sign * 5e-324 * mantissa\r\n                : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\r\n        }\r\n\r\n        exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\r\n        exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\r\n\r\n    })();\r\n\r\n    return exports;\r\n}\r\n\r\n// uint helpers\r\n\r\nfunction writeUintLE(val, buf, pos) {\r\n    buf[pos    ] =  val        & 255;\r\n    buf[pos + 1] =  val >>> 8  & 255;\r\n    buf[pos + 2] =  val >>> 16 & 255;\r\n    buf[pos + 3] =  val >>> 24;\r\n}\r\n\r\nfunction writeUintBE(val, buf, pos) {\r\n    buf[pos    ] =  val >>> 24;\r\n    buf[pos + 1] =  val >>> 16 & 255;\r\n    buf[pos + 2] =  val >>> 8  & 255;\r\n    buf[pos + 3] =  val        & 255;\r\n}\r\n\r\nfunction readUintLE(buf, pos) {\r\n    return (buf[pos    ]\r\n          | buf[pos + 1] << 8\r\n          | buf[pos + 2] << 16\r\n          | buf[pos + 3] << 24) >>> 0;\r\n}\r\n\r\nfunction readUintBE(buf, pos) {\r\n    return (buf[pos    ] << 24\r\n          | buf[pos + 1] << 16\r\n          | buf[pos + 2] << 8\r\n          | buf[pos + 3]) >>> 0;\r\n}\r\n","\"use strict\";\r\nmodule.exports = inquire;\r\n\r\n/**\r\n * Requires a module only if available.\r\n * @memberof util\r\n * @param {string} moduleName Module to require\r\n * @returns {?Object} Required module if available and not empty, otherwise `null`\r\n */\r\nfunction inquire(moduleName) {\r\n    try {\r\n        var mod = eval(\"quire\".replace(/^/,\"re\"))(moduleName); // eslint-disable-line no-eval\r\n        if (mod && (mod.length || Object.keys(mod).length))\r\n            return mod;\r\n    } catch (e) {} // eslint-disable-line no-empty\r\n    return null;\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n    var len = 0,\r\n        c = 0;\r\n    for (var i = 0; i < string.length; ++i) {\r\n        c = string.charCodeAt(i);\r\n        if (c < 128)\r\n            len += 1;\r\n        else if (c < 2048)\r\n            len += 2;\r\n        else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n            ++i;\r\n            len += 4;\r\n        } else\r\n            len += 3;\r\n    }\r\n    return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n    var len = end - start;\r\n    if (len < 1)\r\n        return \"\";\r\n    var parts = null,\r\n        chunk = [],\r\n        i = 0, // char offset\r\n        t;     // temporary\r\n    while (start < end) {\r\n        t = buffer[start++];\r\n        if (t < 128)\r\n            chunk[i++] = t;\r\n        else if (t > 191 && t < 224)\r\n            chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n        else if (t > 239 && t < 365) {\r\n            t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n            chunk[i++] = 0xD800 + (t >> 10);\r\n            chunk[i++] = 0xDC00 + (t & 1023);\r\n        } else\r\n            chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n        if (i > 8191) {\r\n            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n            i = 0;\r\n        }\r\n    }\r\n    if (parts) {\r\n        if (i)\r\n            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n        return parts.join(\"\");\r\n    }\r\n    return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n    var start = offset,\r\n        c1, // character 1\r\n        c2; // character 2\r\n    for (var i = 0; i < string.length; ++i) {\r\n        c1 = string.charCodeAt(i);\r\n        if (c1 < 128) {\r\n            buffer[offset++] = c1;\r\n        } else if (c1 < 2048) {\r\n            buffer[offset++] = c1 >> 6       | 192;\r\n            buffer[offset++] = c1       & 63 | 128;\r\n        } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n            c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n            ++i;\r\n            buffer[offset++] = c1 >> 18      | 240;\r\n            buffer[offset++] = c1 >> 12 & 63 | 128;\r\n            buffer[offset++] = c1 >> 6  & 63 | 128;\r\n            buffer[offset++] = c1       & 63 | 128;\r\n        } else {\r\n            buffer[offset++] = c1 >> 12      | 224;\r\n            buffer[offset++] = c1 >> 6  & 63 | 128;\r\n            buffer[offset++] = c1       & 63 | 128;\r\n        }\r\n    }\r\n    return offset - start;\r\n};\r\n","\"use strict\";\r\nmodule.exports = pool;\r\n\r\n/**\r\n * An allocator as used by {@link util.pool}.\r\n * @typedef PoolAllocator\r\n * @type {function}\r\n * @param {number} size Buffer size\r\n * @returns {Uint8Array} Buffer\r\n */\r\n\r\n/**\r\n * A slicer as used by {@link util.pool}.\r\n * @typedef PoolSlicer\r\n * @type {function}\r\n * @param {number} start Start offset\r\n * @param {number} end End offset\r\n * @returns {Uint8Array} Buffer slice\r\n * @this {Uint8Array}\r\n */\r\n\r\n/**\r\n * A general purpose buffer pool.\r\n * @memberof util\r\n * @function\r\n * @param {PoolAllocator} alloc Allocator\r\n * @param {PoolSlicer} slice Slicer\r\n * @param {number} [size=8192] Slab size\r\n * @returns {PoolAllocator} Pooled allocator\r\n */\r\nfunction pool(alloc, slice, size) {\r\n    var SIZE   = size || 8192;\r\n    var MAX    = SIZE >>> 1;\r\n    var slab   = null;\r\n    var offset = SIZE;\r\n    return function pool_alloc(size) {\r\n        if (size < 1 || size > MAX)\r\n            return alloc(size);\r\n        if (offset + size > SIZE) {\r\n            slab = alloc(SIZE);\r\n            offset = 0;\r\n        }\r\n        var buf = slice.call(slab, offset, offset += size);\r\n        if (offset & 7) // align to 32 bit\r\n            offset = (offset | 7) + 1;\r\n        return buf;\r\n    };\r\n}\r\n","\"use strict\";\nmodule.exports = LongBits;\n\nvar util = require(\"../util/minimal\");\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n    // note that the casts below are theoretically unnecessary as of today, but older statically\n    // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n    /**\n     * Low bits.\n     * @type {number}\n     */\n    this.lo = lo >>> 0;\n\n    /**\n     * High bits.\n     * @type {number}\n     */\n    this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n    if (value === 0)\n        return zero;\n    var sign = value < 0;\n    if (sign)\n        value = -value;\n    var lo = value >>> 0,\n        hi = (value - lo) / 4294967296 >>> 0;\n    if (sign) {\n        hi = ~hi >>> 0;\n        lo = ~lo >>> 0;\n        if (++lo > 4294967295) {\n            lo = 0;\n            if (++hi > 4294967295)\n                hi = 0;\n        }\n    }\n    return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n    if (typeof value === \"number\")\n        return LongBits.fromNumber(value);\n    if (util.isString(value)) {\n        /* istanbul ignore else */\n        if (util.Long)\n            value = util.Long.fromString(value);\n        else\n            return LongBits.fromNumber(parseInt(value, 10));\n    }\n    return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n    if (!unsigned && this.hi >>> 31) {\n        var lo = ~this.lo + 1 >>> 0,\n            hi = ~this.hi     >>> 0;\n        if (!lo)\n            hi = hi + 1 >>> 0;\n        return -(lo + hi * 4294967296);\n    }\n    return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n    return util.Long\n        ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n        /* istanbul ignore next */\n        : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n    if (hash === zeroHash)\n        return zero;\n    return new LongBits(\n        ( charCodeAt.call(hash, 0)\n        | charCodeAt.call(hash, 1) << 8\n        | charCodeAt.call(hash, 2) << 16\n        | charCodeAt.call(hash, 3) << 24) >>> 0\n    ,\n        ( charCodeAt.call(hash, 4)\n        | charCodeAt.call(hash, 5) << 8\n        | charCodeAt.call(hash, 6) << 16\n        | charCodeAt.call(hash, 7) << 24) >>> 0\n    );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n    return String.fromCharCode(\n        this.lo        & 255,\n        this.lo >>> 8  & 255,\n        this.lo >>> 16 & 255,\n        this.lo >>> 24      ,\n        this.hi        & 255,\n        this.hi >>> 8  & 255,\n        this.hi >>> 16 & 255,\n        this.hi >>> 24\n    );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n    var mask =   this.hi >> 31;\n    this.hi  = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n    this.lo  = ( this.lo << 1                   ^ mask) >>> 0;\n    return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n    var mask = -(this.lo & 1);\n    this.lo  = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n    this.hi  = ( this.hi >>> 1                  ^ mask) >>> 0;\n    return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n    var part0 =  this.lo,\n        part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n        part2 =  this.hi >>> 24;\n    return part2 === 0\n         ? part1 === 0\n           ? part0 < 16384\n             ? part0 < 128 ? 1 : 2\n             : part0 < 2097152 ? 3 : 4\n           : part1 < 16384\n             ? part1 < 128 ? 5 : 6\n             : part1 < 2097152 ? 7 : 8\n         : part2 < 128 ? 9 : 10;\n};\n","\"use strict\";\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(\"@protobufjs/aspromise\");\n\n// converts to / from base64 encoded strings\nutil.base64 = require(\"@protobufjs/base64\");\n\n// base class of rpc.Service\nutil.EventEmitter = require(\"@protobufjs/eventemitter\");\n\n// float handling accross browsers\nutil.float = require(\"@protobufjs/float\");\n\n// requires modules optionally and hides the call from bundlers\nutil.inquire = require(\"@protobufjs/inquire\");\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(\"@protobufjs/utf8\");\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(\"@protobufjs/pool\");\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(\"./longbits\");\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n                   && global\n                   && global.process\n                   && global.process.versions\n                   && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n           || typeof window !== \"undefined\" && window\n           || typeof self   !== \"undefined\" && self\n           || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n    return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n    return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n    return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n    var value = obj[prop];\n    if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins\n        return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n    return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor<Buffer>}\n */\nutil.Buffer = (function() {\n    try {\n        var Buffer = util.inquire(\"buffer\").Buffer;\n        // refuse to use non-node buffers if not explicitly assigned (perf reasons):\n        return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;\n    } catch (e) {\n        /* istanbul ignore next */\n        return null;\n    }\n})();\n\n// Internal alias of or polyfull for Buffer.from.\nutil._Buffer_from = null;\n\n// Internal alias of or polyfill for Buffer.allocUnsafe.\nutil._Buffer_allocUnsafe = null;\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n    /* istanbul ignore next */\n    return typeof sizeOrArray === \"number\"\n        ? util.Buffer\n            ? util._Buffer_allocUnsafe(sizeOrArray)\n            : new util.Array(sizeOrArray)\n        : util.Buffer\n            ? util._Buffer_from(sizeOrArray)\n            : typeof Uint8Array === \"undefined\"\n                ? sizeOrArray\n                : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.\n * @type {Constructor<Uint8Array>}\n */\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor<Long>}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n         || /* istanbul ignore next */ util.global.Long\n         || util.inquire(\"long\");\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^true|false|0|1$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n    return value\n        ? util.LongBits.from(value).toHash()\n        : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n    var bits = util.LongBits.fromHash(hash);\n    if (util.Long)\n        return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n    return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.<string,*>} dst Destination object\n * @param {Object.<string,*>} src Source object\n * @param {boolean} [ifNotSet=false] Merges only if the key is not already set\n * @returns {Object.<string,*>} Destination object\n */\nfunction merge(dst, src, ifNotSet) { // used by converters\n    for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n        if (dst[keys[i]] === undefined || !ifNotSet)\n            dst[keys[i]] = src[keys[i]];\n    return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n    return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor<Error>} Custom error constructor\n */\nfunction newError(name) {\n\n    function CustomError(message, properties) {\n\n        if (!(this instanceof CustomError))\n            return new CustomError(message, properties);\n\n        // Error.call(this, message);\n        // ^ just returns a new error instance because the ctor can be called as a function\n\n        Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n        /* istanbul ignore next */\n        if (Error.captureStackTrace) // node\n            Error.captureStackTrace(this, CustomError);\n        else\n            Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n        if (properties)\n            merge(this, properties);\n    }\n\n    CustomError.prototype = Object.create(Error.prototype, {\n        constructor: {\n            value: CustomError,\n            writable: true,\n            enumerable: false,\n            configurable: true,\n        },\n        name: {\n            get: function get() { return name; },\n            set: undefined,\n            enumerable: false,\n            // configurable: false would accurately preserve the behavior of\n            // the original, but I'm guessing that was not intentional.\n            // For an actual error subclass, this property would\n            // be configurable.\n            configurable: true,\n        },\n        toString: {\n            value: function value() { return this.name + \": \" + this.message; },\n            writable: true,\n            enumerable: false,\n            configurable: true,\n        },\n    });\n\n    return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message<T>\n * @constructor\n * @param {string} message Error message\n * @param {Object.<string,*>} [properties] Additional properties\n * @example\n * try {\n *     MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n *     if (e instanceof ProtocolError && e.instance)\n *         console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message<T>}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n    var fieldMap = {};\n    for (var i = 0; i < fieldNames.length; ++i)\n        fieldMap[fieldNames[i]] = 1;\n\n    /**\n     * @returns {string|undefined} Set field name, if any\n     * @this Object\n     * @ignore\n     */\n    return function() { // eslint-disable-line consistent-return\n        for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n            if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n                return keys[i];\n    };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n    /**\n     * @param {string} name Field name\n     * @returns {undefined}\n     * @this Object\n     * @ignore\n     */\n    return function(name) {\n        for (var i = 0; i < fieldNames.length; ++i)\n            if (fieldNames[i] !== name)\n                delete this[fieldNames[i]];\n    };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n    longs: String,\n    enums: String,\n    bytes: String,\n    json: true\n};\n\n// Sets up buffer utility according to the environment (called in index-minimal)\nutil._configure = function() {\n    var Buffer = util.Buffer;\n    /* istanbul ignore if */\n    if (!Buffer) {\n        util._Buffer_from = util._Buffer_allocUnsafe = null;\n        return;\n    }\n    // because node 4.x buffers are incompatible & immutable\n    // see: https://github.com/dcodeIO/protobuf.js/pull/665\n    util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||\n        /* istanbul ignore next */\n        function Buffer_from(value, encoding) {\n            return new Buffer(value, encoding);\n        };\n    util._Buffer_allocUnsafe = Buffer.allocUnsafe ||\n        /* istanbul ignore next */\n        function Buffer_allocUnsafe(size) {\n            return new Buffer(size);\n        };\n};\n","\"use strict\";\nmodule.exports = Writer;\n\nvar util      = require(\"./util/minimal\");\n\nvar BufferWriter; // cyclic\n\nvar LongBits  = util.LongBits,\n    base64    = util.base64,\n    utf8      = util.utf8;\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n    /**\n     * Function to call.\n     * @type {function(Uint8Array, number, *)}\n     */\n    this.fn = fn;\n\n    /**\n     * Value byte length.\n     * @type {number}\n     */\n    this.len = len;\n\n    /**\n     * Next operation.\n     * @type {Writer.Op|undefined}\n     */\n    this.next = undefined;\n\n    /**\n     * Value to write.\n     * @type {*}\n     */\n    this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n    /**\n     * Current head.\n     * @type {Writer.Op}\n     */\n    this.head = writer.head;\n\n    /**\n     * Current tail.\n     * @type {Writer.Op}\n     */\n    this.tail = writer.tail;\n\n    /**\n     * Current buffer length.\n     * @type {number}\n     */\n    this.len = writer.len;\n\n    /**\n     * Next state.\n     * @type {State|null}\n     */\n    this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n    /**\n     * Current length.\n     * @type {number}\n     */\n    this.len = 0;\n\n    /**\n     * Operations head.\n     * @type {Object}\n     */\n    this.head = new Op(noop, 0, 0);\n\n    /**\n     * Operations tail\n     * @type {Object}\n     */\n    this.tail = this.head;\n\n    /**\n     * Linked forked states.\n     * @type {Object|null}\n     */\n    this.states = null;\n\n    // When a value is written, the writer calculates its byte length and puts it into a linked\n    // list of operations to perform when finish() is called. This both allows us to allocate\n    // buffers of the exact required size and reduces the amount of work we have to do compared\n    // to first calculating over objects and then encoding over objects. In our case, the encoding\n    // part is just a linked list walk calling operations with already prepared values.\n}\n\nvar create = function create() {\n    return util.Buffer\n        ? function create_buffer_setup() {\n            return (Writer.create = function create_buffer() {\n                return new BufferWriter();\n            })();\n        }\n        /* istanbul ignore next */\n        : function create_array() {\n            return new Writer();\n        };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n    return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n    Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n    this.tail = this.tail.next = new Op(fn, len, val);\n    this.len += len;\n    return this;\n};\n\nfunction writeByte(val, buf, pos) {\n    buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n    while (val > 127) {\n        buf[pos++] = val & 127 | 128;\n        val >>>= 7;\n    }\n    buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n    this.len = len;\n    this.next = undefined;\n    this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n    // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n    // uint32 is by far the most frequently used operation and benefits significantly from this.\n    this.len += (this.tail = this.tail.next = new VarintOp(\n        (value = value >>> 0)\n                < 128       ? 1\n        : value < 16384     ? 2\n        : value < 2097152   ? 3\n        : value < 268435456 ? 4\n        :                     5,\n    value)).len;\n    return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n    return value < 0\n        ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n        : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n    return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n    while (val.hi) {\n        buf[pos++] = val.lo & 127 | 128;\n        val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n        val.hi >>>= 7;\n    }\n    while (val.lo > 127) {\n        buf[pos++] = val.lo & 127 | 128;\n        val.lo = val.lo >>> 7;\n    }\n    buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n    var bits = LongBits.from(value);\n    return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n    var bits = LongBits.from(value).zzEncode();\n    return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n    return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n    buf[pos    ] =  val         & 255;\n    buf[pos + 1] =  val >>> 8   & 255;\n    buf[pos + 2] =  val >>> 16  & 255;\n    buf[pos + 3] =  val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n    return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n    var bits = LongBits.from(value);\n    return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n    return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n    return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n    ? function writeBytes_set(val, buf, pos) {\n        buf.set(val, pos); // also works for plain array values\n    }\n    /* istanbul ignore next */\n    : function writeBytes_for(val, buf, pos) {\n        for (var i = 0; i < val.length; ++i)\n            buf[pos + i] = val[i];\n    };\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n    var len = value.length >>> 0;\n    if (!len)\n        return this._push(writeByte, 1, 0);\n    if (util.isString(value)) {\n        var buf = Writer.alloc(len = base64.length(value));\n        base64.decode(value, buf, 0);\n        value = buf;\n    }\n    return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n    var len = utf8.length(value);\n    return len\n        ? this.uint32(len)._push(utf8.write, len, value)\n        : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n    this.states = new State(this);\n    this.head = this.tail = new Op(noop, 0, 0);\n    this.len = 0;\n    return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n    if (this.states) {\n        this.head   = this.states.head;\n        this.tail   = this.states.tail;\n        this.len    = this.states.len;\n        this.states = this.states.next;\n    } else {\n        this.head = this.tail = new Op(noop, 0, 0);\n        this.len  = 0;\n    }\n    return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n    var head = this.head,\n        tail = this.tail,\n        len  = this.len;\n    this.reset().uint32(len);\n    if (len) {\n        this.tail.next = head.next; // skip noop\n        this.tail = tail;\n        this.len += len;\n    }\n    return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n    var head = this.head.next, // skip noop\n        buf  = this.constructor.alloc(this.len),\n        pos  = 0;\n    while (head) {\n        head.fn(head.val, buf, pos);\n        pos += head.len;\n        head = head.next;\n    }\n    // this.head = this.tail = null;\n    return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n    BufferWriter = BufferWriter_;\n    Writer.create = create();\n    BufferWriter._configure();\n};\n","\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(\"./writer\");\n(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n    Writer.call(this);\n}\n\nBufferWriter._configure = function () {\n    /**\n     * Allocates a buffer of the specified size.\n     * @function\n     * @param {number} size Buffer size\n     * @returns {Buffer} Buffer\n     */\n    BufferWriter.alloc = util._Buffer_allocUnsafe;\n\n    BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === \"set\"\n        ? function writeBytesBuffer_set(val, buf, pos) {\n          buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n          // also works for plain array values\n        }\n        /* istanbul ignore next */\n        : function writeBytesBuffer_copy(val, buf, pos) {\n          if (val.copy) // Buffer values\n            val.copy(buf, pos, 0, val.length);\n          else for (var i = 0; i < val.length;) // plain array values\n            buf[pos++] = val[i++];\n        };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n    if (util.isString(value))\n        value = util._Buffer_from(value, \"base64\");\n    var len = value.length >>> 0;\n    this.uint32(len);\n    if (len)\n        this._push(BufferWriter.writeBytesBuffer, len, value);\n    return this;\n};\n\nfunction writeStringBuffer(val, buf, pos) {\n    if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)\n        util.utf8.write(val, buf, pos);\n    else if (buf.utf8Write)\n        buf.utf8Write(val, pos);\n    else\n        buf.write(val, pos);\n}\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n    var len = util.Buffer.byteLength(value);\n    this.uint32(len);\n    if (len)\n        this._push(writeStringBuffer, len, value);\n    return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n","\"use strict\";\nmodule.exports = Reader;\n\nvar util      = require(\"./util/minimal\");\n\nvar BufferReader; // cyclic\n\nvar LongBits  = util.LongBits,\n    utf8      = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n    return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n    /**\n     * Read buffer.\n     * @type {Uint8Array}\n     */\n    this.buf = buffer;\n\n    /**\n     * Read buffer position.\n     * @type {number}\n     */\n    this.pos = 0;\n\n    /**\n     * Read buffer length.\n     * @type {number}\n     */\n    this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n    ? function create_typed_array(buffer) {\n        if (buffer instanceof Uint8Array || Array.isArray(buffer))\n            return new Reader(buffer);\n        throw Error(\"illegal buffer\");\n    }\n    /* istanbul ignore next */\n    : function create_array(buffer) {\n        if (Array.isArray(buffer))\n            return new Reader(buffer);\n        throw Error(\"illegal buffer\");\n    };\n\nvar create = function create() {\n    return util.Buffer\n        ? function create_buffer_setup(buffer) {\n            return (Reader.create = function create_buffer(buffer) {\n                return util.Buffer.isBuffer(buffer)\n                    ? new BufferReader(buffer)\n                    /* istanbul ignore next */\n                    : create_array(buffer);\n            })(buffer);\n        }\n        /* istanbul ignore next */\n        : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = (function read_uint32_setup() {\n    var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n    return function read_uint32() {\n        value = (         this.buf[this.pos] & 127       ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) <<  7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] &  15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n        /* istanbul ignore if */\n        if ((this.pos += 5) > this.len) {\n            this.pos = this.len;\n            throw indexOutOfRange(this, 10);\n        }\n        return value;\n    };\n})();\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n    return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n    var value = this.uint32();\n    return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n    // tends to deopt with local vars for octet etc.\n    var bits = new LongBits(0, 0);\n    var i = 0;\n    if (this.len - this.pos > 4) { // fast route (lo)\n        for (; i < 4; ++i) {\n            // 1st..4th\n            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n        // 5th\n        bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n        bits.hi = (bits.hi | (this.buf[this.pos] & 127) >>  4) >>> 0;\n        if (this.buf[this.pos++] < 128)\n            return bits;\n        i = 0;\n    } else {\n        for (; i < 3; ++i) {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n            // 1st..3th\n            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n        // 4th\n        bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n        return bits;\n    }\n    if (this.len - this.pos > 4) { // fast route (hi)\n        for (; i < 5; ++i) {\n            // 6th..10th\n            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n    } else {\n        for (; i < 5; ++i) {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n            // 6th..10th\n            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n    }\n    /* istanbul ignore next */\n    throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n    return this.uint32() !== 0;\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n    return (buf[end - 4]\n          | buf[end - 3] << 8\n          | buf[end - 2] << 16\n          | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n    /* istanbul ignore if */\n    if (this.pos + 8 > this.len)\n        throw indexOutOfRange(this, 8);\n\n    return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    var value = util.float.readFloatLE(this.buf, this.pos);\n    this.pos += 4;\n    return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n    /* istanbul ignore if */\n    if (this.pos + 8 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    var value = util.float.readDoubleLE(this.buf, this.pos);\n    this.pos += 8;\n    return value;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n    var length = this.uint32(),\n        start  = this.pos,\n        end    = this.pos + length;\n\n    /* istanbul ignore if */\n    if (end > this.len)\n        throw indexOutOfRange(this, length);\n\n    this.pos += length;\n    if (Array.isArray(this.buf)) // plain array\n        return this.buf.slice(start, end);\n\n    if (start === end) { // fix for IE 10/Win8 and others' subarray returning array of size 1\n        var nativeBuffer = util.Buffer;\n        return nativeBuffer\n            ? nativeBuffer.alloc(0)\n            : new this.buf.constructor(0);\n    }\n    return this._slice.call(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n    var bytes = this.bytes();\n    return utf8.read(bytes, 0, bytes.length);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n    if (typeof length === \"number\") {\n        /* istanbul ignore if */\n        if (this.pos + length > this.len)\n            throw indexOutOfRange(this, length);\n        this.pos += length;\n    } else {\n        do {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n        } while (this.buf[this.pos++] & 128);\n    }\n    return this;\n};\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType) {\n    switch (wireType) {\n        case 0:\n            this.skip();\n            break;\n        case 1:\n            this.skip(8);\n            break;\n        case 2:\n            this.skip(this.uint32());\n            break;\n        case 3:\n            while ((wireType = this.uint32() & 7) !== 4) {\n                this.skipType(wireType);\n            }\n            break;\n        case 5:\n            this.skip(4);\n            break;\n\n        /* istanbul ignore next */\n        default:\n            throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n    }\n    return this;\n};\n\nReader._configure = function(BufferReader_) {\n    BufferReader = BufferReader_;\n    Reader.create = create();\n    BufferReader._configure();\n\n    var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n    util.merge(Reader.prototype, {\n\n        int64: function read_int64() {\n            return readLongVarint.call(this)[fn](false);\n        },\n\n        uint64: function read_uint64() {\n            return readLongVarint.call(this)[fn](true);\n        },\n\n        sint64: function read_sint64() {\n            return readLongVarint.call(this).zzDecode()[fn](false);\n        },\n\n        fixed64: function read_fixed64() {\n            return readFixed64.call(this)[fn](true);\n        },\n\n        sfixed64: function read_sfixed64() {\n            return readFixed64.call(this)[fn](false);\n        }\n\n    });\n};\n","\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(\"./reader\");\n(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n    Reader.call(this, buffer);\n\n    /**\n     * Read buffer.\n     * @name BufferReader#buf\n     * @type {Buffer}\n     */\n}\n\nBufferReader._configure = function () {\n    /* istanbul ignore else */\n    if (util.Buffer)\n        BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n    var len = this.uint32(); // modifies pos\n    return this.buf.utf8Slice\n        ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))\n        : this.buf.toString(\"utf-8\", this.pos, this.pos = Math.min(this.pos + len, this.len));\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n","\"use strict\";\nmodule.exports = Service;\n\nvar util = require(\"../util/minimal\");\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise<Message<TRes>>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n    if (typeof rpcImpl !== \"function\")\n        throw TypeError(\"rpcImpl must be a function\");\n\n    util.EventEmitter.call(this);\n\n    /**\n     * RPC implementation. Becomes `null` once the service is ended.\n     * @type {RPCImpl|null}\n     */\n    this.rpcImpl = rpcImpl;\n\n    /**\n     * Whether requests are length-delimited.\n     * @type {boolean}\n     */\n    this.requestDelimited = Boolean(requestDelimited);\n\n    /**\n     * Whether responses are length-delimited.\n     * @type {boolean}\n     */\n    this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod<TReq,TRes>} method Reflected or static method\n * @param {Constructor<TReq>} requestCtor Request constructor\n * @param {Constructor<TRes>} responseCtor Response constructor\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n    if (!request)\n        throw TypeError(\"request must be specified\");\n\n    var self = this;\n    if (!callback)\n        return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n    if (!self.rpcImpl) {\n        setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n        return undefined;\n    }\n\n    try {\n        return self.rpcImpl(\n            method,\n            requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n            function rpcCallback(err, response) {\n\n                if (err) {\n                    self.emit(\"error\", err, method);\n                    return callback(err);\n                }\n\n                if (response === null) {\n                    self.end(/* endedByRPC */ true);\n                    return undefined;\n                }\n\n                if (!(response instanceof responseCtor)) {\n                    try {\n                        response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n                    } catch (err) {\n                        self.emit(\"error\", err, method);\n                        return callback(err);\n                    }\n                }\n\n                self.emit(\"data\", response, method);\n                return callback(null, response);\n            }\n        );\n    } catch (err) {\n        self.emit(\"error\", err, method);\n        setTimeout(function() { callback(err); }, 0);\n        return undefined;\n    }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n    if (this.rpcImpl) {\n        if (!endedByRPC) // signal end to rpcImpl\n            this.rpcImpl(null, null, null);\n        this.rpcImpl = null;\n        this.emit(\"end\").off();\n    }\n    return this;\n};\n","\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod<Message<{}>,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n *     if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n *         throw Error(\"no such method\");\n *     asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n *         callback(err, responseData);\n *     });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(\"./rpc/service\");\n","\"use strict\";\nmodule.exports = {};\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available across modules.\n * @name roots\n * @type {Object.<string,Root>}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n","\"use strict\";\nvar protobuf = exports;\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nprotobuf.build = \"minimal\";\n\n// Serialization\nprotobuf.Writer       = require(\"./writer\");\nprotobuf.BufferWriter = require(\"./writer_buffer\");\nprotobuf.Reader       = require(\"./reader\");\nprotobuf.BufferReader = require(\"./reader_buffer\");\n\n// Utility\nprotobuf.util         = require(\"./util/minimal\");\nprotobuf.rpc          = require(\"./rpc\");\nprotobuf.roots        = require(\"./roots\");\nprotobuf.configure    = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n    protobuf.util._configure();\n    protobuf.Writer._configure(protobuf.BufferWriter);\n    protobuf.Reader._configure(protobuf.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n","// minimal library entry point.\n\n\"use strict\";\nmodule.exports = require(\"./src/index-minimal\");\n","/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n'use strict';\n\nvar $protobuf = require('protobufjs/minimal');\n\n// Common aliases\nvar $Reader = $protobuf.Reader,\n  $Writer = $protobuf.Writer,\n  $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots['default'] || ($protobuf.roots['default'] = {});\n\n$root.onnx = (function () {\n  /**\n   * Namespace onnx.\n   * @exports onnx\n   * @namespace\n   */\n  var onnx = {};\n\n  /**\n   * Version enum.\n   * @name onnx.Version\n   * @enum {number}\n   * @property {number} _START_VERSION=0 _START_VERSION value\n   * @property {number} IR_VERSION_2017_10_10=1 IR_VERSION_2017_10_10 value\n   * @property {number} IR_VERSION_2017_10_30=2 IR_VERSION_2017_10_30 value\n   * @property {number} IR_VERSION_2017_11_3=3 IR_VERSION_2017_11_3 value\n   * @property {number} IR_VERSION_2019_1_22=4 IR_VERSION_2019_1_22 value\n   * @property {number} IR_VERSION_2019_3_18=5 IR_VERSION_2019_3_18 value\n   * @property {number} IR_VERSION_2019_9_19=6 IR_VERSION_2019_9_19 value\n   * @property {number} IR_VERSION_2020_5_8=7 IR_VERSION_2020_5_8 value\n   * @property {number} IR_VERSION_2021_7_30=8 IR_VERSION_2021_7_30 value\n   * @property {number} IR_VERSION=9 IR_VERSION value\n   */\n  onnx.Version = (function () {\n    var valuesById = {},\n      values = Object.create(valuesById);\n    values[(valuesById[0] = '_START_VERSION')] = 0;\n    values[(valuesById[1] = 'IR_VERSION_2017_10_10')] = 1;\n    values[(valuesById[2] = 'IR_VERSION_2017_10_30')] = 2;\n    values[(valuesById[3] = 'IR_VERSION_2017_11_3')] = 3;\n    values[(valuesById[4] = 'IR_VERSION_2019_1_22')] = 4;\n    values[(valuesById[5] = 'IR_VERSION_2019_3_18')] = 5;\n    values[(valuesById[6] = 'IR_VERSION_2019_9_19')] = 6;\n    values[(valuesById[7] = 'IR_VERSION_2020_5_8')] = 7;\n    values[(valuesById[8] = 'IR_VERSION_2021_7_30')] = 8;\n    values[(valuesById[9] = 'IR_VERSION')] = 9;\n    return values;\n  })();\n\n  onnx.AttributeProto = (function () {\n    /**\n     * Properties of an AttributeProto.\n     * @memberof onnx\n     * @interface IAttributeProto\n     * @property {string|null} [name] AttributeProto name\n     * @property {string|null} [refAttrName] AttributeProto refAttrName\n     * @property {string|null} [docString] AttributeProto docString\n     * @property {onnx.AttributeProto.AttributeType|null} [type] AttributeProto type\n     * @property {number|null} [f] AttributeProto f\n     * @property {number|Long|null} [i] AttributeProto i\n     * @property {Uint8Array|null} [s] AttributeProto s\n     * @property {onnx.ITensorProto|null} [t] AttributeProto t\n     * @property {onnx.IGraphProto|null} [g] AttributeProto g\n     * @property {onnx.ISparseTensorProto|null} [sparseTensor] AttributeProto sparseTensor\n     * @property {onnx.ITypeProto|null} [tp] AttributeProto tp\n     * @property {Array.<number>|null} [floats] AttributeProto floats\n     * @property {Array.<number|Long>|null} [ints] AttributeProto ints\n     * @property {Array.<Uint8Array>|null} [strings] AttributeProto strings\n     * @property {Array.<onnx.ITensorProto>|null} [tensors] AttributeProto tensors\n     * @property {Array.<onnx.IGraphProto>|null} [graphs] AttributeProto graphs\n     * @property {Array.<onnx.ISparseTensorProto>|null} [sparseTensors] AttributeProto sparseTensors\n     * @property {Array.<onnx.ITypeProto>|null} [typeProtos] AttributeProto typeProtos\n     */\n\n    /**\n     * Constructs a new AttributeProto.\n     * @memberof onnx\n     * @classdesc Represents an AttributeProto.\n     * @implements IAttributeProto\n     * @constructor\n     * @param {onnx.IAttributeProto=} [properties] Properties to set\n     */\n    function AttributeProto(properties) {\n      this.floats = [];\n      this.ints = [];\n      this.strings = [];\n      this.tensors = [];\n      this.graphs = [];\n      this.sparseTensors = [];\n      this.typeProtos = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * AttributeProto name.\n     * @member {string} name\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.name = '';\n\n    /**\n     * AttributeProto refAttrName.\n     * @member {string} refAttrName\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.refAttrName = '';\n\n    /**\n     * AttributeProto docString.\n     * @member {string} docString\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.docString = '';\n\n    /**\n     * AttributeProto type.\n     * @member {onnx.AttributeProto.AttributeType} type\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.type = 0;\n\n    /**\n     * AttributeProto f.\n     * @member {number} f\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.f = 0;\n\n    /**\n     * AttributeProto i.\n     * @member {number|Long} i\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.i = $util.Long ? $util.Long.fromBits(0, 0, false) : 0;\n\n    /**\n     * AttributeProto s.\n     * @member {Uint8Array} s\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.s = $util.newBuffer([]);\n\n    /**\n     * AttributeProto t.\n     * @member {onnx.ITensorProto|null|undefined} t\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.t = null;\n\n    /**\n     * AttributeProto g.\n     * @member {onnx.IGraphProto|null|undefined} g\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.g = null;\n\n    /**\n     * AttributeProto sparseTensor.\n     * @member {onnx.ISparseTensorProto|null|undefined} sparseTensor\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.sparseTensor = null;\n\n    /**\n     * AttributeProto tp.\n     * @member {onnx.ITypeProto|null|undefined} tp\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.tp = null;\n\n    /**\n     * AttributeProto floats.\n     * @member {Array.<number>} floats\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.floats = $util.emptyArray;\n\n    /**\n     * AttributeProto ints.\n     * @member {Array.<number|Long>} ints\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.ints = $util.emptyArray;\n\n    /**\n     * AttributeProto strings.\n     * @member {Array.<Uint8Array>} strings\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.strings = $util.emptyArray;\n\n    /**\n     * AttributeProto tensors.\n     * @member {Array.<onnx.ITensorProto>} tensors\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.tensors = $util.emptyArray;\n\n    /**\n     * AttributeProto graphs.\n     * @member {Array.<onnx.IGraphProto>} graphs\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.graphs = $util.emptyArray;\n\n    /**\n     * AttributeProto sparseTensors.\n     * @member {Array.<onnx.ISparseTensorProto>} sparseTensors\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.sparseTensors = $util.emptyArray;\n\n    /**\n     * AttributeProto typeProtos.\n     * @member {Array.<onnx.ITypeProto>} typeProtos\n     * @memberof onnx.AttributeProto\n     * @instance\n     */\n    AttributeProto.prototype.typeProtos = $util.emptyArray;\n\n    /**\n     * Creates a new AttributeProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.AttributeProto\n     * @static\n     * @param {onnx.IAttributeProto=} [properties] Properties to set\n     * @returns {onnx.AttributeProto} AttributeProto instance\n     */\n    AttributeProto.create = function create(properties) {\n      return new AttributeProto(properties);\n    };\n\n    /**\n     * Encodes the specified AttributeProto message. Does not implicitly {@link onnx.AttributeProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.AttributeProto\n     * @static\n     * @param {onnx.IAttributeProto} message AttributeProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    AttributeProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.name != null && Object.hasOwnProperty.call(message, 'name'))\n        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.name);\n      if (message.f != null && Object.hasOwnProperty.call(message, 'f'))\n        writer.uint32(/* id 2, wireType 5 =*/ 21).float(message.f);\n      if (message.i != null && Object.hasOwnProperty.call(message, 'i'))\n        writer.uint32(/* id 3, wireType 0 =*/ 24).int64(message.i);\n      if (message.s != null && Object.hasOwnProperty.call(message, 's'))\n        writer.uint32(/* id 4, wireType 2 =*/ 34).bytes(message.s);\n      if (message.t != null && Object.hasOwnProperty.call(message, 't'))\n        $root.onnx.TensorProto.encode(message.t, writer.uint32(/* id 5, wireType 2 =*/ 42).fork()).ldelim();\n      if (message.g != null && Object.hasOwnProperty.call(message, 'g'))\n        $root.onnx.GraphProto.encode(message.g, writer.uint32(/* id 6, wireType 2 =*/ 50).fork()).ldelim();\n      if (message.floats != null && message.floats.length) {\n        writer.uint32(/* id 7, wireType 2 =*/ 58).fork();\n        for (var i = 0; i < message.floats.length; ++i) writer.float(message.floats[i]);\n        writer.ldelim();\n      }\n      if (message.ints != null && message.ints.length) {\n        writer.uint32(/* id 8, wireType 2 =*/ 66).fork();\n        for (var i = 0; i < message.ints.length; ++i) writer.int64(message.ints[i]);\n        writer.ldelim();\n      }\n      if (message.strings != null && message.strings.length)\n        for (var i = 0; i < message.strings.length; ++i)\n          writer.uint32(/* id 9, wireType 2 =*/ 74).bytes(message.strings[i]);\n      if (message.tensors != null && message.tensors.length)\n        for (var i = 0; i < message.tensors.length; ++i)\n          $root.onnx.TensorProto.encode(message.tensors[i], writer.uint32(/* id 10, wireType 2 =*/ 82).fork()).ldelim();\n      if (message.graphs != null && message.graphs.length)\n        for (var i = 0; i < message.graphs.length; ++i)\n          $root.onnx.GraphProto.encode(message.graphs[i], writer.uint32(/* id 11, wireType 2 =*/ 90).fork()).ldelim();\n      if (message.docString != null && Object.hasOwnProperty.call(message, 'docString'))\n        writer.uint32(/* id 13, wireType 2 =*/ 106).string(message.docString);\n      if (message.tp != null && Object.hasOwnProperty.call(message, 'tp'))\n        $root.onnx.TypeProto.encode(message.tp, writer.uint32(/* id 14, wireType 2 =*/ 114).fork()).ldelim();\n      if (message.typeProtos != null && message.typeProtos.length)\n        for (var i = 0; i < message.typeProtos.length; ++i)\n          $root.onnx.TypeProto.encode(\n            message.typeProtos[i],\n            writer.uint32(/* id 15, wireType 2 =*/ 122).fork(),\n          ).ldelim();\n      if (message.type != null && Object.hasOwnProperty.call(message, 'type'))\n        writer.uint32(/* id 20, wireType 0 =*/ 160).int32(message.type);\n      if (message.refAttrName != null && Object.hasOwnProperty.call(message, 'refAttrName'))\n        writer.uint32(/* id 21, wireType 2 =*/ 170).string(message.refAttrName);\n      if (message.sparseTensor != null && Object.hasOwnProperty.call(message, 'sparseTensor'))\n        $root.onnx.SparseTensorProto.encode(\n          message.sparseTensor,\n          writer.uint32(/* id 22, wireType 2 =*/ 178).fork(),\n        ).ldelim();\n      if (message.sparseTensors != null && message.sparseTensors.length)\n        for (var i = 0; i < message.sparseTensors.length; ++i)\n          $root.onnx.SparseTensorProto.encode(\n            message.sparseTensors[i],\n            writer.uint32(/* id 23, wireType 2 =*/ 186).fork(),\n          ).ldelim();\n      return writer;\n    };\n\n    /**\n     * Encodes the specified AttributeProto message, length delimited. Does not implicitly {@link onnx.AttributeProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.AttributeProto\n     * @static\n     * @param {onnx.IAttributeProto} message AttributeProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    AttributeProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an AttributeProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.AttributeProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.AttributeProto} AttributeProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    AttributeProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.AttributeProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.name = reader.string();\n            break;\n          }\n          case 21: {\n            message.refAttrName = reader.string();\n            break;\n          }\n          case 13: {\n            message.docString = reader.string();\n            break;\n          }\n          case 20: {\n            message.type = reader.int32();\n            break;\n          }\n          case 2: {\n            message.f = reader.float();\n            break;\n          }\n          case 3: {\n            message.i = reader.int64();\n            break;\n          }\n          case 4: {\n            message.s = reader.bytes();\n            break;\n          }\n          case 5: {\n            message.t = $root.onnx.TensorProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 6: {\n            message.g = $root.onnx.GraphProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 22: {\n            message.sparseTensor = $root.onnx.SparseTensorProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 14: {\n            message.tp = $root.onnx.TypeProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 7: {\n            if (!(message.floats && message.floats.length)) message.floats = [];\n            if ((tag & 7) === 2) {\n              var end2 = reader.uint32() + reader.pos;\n              while (reader.pos < end2) message.floats.push(reader.float());\n            } else message.floats.push(reader.float());\n            break;\n          }\n          case 8: {\n            if (!(message.ints && message.ints.length)) message.ints = [];\n            if ((tag & 7) === 2) {\n              var end2 = reader.uint32() + reader.pos;\n              while (reader.pos < end2) message.ints.push(reader.int64());\n            } else message.ints.push(reader.int64());\n            break;\n          }\n          case 9: {\n            if (!(message.strings && message.strings.length)) message.strings = [];\n            message.strings.push(reader.bytes());\n            break;\n          }\n          case 10: {\n            if (!(message.tensors && message.tensors.length)) message.tensors = [];\n            message.tensors.push($root.onnx.TensorProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 11: {\n            if (!(message.graphs && message.graphs.length)) message.graphs = [];\n            message.graphs.push($root.onnx.GraphProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 23: {\n            if (!(message.sparseTensors && message.sparseTensors.length)) message.sparseTensors = [];\n            message.sparseTensors.push($root.onnx.SparseTensorProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 15: {\n            if (!(message.typeProtos && message.typeProtos.length)) message.typeProtos = [];\n            message.typeProtos.push($root.onnx.TypeProto.decode(reader, reader.uint32()));\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes an AttributeProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.AttributeProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.AttributeProto} AttributeProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    AttributeProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an AttributeProto message.\n     * @function verify\n     * @memberof onnx.AttributeProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    AttributeProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.name != null && message.hasOwnProperty('name'))\n        if (!$util.isString(message.name)) return 'name: string expected';\n      if (message.refAttrName != null && message.hasOwnProperty('refAttrName'))\n        if (!$util.isString(message.refAttrName)) return 'refAttrName: string expected';\n      if (message.docString != null && message.hasOwnProperty('docString'))\n        if (!$util.isString(message.docString)) return 'docString: string expected';\n      if (message.type != null && message.hasOwnProperty('type'))\n        switch (message.type) {\n          default:\n            return 'type: enum value expected';\n          case 0:\n          case 1:\n          case 2:\n          case 3:\n          case 4:\n          case 5:\n          case 11:\n          case 13:\n          case 6:\n          case 7:\n          case 8:\n          case 9:\n          case 10:\n          case 12:\n          case 14:\n            break;\n        }\n      if (message.f != null && message.hasOwnProperty('f'))\n        if (typeof message.f !== 'number') return 'f: number expected';\n      if (message.i != null && message.hasOwnProperty('i'))\n        if (\n          !$util.isInteger(message.i) &&\n          !(message.i && $util.isInteger(message.i.low) && $util.isInteger(message.i.high))\n        )\n          return 'i: integer|Long expected';\n      if (message.s != null && message.hasOwnProperty('s'))\n        if (!((message.s && typeof message.s.length === 'number') || $util.isString(message.s)))\n          return 's: buffer expected';\n      if (message.t != null && message.hasOwnProperty('t')) {\n        var error = $root.onnx.TensorProto.verify(message.t);\n        if (error) return 't.' + error;\n      }\n      if (message.g != null && message.hasOwnProperty('g')) {\n        var error = $root.onnx.GraphProto.verify(message.g);\n        if (error) return 'g.' + error;\n      }\n      if (message.sparseTensor != null && message.hasOwnProperty('sparseTensor')) {\n        var error = $root.onnx.SparseTensorProto.verify(message.sparseTensor);\n        if (error) return 'sparseTensor.' + error;\n      }\n      if (message.tp != null && message.hasOwnProperty('tp')) {\n        var error = $root.onnx.TypeProto.verify(message.tp);\n        if (error) return 'tp.' + error;\n      }\n      if (message.floats != null && message.hasOwnProperty('floats')) {\n        if (!Array.isArray(message.floats)) return 'floats: array expected';\n        for (var i = 0; i < message.floats.length; ++i)\n          if (typeof message.floats[i] !== 'number') return 'floats: number[] expected';\n      }\n      if (message.ints != null && message.hasOwnProperty('ints')) {\n        if (!Array.isArray(message.ints)) return 'ints: array expected';\n        for (var i = 0; i < message.ints.length; ++i)\n          if (\n            !$util.isInteger(message.ints[i]) &&\n            !(message.ints[i] && $util.isInteger(message.ints[i].low) && $util.isInteger(message.ints[i].high))\n          )\n            return 'ints: integer|Long[] expected';\n      }\n      if (message.strings != null && message.hasOwnProperty('strings')) {\n        if (!Array.isArray(message.strings)) return 'strings: array expected';\n        for (var i = 0; i < message.strings.length; ++i)\n          if (\n            !(\n              (message.strings[i] && typeof message.strings[i].length === 'number') ||\n              $util.isString(message.strings[i])\n            )\n          )\n            return 'strings: buffer[] expected';\n      }\n      if (message.tensors != null && message.hasOwnProperty('tensors')) {\n        if (!Array.isArray(message.tensors)) return 'tensors: array expected';\n        for (var i = 0; i < message.tensors.length; ++i) {\n          var error = $root.onnx.TensorProto.verify(message.tensors[i]);\n          if (error) return 'tensors.' + error;\n        }\n      }\n      if (message.graphs != null && message.hasOwnProperty('graphs')) {\n        if (!Array.isArray(message.graphs)) return 'graphs: array expected';\n        for (var i = 0; i < message.graphs.length; ++i) {\n          var error = $root.onnx.GraphProto.verify(message.graphs[i]);\n          if (error) return 'graphs.' + error;\n        }\n      }\n      if (message.sparseTensors != null && message.hasOwnProperty('sparseTensors')) {\n        if (!Array.isArray(message.sparseTensors)) return 'sparseTensors: array expected';\n        for (var i = 0; i < message.sparseTensors.length; ++i) {\n          var error = $root.onnx.SparseTensorProto.verify(message.sparseTensors[i]);\n          if (error) return 'sparseTensors.' + error;\n        }\n      }\n      if (message.typeProtos != null && message.hasOwnProperty('typeProtos')) {\n        if (!Array.isArray(message.typeProtos)) return 'typeProtos: array expected';\n        for (var i = 0; i < message.typeProtos.length; ++i) {\n          var error = $root.onnx.TypeProto.verify(message.typeProtos[i]);\n          if (error) return 'typeProtos.' + error;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Creates an AttributeProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.AttributeProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.AttributeProto} AttributeProto\n     */\n    AttributeProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.AttributeProto) return object;\n      var message = new $root.onnx.AttributeProto();\n      if (object.name != null) message.name = String(object.name);\n      if (object.refAttrName != null) message.refAttrName = String(object.refAttrName);\n      if (object.docString != null) message.docString = String(object.docString);\n      switch (object.type) {\n        default:\n          if (typeof object.type === 'number') {\n            message.type = object.type;\n            break;\n          }\n          break;\n        case 'UNDEFINED':\n        case 0:\n          message.type = 0;\n          break;\n        case 'FLOAT':\n        case 1:\n          message.type = 1;\n          break;\n        case 'INT':\n        case 2:\n          message.type = 2;\n          break;\n        case 'STRING':\n        case 3:\n          message.type = 3;\n          break;\n        case 'TENSOR':\n        case 4:\n          message.type = 4;\n          break;\n        case 'GRAPH':\n        case 5:\n          message.type = 5;\n          break;\n        case 'SPARSE_TENSOR':\n        case 11:\n          message.type = 11;\n          break;\n        case 'TYPE_PROTO':\n        case 13:\n          message.type = 13;\n          break;\n        case 'FLOATS':\n        case 6:\n          message.type = 6;\n          break;\n        case 'INTS':\n        case 7:\n          message.type = 7;\n          break;\n        case 'STRINGS':\n        case 8:\n          message.type = 8;\n          break;\n        case 'TENSORS':\n        case 9:\n          message.type = 9;\n          break;\n        case 'GRAPHS':\n        case 10:\n          message.type = 10;\n          break;\n        case 'SPARSE_TENSORS':\n        case 12:\n          message.type = 12;\n          break;\n        case 'TYPE_PROTOS':\n        case 14:\n          message.type = 14;\n          break;\n      }\n      if (object.f != null) message.f = Number(object.f);\n      if (object.i != null)\n        if ($util.Long) (message.i = $util.Long.fromValue(object.i)).unsigned = false;\n        else if (typeof object.i === 'string') message.i = parseInt(object.i, 10);\n        else if (typeof object.i === 'number') message.i = object.i;\n        else if (typeof object.i === 'object')\n          message.i = new $util.LongBits(object.i.low >>> 0, object.i.high >>> 0).toNumber();\n      if (object.s != null)\n        if (typeof object.s === 'string')\n          $util.base64.decode(object.s, (message.s = $util.newBuffer($util.base64.length(object.s))), 0);\n        else if (object.s.length >= 0) message.s = object.s;\n      if (object.t != null) {\n        if (typeof object.t !== 'object') throw TypeError('.onnx.AttributeProto.t: object expected');\n        message.t = $root.onnx.TensorProto.fromObject(object.t);\n      }\n      if (object.g != null) {\n        if (typeof object.g !== 'object') throw TypeError('.onnx.AttributeProto.g: object expected');\n        message.g = $root.onnx.GraphProto.fromObject(object.g);\n      }\n      if (object.sparseTensor != null) {\n        if (typeof object.sparseTensor !== 'object')\n          throw TypeError('.onnx.AttributeProto.sparseTensor: object expected');\n        message.sparseTensor = $root.onnx.SparseTensorProto.fromObject(object.sparseTensor);\n      }\n      if (object.tp != null) {\n        if (typeof object.tp !== 'object') throw TypeError('.onnx.AttributeProto.tp: object expected');\n        message.tp = $root.onnx.TypeProto.fromObject(object.tp);\n      }\n      if (object.floats) {\n        if (!Array.isArray(object.floats)) throw TypeError('.onnx.AttributeProto.floats: array expected');\n        message.floats = [];\n        for (var i = 0; i < object.floats.length; ++i) message.floats[i] = Number(object.floats[i]);\n      }\n      if (object.ints) {\n        if (!Array.isArray(object.ints)) throw TypeError('.onnx.AttributeProto.ints: array expected');\n        message.ints = [];\n        for (var i = 0; i < object.ints.length; ++i)\n          if ($util.Long) (message.ints[i] = $util.Long.fromValue(object.ints[i])).unsigned = false;\n          else if (typeof object.ints[i] === 'string') message.ints[i] = parseInt(object.ints[i], 10);\n          else if (typeof object.ints[i] === 'number') message.ints[i] = object.ints[i];\n          else if (typeof object.ints[i] === 'object')\n            message.ints[i] = new $util.LongBits(object.ints[i].low >>> 0, object.ints[i].high >>> 0).toNumber();\n      }\n      if (object.strings) {\n        if (!Array.isArray(object.strings)) throw TypeError('.onnx.AttributeProto.strings: array expected');\n        message.strings = [];\n        for (var i = 0; i < object.strings.length; ++i)\n          if (typeof object.strings[i] === 'string')\n            $util.base64.decode(\n              object.strings[i],\n              (message.strings[i] = $util.newBuffer($util.base64.length(object.strings[i]))),\n              0,\n            );\n          else if (object.strings[i].length >= 0) message.strings[i] = object.strings[i];\n      }\n      if (object.tensors) {\n        if (!Array.isArray(object.tensors)) throw TypeError('.onnx.AttributeProto.tensors: array expected');\n        message.tensors = [];\n        for (var i = 0; i < object.tensors.length; ++i) {\n          if (typeof object.tensors[i] !== 'object') throw TypeError('.onnx.AttributeProto.tensors: object expected');\n          message.tensors[i] = $root.onnx.TensorProto.fromObject(object.tensors[i]);\n        }\n      }\n      if (object.graphs) {\n        if (!Array.isArray(object.graphs)) throw TypeError('.onnx.AttributeProto.graphs: array expected');\n        message.graphs = [];\n        for (var i = 0; i < object.graphs.length; ++i) {\n          if (typeof object.graphs[i] !== 'object') throw TypeError('.onnx.AttributeProto.graphs: object expected');\n          message.graphs[i] = $root.onnx.GraphProto.fromObject(object.graphs[i]);\n        }\n      }\n      if (object.sparseTensors) {\n        if (!Array.isArray(object.sparseTensors)) throw TypeError('.onnx.AttributeProto.sparseTensors: array expected');\n        message.sparseTensors = [];\n        for (var i = 0; i < object.sparseTensors.length; ++i) {\n          if (typeof object.sparseTensors[i] !== 'object')\n            throw TypeError('.onnx.AttributeProto.sparseTensors: object expected');\n          message.sparseTensors[i] = $root.onnx.SparseTensorProto.fromObject(object.sparseTensors[i]);\n        }\n      }\n      if (object.typeProtos) {\n        if (!Array.isArray(object.typeProtos)) throw TypeError('.onnx.AttributeProto.typeProtos: array expected');\n        message.typeProtos = [];\n        for (var i = 0; i < object.typeProtos.length; ++i) {\n          if (typeof object.typeProtos[i] !== 'object')\n            throw TypeError('.onnx.AttributeProto.typeProtos: object expected');\n          message.typeProtos[i] = $root.onnx.TypeProto.fromObject(object.typeProtos[i]);\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Creates a plain object from an AttributeProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.AttributeProto\n     * @static\n     * @param {onnx.AttributeProto} message AttributeProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    AttributeProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) {\n        object.floats = [];\n        object.ints = [];\n        object.strings = [];\n        object.tensors = [];\n        object.graphs = [];\n        object.typeProtos = [];\n        object.sparseTensors = [];\n      }\n      if (options.defaults) {\n        object.name = '';\n        object.f = 0;\n        if ($util.Long) {\n          var long = new $util.Long(0, 0, false);\n          object.i = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n        } else object.i = options.longs === String ? '0' : 0;\n        if (options.bytes === String) object.s = '';\n        else {\n          object.s = [];\n          if (options.bytes !== Array) object.s = $util.newBuffer(object.s);\n        }\n        object.t = null;\n        object.g = null;\n        object.docString = '';\n        object.tp = null;\n        object.type = options.enums === String ? 'UNDEFINED' : 0;\n        object.refAttrName = '';\n        object.sparseTensor = null;\n      }\n      if (message.name != null && message.hasOwnProperty('name')) object.name = message.name;\n      if (message.f != null && message.hasOwnProperty('f'))\n        object.f = options.json && !isFinite(message.f) ? String(message.f) : message.f;\n      if (message.i != null && message.hasOwnProperty('i'))\n        if (typeof message.i === 'number') object.i = options.longs === String ? String(message.i) : message.i;\n        else\n          object.i =\n            options.longs === String\n              ? $util.Long.prototype.toString.call(message.i)\n              : options.longs === Number\n                ? new $util.LongBits(message.i.low >>> 0, message.i.high >>> 0).toNumber()\n                : message.i;\n      if (message.s != null && message.hasOwnProperty('s'))\n        object.s =\n          options.bytes === String\n            ? $util.base64.encode(message.s, 0, message.s.length)\n            : options.bytes === Array\n              ? Array.prototype.slice.call(message.s)\n              : message.s;\n      if (message.t != null && message.hasOwnProperty('t'))\n        object.t = $root.onnx.TensorProto.toObject(message.t, options);\n      if (message.g != null && message.hasOwnProperty('g'))\n        object.g = $root.onnx.GraphProto.toObject(message.g, options);\n      if (message.floats && message.floats.length) {\n        object.floats = [];\n        for (var j = 0; j < message.floats.length; ++j)\n          object.floats[j] =\n            options.json && !isFinite(message.floats[j]) ? String(message.floats[j]) : message.floats[j];\n      }\n      if (message.ints && message.ints.length) {\n        object.ints = [];\n        for (var j = 0; j < message.ints.length; ++j)\n          if (typeof message.ints[j] === 'number')\n            object.ints[j] = options.longs === String ? String(message.ints[j]) : message.ints[j];\n          else\n            object.ints[j] =\n              options.longs === String\n                ? $util.Long.prototype.toString.call(message.ints[j])\n                : options.longs === Number\n                  ? new $util.LongBits(message.ints[j].low >>> 0, message.ints[j].high >>> 0).toNumber()\n                  : message.ints[j];\n      }\n      if (message.strings && message.strings.length) {\n        object.strings = [];\n        for (var j = 0; j < message.strings.length; ++j)\n          object.strings[j] =\n            options.bytes === String\n              ? $util.base64.encode(message.strings[j], 0, message.strings[j].length)\n              : options.bytes === Array\n                ? Array.prototype.slice.call(message.strings[j])\n                : message.strings[j];\n      }\n      if (message.tensors && message.tensors.length) {\n        object.tensors = [];\n        for (var j = 0; j < message.tensors.length; ++j)\n          object.tensors[j] = $root.onnx.TensorProto.toObject(message.tensors[j], options);\n      }\n      if (message.graphs && message.graphs.length) {\n        object.graphs = [];\n        for (var j = 0; j < message.graphs.length; ++j)\n          object.graphs[j] = $root.onnx.GraphProto.toObject(message.graphs[j], options);\n      }\n      if (message.docString != null && message.hasOwnProperty('docString')) object.docString = message.docString;\n      if (message.tp != null && message.hasOwnProperty('tp'))\n        object.tp = $root.onnx.TypeProto.toObject(message.tp, options);\n      if (message.typeProtos && message.typeProtos.length) {\n        object.typeProtos = [];\n        for (var j = 0; j < message.typeProtos.length; ++j)\n          object.typeProtos[j] = $root.onnx.TypeProto.toObject(message.typeProtos[j], options);\n      }\n      if (message.type != null && message.hasOwnProperty('type'))\n        object.type =\n          options.enums === String\n            ? $root.onnx.AttributeProto.AttributeType[message.type] === undefined\n              ? message.type\n              : $root.onnx.AttributeProto.AttributeType[message.type]\n            : message.type;\n      if (message.refAttrName != null && message.hasOwnProperty('refAttrName'))\n        object.refAttrName = message.refAttrName;\n      if (message.sparseTensor != null && message.hasOwnProperty('sparseTensor'))\n        object.sparseTensor = $root.onnx.SparseTensorProto.toObject(message.sparseTensor, options);\n      if (message.sparseTensors && message.sparseTensors.length) {\n        object.sparseTensors = [];\n        for (var j = 0; j < message.sparseTensors.length; ++j)\n          object.sparseTensors[j] = $root.onnx.SparseTensorProto.toObject(message.sparseTensors[j], options);\n      }\n      return object;\n    };\n\n    /**\n     * Converts this AttributeProto to JSON.\n     * @function toJSON\n     * @memberof onnx.AttributeProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    AttributeProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for AttributeProto\n     * @function getTypeUrl\n     * @memberof onnx.AttributeProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    AttributeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.AttributeProto';\n    };\n\n    /**\n     * AttributeType enum.\n     * @name onnx.AttributeProto.AttributeType\n     * @enum {number}\n     * @property {number} UNDEFINED=0 UNDEFINED value\n     * @property {number} FLOAT=1 FLOAT value\n     * @property {number} INT=2 INT value\n     * @property {number} STRING=3 STRING value\n     * @property {number} TENSOR=4 TENSOR value\n     * @property {number} GRAPH=5 GRAPH value\n     * @property {number} SPARSE_TENSOR=11 SPARSE_TENSOR value\n     * @property {number} TYPE_PROTO=13 TYPE_PROTO value\n     * @property {number} FLOATS=6 FLOATS value\n     * @property {number} INTS=7 INTS value\n     * @property {number} STRINGS=8 STRINGS value\n     * @property {number} TENSORS=9 TENSORS value\n     * @property {number} GRAPHS=10 GRAPHS value\n     * @property {number} SPARSE_TENSORS=12 SPARSE_TENSORS value\n     * @property {number} TYPE_PROTOS=14 TYPE_PROTOS value\n     */\n    AttributeProto.AttributeType = (function () {\n      var valuesById = {},\n        values = Object.create(valuesById);\n      values[(valuesById[0] = 'UNDEFINED')] = 0;\n      values[(valuesById[1] = 'FLOAT')] = 1;\n      values[(valuesById[2] = 'INT')] = 2;\n      values[(valuesById[3] = 'STRING')] = 3;\n      values[(valuesById[4] = 'TENSOR')] = 4;\n      values[(valuesById[5] = 'GRAPH')] = 5;\n      values[(valuesById[11] = 'SPARSE_TENSOR')] = 11;\n      values[(valuesById[13] = 'TYPE_PROTO')] = 13;\n      values[(valuesById[6] = 'FLOATS')] = 6;\n      values[(valuesById[7] = 'INTS')] = 7;\n      values[(valuesById[8] = 'STRINGS')] = 8;\n      values[(valuesById[9] = 'TENSORS')] = 9;\n      values[(valuesById[10] = 'GRAPHS')] = 10;\n      values[(valuesById[12] = 'SPARSE_TENSORS')] = 12;\n      values[(valuesById[14] = 'TYPE_PROTOS')] = 14;\n      return values;\n    })();\n\n    return AttributeProto;\n  })();\n\n  onnx.ValueInfoProto = (function () {\n    /**\n     * Properties of a ValueInfoProto.\n     * @memberof onnx\n     * @interface IValueInfoProto\n     * @property {string|null} [name] ValueInfoProto name\n     * @property {onnx.ITypeProto|null} [type] ValueInfoProto type\n     * @property {string|null} [docString] ValueInfoProto docString\n     */\n\n    /**\n     * Constructs a new ValueInfoProto.\n     * @memberof onnx\n     * @classdesc Represents a ValueInfoProto.\n     * @implements IValueInfoProto\n     * @constructor\n     * @param {onnx.IValueInfoProto=} [properties] Properties to set\n     */\n    function ValueInfoProto(properties) {\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ValueInfoProto name.\n     * @member {string} name\n     * @memberof onnx.ValueInfoProto\n     * @instance\n     */\n    ValueInfoProto.prototype.name = '';\n\n    /**\n     * ValueInfoProto type.\n     * @member {onnx.ITypeProto|null|undefined} type\n     * @memberof onnx.ValueInfoProto\n     * @instance\n     */\n    ValueInfoProto.prototype.type = null;\n\n    /**\n     * ValueInfoProto docString.\n     * @member {string} docString\n     * @memberof onnx.ValueInfoProto\n     * @instance\n     */\n    ValueInfoProto.prototype.docString = '';\n\n    /**\n     * Creates a new ValueInfoProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.ValueInfoProto\n     * @static\n     * @param {onnx.IValueInfoProto=} [properties] Properties to set\n     * @returns {onnx.ValueInfoProto} ValueInfoProto instance\n     */\n    ValueInfoProto.create = function create(properties) {\n      return new ValueInfoProto(properties);\n    };\n\n    /**\n     * Encodes the specified ValueInfoProto message. Does not implicitly {@link onnx.ValueInfoProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.ValueInfoProto\n     * @static\n     * @param {onnx.IValueInfoProto} message ValueInfoProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ValueInfoProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.name != null && Object.hasOwnProperty.call(message, 'name'))\n        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.name);\n      if (message.type != null && Object.hasOwnProperty.call(message, 'type'))\n        $root.onnx.TypeProto.encode(message.type, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();\n      if (message.docString != null && Object.hasOwnProperty.call(message, 'docString'))\n        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.docString);\n      return writer;\n    };\n\n    /**\n     * Encodes the specified ValueInfoProto message, length delimited. Does not implicitly {@link onnx.ValueInfoProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.ValueInfoProto\n     * @static\n     * @param {onnx.IValueInfoProto} message ValueInfoProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ValueInfoProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a ValueInfoProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.ValueInfoProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.ValueInfoProto} ValueInfoProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ValueInfoProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.ValueInfoProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.name = reader.string();\n            break;\n          }\n          case 2: {\n            message.type = $root.onnx.TypeProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 3: {\n            message.docString = reader.string();\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a ValueInfoProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.ValueInfoProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.ValueInfoProto} ValueInfoProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ValueInfoProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a ValueInfoProto message.\n     * @function verify\n     * @memberof onnx.ValueInfoProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ValueInfoProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.name != null && message.hasOwnProperty('name'))\n        if (!$util.isString(message.name)) return 'name: string expected';\n      if (message.type != null && message.hasOwnProperty('type')) {\n        var error = $root.onnx.TypeProto.verify(message.type);\n        if (error) return 'type.' + error;\n      }\n      if (message.docString != null && message.hasOwnProperty('docString'))\n        if (!$util.isString(message.docString)) return 'docString: string expected';\n      return null;\n    };\n\n    /**\n     * Creates a ValueInfoProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.ValueInfoProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.ValueInfoProto} ValueInfoProto\n     */\n    ValueInfoProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.ValueInfoProto) return object;\n      var message = new $root.onnx.ValueInfoProto();\n      if (object.name != null) message.name = String(object.name);\n      if (object.type != null) {\n        if (typeof object.type !== 'object') throw TypeError('.onnx.ValueInfoProto.type: object expected');\n        message.type = $root.onnx.TypeProto.fromObject(object.type);\n      }\n      if (object.docString != null) message.docString = String(object.docString);\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a ValueInfoProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.ValueInfoProto\n     * @static\n     * @param {onnx.ValueInfoProto} message ValueInfoProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ValueInfoProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.defaults) {\n        object.name = '';\n        object.type = null;\n        object.docString = '';\n      }\n      if (message.name != null && message.hasOwnProperty('name')) object.name = message.name;\n      if (message.type != null && message.hasOwnProperty('type'))\n        object.type = $root.onnx.TypeProto.toObject(message.type, options);\n      if (message.docString != null && message.hasOwnProperty('docString')) object.docString = message.docString;\n      return object;\n    };\n\n    /**\n     * Converts this ValueInfoProto to JSON.\n     * @function toJSON\n     * @memberof onnx.ValueInfoProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ValueInfoProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for ValueInfoProto\n     * @function getTypeUrl\n     * @memberof onnx.ValueInfoProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    ValueInfoProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.ValueInfoProto';\n    };\n\n    return ValueInfoProto;\n  })();\n\n  onnx.NodeProto = (function () {\n    /**\n     * Properties of a NodeProto.\n     * @memberof onnx\n     * @interface INodeProto\n     * @property {Array.<string>|null} [input] NodeProto input\n     * @property {Array.<string>|null} [output] NodeProto output\n     * @property {string|null} [name] NodeProto name\n     * @property {string|null} [opType] NodeProto opType\n     * @property {string|null} [domain] NodeProto domain\n     * @property {Array.<onnx.IAttributeProto>|null} [attribute] NodeProto attribute\n     * @property {string|null} [docString] NodeProto docString\n     */\n\n    /**\n     * Constructs a new NodeProto.\n     * @memberof onnx\n     * @classdesc Represents a NodeProto.\n     * @implements INodeProto\n     * @constructor\n     * @param {onnx.INodeProto=} [properties] Properties to set\n     */\n    function NodeProto(properties) {\n      this.input = [];\n      this.output = [];\n      this.attribute = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * NodeProto input.\n     * @member {Array.<string>} input\n     * @memberof onnx.NodeProto\n     * @instance\n     */\n    NodeProto.prototype.input = $util.emptyArray;\n\n    /**\n     * NodeProto output.\n     * @member {Array.<string>} output\n     * @memberof onnx.NodeProto\n     * @instance\n     */\n    NodeProto.prototype.output = $util.emptyArray;\n\n    /**\n     * NodeProto name.\n     * @member {string} name\n     * @memberof onnx.NodeProto\n     * @instance\n     */\n    NodeProto.prototype.name = '';\n\n    /**\n     * NodeProto opType.\n     * @member {string} opType\n     * @memberof onnx.NodeProto\n     * @instance\n     */\n    NodeProto.prototype.opType = '';\n\n    /**\n     * NodeProto domain.\n     * @member {string} domain\n     * @memberof onnx.NodeProto\n     * @instance\n     */\n    NodeProto.prototype.domain = '';\n\n    /**\n     * NodeProto attribute.\n     * @member {Array.<onnx.IAttributeProto>} attribute\n     * @memberof onnx.NodeProto\n     * @instance\n     */\n    NodeProto.prototype.attribute = $util.emptyArray;\n\n    /**\n     * NodeProto docString.\n     * @member {string} docString\n     * @memberof onnx.NodeProto\n     * @instance\n     */\n    NodeProto.prototype.docString = '';\n\n    /**\n     * Creates a new NodeProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.NodeProto\n     * @static\n     * @param {onnx.INodeProto=} [properties] Properties to set\n     * @returns {onnx.NodeProto} NodeProto instance\n     */\n    NodeProto.create = function create(properties) {\n      return new NodeProto(properties);\n    };\n\n    /**\n     * Encodes the specified NodeProto message. Does not implicitly {@link onnx.NodeProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.NodeProto\n     * @static\n     * @param {onnx.INodeProto} message NodeProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    NodeProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.input != null && message.input.length)\n        for (var i = 0; i < message.input.length; ++i)\n          writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.input[i]);\n      if (message.output != null && message.output.length)\n        for (var i = 0; i < message.output.length; ++i)\n          writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.output[i]);\n      if (message.name != null && Object.hasOwnProperty.call(message, 'name'))\n        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.name);\n      if (message.opType != null && Object.hasOwnProperty.call(message, 'opType'))\n        writer.uint32(/* id 4, wireType 2 =*/ 34).string(message.opType);\n      if (message.attribute != null && message.attribute.length)\n        for (var i = 0; i < message.attribute.length; ++i)\n          $root.onnx.AttributeProto.encode(\n            message.attribute[i],\n            writer.uint32(/* id 5, wireType 2 =*/ 42).fork(),\n          ).ldelim();\n      if (message.docString != null && Object.hasOwnProperty.call(message, 'docString'))\n        writer.uint32(/* id 6, wireType 2 =*/ 50).string(message.docString);\n      if (message.domain != null && Object.hasOwnProperty.call(message, 'domain'))\n        writer.uint32(/* id 7, wireType 2 =*/ 58).string(message.domain);\n      return writer;\n    };\n\n    /**\n     * Encodes the specified NodeProto message, length delimited. Does not implicitly {@link onnx.NodeProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.NodeProto\n     * @static\n     * @param {onnx.INodeProto} message NodeProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    NodeProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a NodeProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.NodeProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.NodeProto} NodeProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    NodeProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.NodeProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            if (!(message.input && message.input.length)) message.input = [];\n            message.input.push(reader.string());\n            break;\n          }\n          case 2: {\n            if (!(message.output && message.output.length)) message.output = [];\n            message.output.push(reader.string());\n            break;\n          }\n          case 3: {\n            message.name = reader.string();\n            break;\n          }\n          case 4: {\n            message.opType = reader.string();\n            break;\n          }\n          case 7: {\n            message.domain = reader.string();\n            break;\n          }\n          case 5: {\n            if (!(message.attribute && message.attribute.length)) message.attribute = [];\n            message.attribute.push($root.onnx.AttributeProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 6: {\n            message.docString = reader.string();\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a NodeProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.NodeProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.NodeProto} NodeProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    NodeProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a NodeProto message.\n     * @function verify\n     * @memberof onnx.NodeProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    NodeProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.input != null && message.hasOwnProperty('input')) {\n        if (!Array.isArray(message.input)) return 'input: array expected';\n        for (var i = 0; i < message.input.length; ++i)\n          if (!$util.isString(message.input[i])) return 'input: string[] expected';\n      }\n      if (message.output != null && message.hasOwnProperty('output')) {\n        if (!Array.isArray(message.output)) return 'output: array expected';\n        for (var i = 0; i < message.output.length; ++i)\n          if (!$util.isString(message.output[i])) return 'output: string[] expected';\n      }\n      if (message.name != null && message.hasOwnProperty('name'))\n        if (!$util.isString(message.name)) return 'name: string expected';\n      if (message.opType != null && message.hasOwnProperty('opType'))\n        if (!$util.isString(message.opType)) return 'opType: string expected';\n      if (message.domain != null && message.hasOwnProperty('domain'))\n        if (!$util.isString(message.domain)) return 'domain: string expected';\n      if (message.attribute != null && message.hasOwnProperty('attribute')) {\n        if (!Array.isArray(message.attribute)) return 'attribute: array expected';\n        for (var i = 0; i < message.attribute.length; ++i) {\n          var error = $root.onnx.AttributeProto.verify(message.attribute[i]);\n          if (error) return 'attribute.' + error;\n        }\n      }\n      if (message.docString != null && message.hasOwnProperty('docString'))\n        if (!$util.isString(message.docString)) return 'docString: string expected';\n      return null;\n    };\n\n    /**\n     * Creates a NodeProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.NodeProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.NodeProto} NodeProto\n     */\n    NodeProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.NodeProto) return object;\n      var message = new $root.onnx.NodeProto();\n      if (object.input) {\n        if (!Array.isArray(object.input)) throw TypeError('.onnx.NodeProto.input: array expected');\n        message.input = [];\n        for (var i = 0; i < object.input.length; ++i) message.input[i] = String(object.input[i]);\n      }\n      if (object.output) {\n        if (!Array.isArray(object.output)) throw TypeError('.onnx.NodeProto.output: array expected');\n        message.output = [];\n        for (var i = 0; i < object.output.length; ++i) message.output[i] = String(object.output[i]);\n      }\n      if (object.name != null) message.name = String(object.name);\n      if (object.opType != null) message.opType = String(object.opType);\n      if (object.domain != null) message.domain = String(object.domain);\n      if (object.attribute) {\n        if (!Array.isArray(object.attribute)) throw TypeError('.onnx.NodeProto.attribute: array expected');\n        message.attribute = [];\n        for (var i = 0; i < object.attribute.length; ++i) {\n          if (typeof object.attribute[i] !== 'object') throw TypeError('.onnx.NodeProto.attribute: object expected');\n          message.attribute[i] = $root.onnx.AttributeProto.fromObject(object.attribute[i]);\n        }\n      }\n      if (object.docString != null) message.docString = String(object.docString);\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a NodeProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.NodeProto\n     * @static\n     * @param {onnx.NodeProto} message NodeProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    NodeProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) {\n        object.input = [];\n        object.output = [];\n        object.attribute = [];\n      }\n      if (options.defaults) {\n        object.name = '';\n        object.opType = '';\n        object.docString = '';\n        object.domain = '';\n      }\n      if (message.input && message.input.length) {\n        object.input = [];\n        for (var j = 0; j < message.input.length; ++j) object.input[j] = message.input[j];\n      }\n      if (message.output && message.output.length) {\n        object.output = [];\n        for (var j = 0; j < message.output.length; ++j) object.output[j] = message.output[j];\n      }\n      if (message.name != null && message.hasOwnProperty('name')) object.name = message.name;\n      if (message.opType != null && message.hasOwnProperty('opType')) object.opType = message.opType;\n      if (message.attribute && message.attribute.length) {\n        object.attribute = [];\n        for (var j = 0; j < message.attribute.length; ++j)\n          object.attribute[j] = $root.onnx.AttributeProto.toObject(message.attribute[j], options);\n      }\n      if (message.docString != null && message.hasOwnProperty('docString')) object.docString = message.docString;\n      if (message.domain != null && message.hasOwnProperty('domain')) object.domain = message.domain;\n      return object;\n    };\n\n    /**\n     * Converts this NodeProto to JSON.\n     * @function toJSON\n     * @memberof onnx.NodeProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    NodeProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for NodeProto\n     * @function getTypeUrl\n     * @memberof onnx.NodeProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    NodeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.NodeProto';\n    };\n\n    return NodeProto;\n  })();\n\n  onnx.TrainingInfoProto = (function () {\n    /**\n     * Properties of a TrainingInfoProto.\n     * @memberof onnx\n     * @interface ITrainingInfoProto\n     * @property {onnx.IGraphProto|null} [initialization] TrainingInfoProto initialization\n     * @property {onnx.IGraphProto|null} [algorithm] TrainingInfoProto algorithm\n     * @property {Array.<onnx.IStringStringEntryProto>|null} [initializationBinding] TrainingInfoProto initializationBinding\n     * @property {Array.<onnx.IStringStringEntryProto>|null} [updateBinding] TrainingInfoProto updateBinding\n     */\n\n    /**\n     * Constructs a new TrainingInfoProto.\n     * @memberof onnx\n     * @classdesc Represents a TrainingInfoProto.\n     * @implements ITrainingInfoProto\n     * @constructor\n     * @param {onnx.ITrainingInfoProto=} [properties] Properties to set\n     */\n    function TrainingInfoProto(properties) {\n      this.initializationBinding = [];\n      this.updateBinding = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * TrainingInfoProto initialization.\n     * @member {onnx.IGraphProto|null|undefined} initialization\n     * @memberof onnx.TrainingInfoProto\n     * @instance\n     */\n    TrainingInfoProto.prototype.initialization = null;\n\n    /**\n     * TrainingInfoProto algorithm.\n     * @member {onnx.IGraphProto|null|undefined} algorithm\n     * @memberof onnx.TrainingInfoProto\n     * @instance\n     */\n    TrainingInfoProto.prototype.algorithm = null;\n\n    /**\n     * TrainingInfoProto initializationBinding.\n     * @member {Array.<onnx.IStringStringEntryProto>} initializationBinding\n     * @memberof onnx.TrainingInfoProto\n     * @instance\n     */\n    TrainingInfoProto.prototype.initializationBinding = $util.emptyArray;\n\n    /**\n     * TrainingInfoProto updateBinding.\n     * @member {Array.<onnx.IStringStringEntryProto>} updateBinding\n     * @memberof onnx.TrainingInfoProto\n     * @instance\n     */\n    TrainingInfoProto.prototype.updateBinding = $util.emptyArray;\n\n    /**\n     * Creates a new TrainingInfoProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.TrainingInfoProto\n     * @static\n     * @param {onnx.ITrainingInfoProto=} [properties] Properties to set\n     * @returns {onnx.TrainingInfoProto} TrainingInfoProto instance\n     */\n    TrainingInfoProto.create = function create(properties) {\n      return new TrainingInfoProto(properties);\n    };\n\n    /**\n     * Encodes the specified TrainingInfoProto message. Does not implicitly {@link onnx.TrainingInfoProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.TrainingInfoProto\n     * @static\n     * @param {onnx.ITrainingInfoProto} message TrainingInfoProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TrainingInfoProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.initialization != null && Object.hasOwnProperty.call(message, 'initialization'))\n        $root.onnx.GraphProto.encode(message.initialization, writer.uint32(/* id 1, wireType 2 =*/ 10).fork()).ldelim();\n      if (message.algorithm != null && Object.hasOwnProperty.call(message, 'algorithm'))\n        $root.onnx.GraphProto.encode(message.algorithm, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();\n      if (message.initializationBinding != null && message.initializationBinding.length)\n        for (var i = 0; i < message.initializationBinding.length; ++i)\n          $root.onnx.StringStringEntryProto.encode(\n            message.initializationBinding[i],\n            writer.uint32(/* id 3, wireType 2 =*/ 26).fork(),\n          ).ldelim();\n      if (message.updateBinding != null && message.updateBinding.length)\n        for (var i = 0; i < message.updateBinding.length; ++i)\n          $root.onnx.StringStringEntryProto.encode(\n            message.updateBinding[i],\n            writer.uint32(/* id 4, wireType 2 =*/ 34).fork(),\n          ).ldelim();\n      return writer;\n    };\n\n    /**\n     * Encodes the specified TrainingInfoProto message, length delimited. Does not implicitly {@link onnx.TrainingInfoProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.TrainingInfoProto\n     * @static\n     * @param {onnx.ITrainingInfoProto} message TrainingInfoProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TrainingInfoProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a TrainingInfoProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.TrainingInfoProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.TrainingInfoProto} TrainingInfoProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TrainingInfoProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.TrainingInfoProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.initialization = $root.onnx.GraphProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 2: {\n            message.algorithm = $root.onnx.GraphProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 3: {\n            if (!(message.initializationBinding && message.initializationBinding.length))\n              message.initializationBinding = [];\n            message.initializationBinding.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 4: {\n            if (!(message.updateBinding && message.updateBinding.length)) message.updateBinding = [];\n            message.updateBinding.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a TrainingInfoProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.TrainingInfoProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.TrainingInfoProto} TrainingInfoProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TrainingInfoProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a TrainingInfoProto message.\n     * @function verify\n     * @memberof onnx.TrainingInfoProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    TrainingInfoProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.initialization != null && message.hasOwnProperty('initialization')) {\n        var error = $root.onnx.GraphProto.verify(message.initialization);\n        if (error) return 'initialization.' + error;\n      }\n      if (message.algorithm != null && message.hasOwnProperty('algorithm')) {\n        var error = $root.onnx.GraphProto.verify(message.algorithm);\n        if (error) return 'algorithm.' + error;\n      }\n      if (message.initializationBinding != null && message.hasOwnProperty('initializationBinding')) {\n        if (!Array.isArray(message.initializationBinding)) return 'initializationBinding: array expected';\n        for (var i = 0; i < message.initializationBinding.length; ++i) {\n          var error = $root.onnx.StringStringEntryProto.verify(message.initializationBinding[i]);\n          if (error) return 'initializationBinding.' + error;\n        }\n      }\n      if (message.updateBinding != null && message.hasOwnProperty('updateBinding')) {\n        if (!Array.isArray(message.updateBinding)) return 'updateBinding: array expected';\n        for (var i = 0; i < message.updateBinding.length; ++i) {\n          var error = $root.onnx.StringStringEntryProto.verify(message.updateBinding[i]);\n          if (error) return 'updateBinding.' + error;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Creates a TrainingInfoProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.TrainingInfoProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.TrainingInfoProto} TrainingInfoProto\n     */\n    TrainingInfoProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.TrainingInfoProto) return object;\n      var message = new $root.onnx.TrainingInfoProto();\n      if (object.initialization != null) {\n        if (typeof object.initialization !== 'object')\n          throw TypeError('.onnx.TrainingInfoProto.initialization: object expected');\n        message.initialization = $root.onnx.GraphProto.fromObject(object.initialization);\n      }\n      if (object.algorithm != null) {\n        if (typeof object.algorithm !== 'object') throw TypeError('.onnx.TrainingInfoProto.algorithm: object expected');\n        message.algorithm = $root.onnx.GraphProto.fromObject(object.algorithm);\n      }\n      if (object.initializationBinding) {\n        if (!Array.isArray(object.initializationBinding))\n          throw TypeError('.onnx.TrainingInfoProto.initializationBinding: array expected');\n        message.initializationBinding = [];\n        for (var i = 0; i < object.initializationBinding.length; ++i) {\n          if (typeof object.initializationBinding[i] !== 'object')\n            throw TypeError('.onnx.TrainingInfoProto.initializationBinding: object expected');\n          message.initializationBinding[i] = $root.onnx.StringStringEntryProto.fromObject(\n            object.initializationBinding[i],\n          );\n        }\n      }\n      if (object.updateBinding) {\n        if (!Array.isArray(object.updateBinding))\n          throw TypeError('.onnx.TrainingInfoProto.updateBinding: array expected');\n        message.updateBinding = [];\n        for (var i = 0; i < object.updateBinding.length; ++i) {\n          if (typeof object.updateBinding[i] !== 'object')\n            throw TypeError('.onnx.TrainingInfoProto.updateBinding: object expected');\n          message.updateBinding[i] = $root.onnx.StringStringEntryProto.fromObject(object.updateBinding[i]);\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a TrainingInfoProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.TrainingInfoProto\n     * @static\n     * @param {onnx.TrainingInfoProto} message TrainingInfoProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    TrainingInfoProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) {\n        object.initializationBinding = [];\n        object.updateBinding = [];\n      }\n      if (options.defaults) {\n        object.initialization = null;\n        object.algorithm = null;\n      }\n      if (message.initialization != null && message.hasOwnProperty('initialization'))\n        object.initialization = $root.onnx.GraphProto.toObject(message.initialization, options);\n      if (message.algorithm != null && message.hasOwnProperty('algorithm'))\n        object.algorithm = $root.onnx.GraphProto.toObject(message.algorithm, options);\n      if (message.initializationBinding && message.initializationBinding.length) {\n        object.initializationBinding = [];\n        for (var j = 0; j < message.initializationBinding.length; ++j)\n          object.initializationBinding[j] = $root.onnx.StringStringEntryProto.toObject(\n            message.initializationBinding[j],\n            options,\n          );\n      }\n      if (message.updateBinding && message.updateBinding.length) {\n        object.updateBinding = [];\n        for (var j = 0; j < message.updateBinding.length; ++j)\n          object.updateBinding[j] = $root.onnx.StringStringEntryProto.toObject(message.updateBinding[j], options);\n      }\n      return object;\n    };\n\n    /**\n     * Converts this TrainingInfoProto to JSON.\n     * @function toJSON\n     * @memberof onnx.TrainingInfoProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    TrainingInfoProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for TrainingInfoProto\n     * @function getTypeUrl\n     * @memberof onnx.TrainingInfoProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    TrainingInfoProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.TrainingInfoProto';\n    };\n\n    return TrainingInfoProto;\n  })();\n\n  onnx.ModelProto = (function () {\n    /**\n     * Properties of a ModelProto.\n     * @memberof onnx\n     * @interface IModelProto\n     * @property {number|Long|null} [irVersion] ModelProto irVersion\n     * @property {Array.<onnx.IOperatorSetIdProto>|null} [opsetImport] ModelProto opsetImport\n     * @property {string|null} [producerName] ModelProto producerName\n     * @property {string|null} [producerVersion] ModelProto producerVersion\n     * @property {string|null} [domain] ModelProto domain\n     * @property {number|Long|null} [modelVersion] ModelProto modelVersion\n     * @property {string|null} [docString] ModelProto docString\n     * @property {onnx.IGraphProto|null} [graph] ModelProto graph\n     * @property {Array.<onnx.IStringStringEntryProto>|null} [metadataProps] ModelProto metadataProps\n     * @property {Array.<onnx.ITrainingInfoProto>|null} [trainingInfo] ModelProto trainingInfo\n     * @property {Array.<onnx.IFunctionProto>|null} [functions] ModelProto functions\n     */\n\n    /**\n     * Constructs a new ModelProto.\n     * @memberof onnx\n     * @classdesc Represents a ModelProto.\n     * @implements IModelProto\n     * @constructor\n     * @param {onnx.IModelProto=} [properties] Properties to set\n     */\n    function ModelProto(properties) {\n      this.opsetImport = [];\n      this.metadataProps = [];\n      this.trainingInfo = [];\n      this.functions = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ModelProto irVersion.\n     * @member {number|Long} irVersion\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.irVersion = $util.Long ? $util.Long.fromBits(0, 0, false) : 0;\n\n    /**\n     * ModelProto opsetImport.\n     * @member {Array.<onnx.IOperatorSetIdProto>} opsetImport\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.opsetImport = $util.emptyArray;\n\n    /**\n     * ModelProto producerName.\n     * @member {string} producerName\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.producerName = '';\n\n    /**\n     * ModelProto producerVersion.\n     * @member {string} producerVersion\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.producerVersion = '';\n\n    /**\n     * ModelProto domain.\n     * @member {string} domain\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.domain = '';\n\n    /**\n     * ModelProto modelVersion.\n     * @member {number|Long} modelVersion\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.modelVersion = $util.Long ? $util.Long.fromBits(0, 0, false) : 0;\n\n    /**\n     * ModelProto docString.\n     * @member {string} docString\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.docString = '';\n\n    /**\n     * ModelProto graph.\n     * @member {onnx.IGraphProto|null|undefined} graph\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.graph = null;\n\n    /**\n     * ModelProto metadataProps.\n     * @member {Array.<onnx.IStringStringEntryProto>} metadataProps\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.metadataProps = $util.emptyArray;\n\n    /**\n     * ModelProto trainingInfo.\n     * @member {Array.<onnx.ITrainingInfoProto>} trainingInfo\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.trainingInfo = $util.emptyArray;\n\n    /**\n     * ModelProto functions.\n     * @member {Array.<onnx.IFunctionProto>} functions\n     * @memberof onnx.ModelProto\n     * @instance\n     */\n    ModelProto.prototype.functions = $util.emptyArray;\n\n    /**\n     * Creates a new ModelProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.ModelProto\n     * @static\n     * @param {onnx.IModelProto=} [properties] Properties to set\n     * @returns {onnx.ModelProto} ModelProto instance\n     */\n    ModelProto.create = function create(properties) {\n      return new ModelProto(properties);\n    };\n\n    /**\n     * Encodes the specified ModelProto message. Does not implicitly {@link onnx.ModelProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.ModelProto\n     * @static\n     * @param {onnx.IModelProto} message ModelProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ModelProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.irVersion != null && Object.hasOwnProperty.call(message, 'irVersion'))\n        writer.uint32(/* id 1, wireType 0 =*/ 8).int64(message.irVersion);\n      if (message.producerName != null && Object.hasOwnProperty.call(message, 'producerName'))\n        writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.producerName);\n      if (message.producerVersion != null && Object.hasOwnProperty.call(message, 'producerVersion'))\n        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.producerVersion);\n      if (message.domain != null && Object.hasOwnProperty.call(message, 'domain'))\n        writer.uint32(/* id 4, wireType 2 =*/ 34).string(message.domain);\n      if (message.modelVersion != null && Object.hasOwnProperty.call(message, 'modelVersion'))\n        writer.uint32(/* id 5, wireType 0 =*/ 40).int64(message.modelVersion);\n      if (message.docString != null && Object.hasOwnProperty.call(message, 'docString'))\n        writer.uint32(/* id 6, wireType 2 =*/ 50).string(message.docString);\n      if (message.graph != null && Object.hasOwnProperty.call(message, 'graph'))\n        $root.onnx.GraphProto.encode(message.graph, writer.uint32(/* id 7, wireType 2 =*/ 58).fork()).ldelim();\n      if (message.opsetImport != null && message.opsetImport.length)\n        for (var i = 0; i < message.opsetImport.length; ++i)\n          $root.onnx.OperatorSetIdProto.encode(\n            message.opsetImport[i],\n            writer.uint32(/* id 8, wireType 2 =*/ 66).fork(),\n          ).ldelim();\n      if (message.metadataProps != null && message.metadataProps.length)\n        for (var i = 0; i < message.metadataProps.length; ++i)\n          $root.onnx.StringStringEntryProto.encode(\n            message.metadataProps[i],\n            writer.uint32(/* id 14, wireType 2 =*/ 114).fork(),\n          ).ldelim();\n      if (message.trainingInfo != null && message.trainingInfo.length)\n        for (var i = 0; i < message.trainingInfo.length; ++i)\n          $root.onnx.TrainingInfoProto.encode(\n            message.trainingInfo[i],\n            writer.uint32(/* id 20, wireType 2 =*/ 162).fork(),\n          ).ldelim();\n      if (message.functions != null && message.functions.length)\n        for (var i = 0; i < message.functions.length; ++i)\n          $root.onnx.FunctionProto.encode(\n            message.functions[i],\n            writer.uint32(/* id 25, wireType 2 =*/ 202).fork(),\n          ).ldelim();\n      return writer;\n    };\n\n    /**\n     * Encodes the specified ModelProto message, length delimited. Does not implicitly {@link onnx.ModelProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.ModelProto\n     * @static\n     * @param {onnx.IModelProto} message ModelProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ModelProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a ModelProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.ModelProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.ModelProto} ModelProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ModelProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.ModelProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.irVersion = reader.int64();\n            break;\n          }\n          case 8: {\n            if (!(message.opsetImport && message.opsetImport.length)) message.opsetImport = [];\n            message.opsetImport.push($root.onnx.OperatorSetIdProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 2: {\n            message.producerName = reader.string();\n            break;\n          }\n          case 3: {\n            message.producerVersion = reader.string();\n            break;\n          }\n          case 4: {\n            message.domain = reader.string();\n            break;\n          }\n          case 5: {\n            message.modelVersion = reader.int64();\n            break;\n          }\n          case 6: {\n            message.docString = reader.string();\n            break;\n          }\n          case 7: {\n            message.graph = $root.onnx.GraphProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 14: {\n            if (!(message.metadataProps && message.metadataProps.length)) message.metadataProps = [];\n            message.metadataProps.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 20: {\n            if (!(message.trainingInfo && message.trainingInfo.length)) message.trainingInfo = [];\n            message.trainingInfo.push($root.onnx.TrainingInfoProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 25: {\n            if (!(message.functions && message.functions.length)) message.functions = [];\n            message.functions.push($root.onnx.FunctionProto.decode(reader, reader.uint32()));\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a ModelProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.ModelProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.ModelProto} ModelProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ModelProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a ModelProto message.\n     * @function verify\n     * @memberof onnx.ModelProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ModelProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.irVersion != null && message.hasOwnProperty('irVersion'))\n        if (\n          !$util.isInteger(message.irVersion) &&\n          !(message.irVersion && $util.isInteger(message.irVersion.low) && $util.isInteger(message.irVersion.high))\n        )\n          return 'irVersion: integer|Long expected';\n      if (message.opsetImport != null && message.hasOwnProperty('opsetImport')) {\n        if (!Array.isArray(message.opsetImport)) return 'opsetImport: array expected';\n        for (var i = 0; i < message.opsetImport.length; ++i) {\n          var error = $root.onnx.OperatorSetIdProto.verify(message.opsetImport[i]);\n          if (error) return 'opsetImport.' + error;\n        }\n      }\n      if (message.producerName != null && message.hasOwnProperty('producerName'))\n        if (!$util.isString(message.producerName)) return 'producerName: string expected';\n      if (message.producerVersion != null && message.hasOwnProperty('producerVersion'))\n        if (!$util.isString(message.producerVersion)) return 'producerVersion: string expected';\n      if (message.domain != null && message.hasOwnProperty('domain'))\n        if (!$util.isString(message.domain)) return 'domain: string expected';\n      if (message.modelVersion != null && message.hasOwnProperty('modelVersion'))\n        if (\n          !$util.isInteger(message.modelVersion) &&\n          !(\n            message.modelVersion &&\n            $util.isInteger(message.modelVersion.low) &&\n            $util.isInteger(message.modelVersion.high)\n          )\n        )\n          return 'modelVersion: integer|Long expected';\n      if (message.docString != null && message.hasOwnProperty('docString'))\n        if (!$util.isString(message.docString)) return 'docString: string expected';\n      if (message.graph != null && message.hasOwnProperty('graph')) {\n        var error = $root.onnx.GraphProto.verify(message.graph);\n        if (error) return 'graph.' + error;\n      }\n      if (message.metadataProps != null && message.hasOwnProperty('metadataProps')) {\n        if (!Array.isArray(message.metadataProps)) return 'metadataProps: array expected';\n        for (var i = 0; i < message.metadataProps.length; ++i) {\n          var error = $root.onnx.StringStringEntryProto.verify(message.metadataProps[i]);\n          if (error) return 'metadataProps.' + error;\n        }\n      }\n      if (message.trainingInfo != null && message.hasOwnProperty('trainingInfo')) {\n        if (!Array.isArray(message.trainingInfo)) return 'trainingInfo: array expected';\n        for (var i = 0; i < message.trainingInfo.length; ++i) {\n          var error = $root.onnx.TrainingInfoProto.verify(message.trainingInfo[i]);\n          if (error) return 'trainingInfo.' + error;\n        }\n      }\n      if (message.functions != null && message.hasOwnProperty('functions')) {\n        if (!Array.isArray(message.functions)) return 'functions: array expected';\n        for (var i = 0; i < message.functions.length; ++i) {\n          var error = $root.onnx.FunctionProto.verify(message.functions[i]);\n          if (error) return 'functions.' + error;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Creates a ModelProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.ModelProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.ModelProto} ModelProto\n     */\n    ModelProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.ModelProto) return object;\n      var message = new $root.onnx.ModelProto();\n      if (object.irVersion != null)\n        if ($util.Long) (message.irVersion = $util.Long.fromValue(object.irVersion)).unsigned = false;\n        else if (typeof object.irVersion === 'string') message.irVersion = parseInt(object.irVersion, 10);\n        else if (typeof object.irVersion === 'number') message.irVersion = object.irVersion;\n        else if (typeof object.irVersion === 'object')\n          message.irVersion = new $util.LongBits(object.irVersion.low >>> 0, object.irVersion.high >>> 0).toNumber();\n      if (object.opsetImport) {\n        if (!Array.isArray(object.opsetImport)) throw TypeError('.onnx.ModelProto.opsetImport: array expected');\n        message.opsetImport = [];\n        for (var i = 0; i < object.opsetImport.length; ++i) {\n          if (typeof object.opsetImport[i] !== 'object')\n            throw TypeError('.onnx.ModelProto.opsetImport: object expected');\n          message.opsetImport[i] = $root.onnx.OperatorSetIdProto.fromObject(object.opsetImport[i]);\n        }\n      }\n      if (object.producerName != null) message.producerName = String(object.producerName);\n      if (object.producerVersion != null) message.producerVersion = String(object.producerVersion);\n      if (object.domain != null) message.domain = String(object.domain);\n      if (object.modelVersion != null)\n        if ($util.Long) (message.modelVersion = $util.Long.fromValue(object.modelVersion)).unsigned = false;\n        else if (typeof object.modelVersion === 'string') message.modelVersion = parseInt(object.modelVersion, 10);\n        else if (typeof object.modelVersion === 'number') message.modelVersion = object.modelVersion;\n        else if (typeof object.modelVersion === 'object')\n          message.modelVersion = new $util.LongBits(\n            object.modelVersion.low >>> 0,\n            object.modelVersion.high >>> 0,\n          ).toNumber();\n      if (object.docString != null) message.docString = String(object.docString);\n      if (object.graph != null) {\n        if (typeof object.graph !== 'object') throw TypeError('.onnx.ModelProto.graph: object expected');\n        message.graph = $root.onnx.GraphProto.fromObject(object.graph);\n      }\n      if (object.metadataProps) {\n        if (!Array.isArray(object.metadataProps)) throw TypeError('.onnx.ModelProto.metadataProps: array expected');\n        message.metadataProps = [];\n        for (var i = 0; i < object.metadataProps.length; ++i) {\n          if (typeof object.metadataProps[i] !== 'object')\n            throw TypeError('.onnx.ModelProto.metadataProps: object expected');\n          message.metadataProps[i] = $root.onnx.StringStringEntryProto.fromObject(object.metadataProps[i]);\n        }\n      }\n      if (object.trainingInfo) {\n        if (!Array.isArray(object.trainingInfo)) throw TypeError('.onnx.ModelProto.trainingInfo: array expected');\n        message.trainingInfo = [];\n        for (var i = 0; i < object.trainingInfo.length; ++i) {\n          if (typeof object.trainingInfo[i] !== 'object')\n            throw TypeError('.onnx.ModelProto.trainingInfo: object expected');\n          message.trainingInfo[i] = $root.onnx.TrainingInfoProto.fromObject(object.trainingInfo[i]);\n        }\n      }\n      if (object.functions) {\n        if (!Array.isArray(object.functions)) throw TypeError('.onnx.ModelProto.functions: array expected');\n        message.functions = [];\n        for (var i = 0; i < object.functions.length; ++i) {\n          if (typeof object.functions[i] !== 'object') throw TypeError('.onnx.ModelProto.functions: object expected');\n          message.functions[i] = $root.onnx.FunctionProto.fromObject(object.functions[i]);\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a ModelProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.ModelProto\n     * @static\n     * @param {onnx.ModelProto} message ModelProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ModelProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) {\n        object.opsetImport = [];\n        object.metadataProps = [];\n        object.trainingInfo = [];\n        object.functions = [];\n      }\n      if (options.defaults) {\n        if ($util.Long) {\n          var long = new $util.Long(0, 0, false);\n          object.irVersion =\n            options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n        } else object.irVersion = options.longs === String ? '0' : 0;\n        object.producerName = '';\n        object.producerVersion = '';\n        object.domain = '';\n        if ($util.Long) {\n          var long = new $util.Long(0, 0, false);\n          object.modelVersion =\n            options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n        } else object.modelVersion = options.longs === String ? '0' : 0;\n        object.docString = '';\n        object.graph = null;\n      }\n      if (message.irVersion != null && message.hasOwnProperty('irVersion'))\n        if (typeof message.irVersion === 'number')\n          object.irVersion = options.longs === String ? String(message.irVersion) : message.irVersion;\n        else\n          object.irVersion =\n            options.longs === String\n              ? $util.Long.prototype.toString.call(message.irVersion)\n              : options.longs === Number\n                ? new $util.LongBits(message.irVersion.low >>> 0, message.irVersion.high >>> 0).toNumber()\n                : message.irVersion;\n      if (message.producerName != null && message.hasOwnProperty('producerName'))\n        object.producerName = message.producerName;\n      if (message.producerVersion != null && message.hasOwnProperty('producerVersion'))\n        object.producerVersion = message.producerVersion;\n      if (message.domain != null && message.hasOwnProperty('domain')) object.domain = message.domain;\n      if (message.modelVersion != null && message.hasOwnProperty('modelVersion'))\n        if (typeof message.modelVersion === 'number')\n          object.modelVersion = options.longs === String ? String(message.modelVersion) : message.modelVersion;\n        else\n          object.modelVersion =\n            options.longs === String\n              ? $util.Long.prototype.toString.call(message.modelVersion)\n              : options.longs === Number\n                ? new $util.LongBits(message.modelVersion.low >>> 0, message.modelVersion.high >>> 0).toNumber()\n                : message.modelVersion;\n      if (message.docString != null && message.hasOwnProperty('docString')) object.docString = message.docString;\n      if (message.graph != null && message.hasOwnProperty('graph'))\n        object.graph = $root.onnx.GraphProto.toObject(message.graph, options);\n      if (message.opsetImport && message.opsetImport.length) {\n        object.opsetImport = [];\n        for (var j = 0; j < message.opsetImport.length; ++j)\n          object.opsetImport[j] = $root.onnx.OperatorSetIdProto.toObject(message.opsetImport[j], options);\n      }\n      if (message.metadataProps && message.metadataProps.length) {\n        object.metadataProps = [];\n        for (var j = 0; j < message.metadataProps.length; ++j)\n          object.metadataProps[j] = $root.onnx.StringStringEntryProto.toObject(message.metadataProps[j], options);\n      }\n      if (message.trainingInfo && message.trainingInfo.length) {\n        object.trainingInfo = [];\n        for (var j = 0; j < message.trainingInfo.length; ++j)\n          object.trainingInfo[j] = $root.onnx.TrainingInfoProto.toObject(message.trainingInfo[j], options);\n      }\n      if (message.functions && message.functions.length) {\n        object.functions = [];\n        for (var j = 0; j < message.functions.length; ++j)\n          object.functions[j] = $root.onnx.FunctionProto.toObject(message.functions[j], options);\n      }\n      return object;\n    };\n\n    /**\n     * Converts this ModelProto to JSON.\n     * @function toJSON\n     * @memberof onnx.ModelProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ModelProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for ModelProto\n     * @function getTypeUrl\n     * @memberof onnx.ModelProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    ModelProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.ModelProto';\n    };\n\n    return ModelProto;\n  })();\n\n  onnx.StringStringEntryProto = (function () {\n    /**\n     * Properties of a StringStringEntryProto.\n     * @memberof onnx\n     * @interface IStringStringEntryProto\n     * @property {string|null} [key] StringStringEntryProto key\n     * @property {string|null} [value] StringStringEntryProto value\n     */\n\n    /**\n     * Constructs a new StringStringEntryProto.\n     * @memberof onnx\n     * @classdesc Represents a StringStringEntryProto.\n     * @implements IStringStringEntryProto\n     * @constructor\n     * @param {onnx.IStringStringEntryProto=} [properties] Properties to set\n     */\n    function StringStringEntryProto(properties) {\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * StringStringEntryProto key.\n     * @member {string} key\n     * @memberof onnx.StringStringEntryProto\n     * @instance\n     */\n    StringStringEntryProto.prototype.key = '';\n\n    /**\n     * StringStringEntryProto value.\n     * @member {string} value\n     * @memberof onnx.StringStringEntryProto\n     * @instance\n     */\n    StringStringEntryProto.prototype.value = '';\n\n    /**\n     * Creates a new StringStringEntryProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.StringStringEntryProto\n     * @static\n     * @param {onnx.IStringStringEntryProto=} [properties] Properties to set\n     * @returns {onnx.StringStringEntryProto} StringStringEntryProto instance\n     */\n    StringStringEntryProto.create = function create(properties) {\n      return new StringStringEntryProto(properties);\n    };\n\n    /**\n     * Encodes the specified StringStringEntryProto message. Does not implicitly {@link onnx.StringStringEntryProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.StringStringEntryProto\n     * @static\n     * @param {onnx.IStringStringEntryProto} message StringStringEntryProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    StringStringEntryProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.key != null && Object.hasOwnProperty.call(message, 'key'))\n        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.key);\n      if (message.value != null && Object.hasOwnProperty.call(message, 'value'))\n        writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.value);\n      return writer;\n    };\n\n    /**\n     * Encodes the specified StringStringEntryProto message, length delimited. Does not implicitly {@link onnx.StringStringEntryProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.StringStringEntryProto\n     * @static\n     * @param {onnx.IStringStringEntryProto} message StringStringEntryProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    StringStringEntryProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a StringStringEntryProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.StringStringEntryProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.StringStringEntryProto} StringStringEntryProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    StringStringEntryProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.StringStringEntryProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.key = reader.string();\n            break;\n          }\n          case 2: {\n            message.value = reader.string();\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a StringStringEntryProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.StringStringEntryProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.StringStringEntryProto} StringStringEntryProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    StringStringEntryProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a StringStringEntryProto message.\n     * @function verify\n     * @memberof onnx.StringStringEntryProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    StringStringEntryProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.key != null && message.hasOwnProperty('key'))\n        if (!$util.isString(message.key)) return 'key: string expected';\n      if (message.value != null && message.hasOwnProperty('value'))\n        if (!$util.isString(message.value)) return 'value: string expected';\n      return null;\n    };\n\n    /**\n     * Creates a StringStringEntryProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.StringStringEntryProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.StringStringEntryProto} StringStringEntryProto\n     */\n    StringStringEntryProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.StringStringEntryProto) return object;\n      var message = new $root.onnx.StringStringEntryProto();\n      if (object.key != null) message.key = String(object.key);\n      if (object.value != null) message.value = String(object.value);\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a StringStringEntryProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.StringStringEntryProto\n     * @static\n     * @param {onnx.StringStringEntryProto} message StringStringEntryProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    StringStringEntryProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.defaults) {\n        object.key = '';\n        object.value = '';\n      }\n      if (message.key != null && message.hasOwnProperty('key')) object.key = message.key;\n      if (message.value != null && message.hasOwnProperty('value')) object.value = message.value;\n      return object;\n    };\n\n    /**\n     * Converts this StringStringEntryProto to JSON.\n     * @function toJSON\n     * @memberof onnx.StringStringEntryProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    StringStringEntryProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for StringStringEntryProto\n     * @function getTypeUrl\n     * @memberof onnx.StringStringEntryProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    StringStringEntryProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.StringStringEntryProto';\n    };\n\n    return StringStringEntryProto;\n  })();\n\n  onnx.TensorAnnotation = (function () {\n    /**\n     * Properties of a TensorAnnotation.\n     * @memberof onnx\n     * @interface ITensorAnnotation\n     * @property {string|null} [tensorName] TensorAnnotation tensorName\n     * @property {Array.<onnx.IStringStringEntryProto>|null} [quantParameterTensorNames] TensorAnnotation quantParameterTensorNames\n     */\n\n    /**\n     * Constructs a new TensorAnnotation.\n     * @memberof onnx\n     * @classdesc Represents a TensorAnnotation.\n     * @implements ITensorAnnotation\n     * @constructor\n     * @param {onnx.ITensorAnnotation=} [properties] Properties to set\n     */\n    function TensorAnnotation(properties) {\n      this.quantParameterTensorNames = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * TensorAnnotation tensorName.\n     * @member {string} tensorName\n     * @memberof onnx.TensorAnnotation\n     * @instance\n     */\n    TensorAnnotation.prototype.tensorName = '';\n\n    /**\n     * TensorAnnotation quantParameterTensorNames.\n     * @member {Array.<onnx.IStringStringEntryProto>} quantParameterTensorNames\n     * @memberof onnx.TensorAnnotation\n     * @instance\n     */\n    TensorAnnotation.prototype.quantParameterTensorNames = $util.emptyArray;\n\n    /**\n     * Creates a new TensorAnnotation instance using the specified properties.\n     * @function create\n     * @memberof onnx.TensorAnnotation\n     * @static\n     * @param {onnx.ITensorAnnotation=} [properties] Properties to set\n     * @returns {onnx.TensorAnnotation} TensorAnnotation instance\n     */\n    TensorAnnotation.create = function create(properties) {\n      return new TensorAnnotation(properties);\n    };\n\n    /**\n     * Encodes the specified TensorAnnotation message. Does not implicitly {@link onnx.TensorAnnotation.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.TensorAnnotation\n     * @static\n     * @param {onnx.ITensorAnnotation} message TensorAnnotation message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TensorAnnotation.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.tensorName != null && Object.hasOwnProperty.call(message, 'tensorName'))\n        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.tensorName);\n      if (message.quantParameterTensorNames != null && message.quantParameterTensorNames.length)\n        for (var i = 0; i < message.quantParameterTensorNames.length; ++i)\n          $root.onnx.StringStringEntryProto.encode(\n            message.quantParameterTensorNames[i],\n            writer.uint32(/* id 2, wireType 2 =*/ 18).fork(),\n          ).ldelim();\n      return writer;\n    };\n\n    /**\n     * Encodes the specified TensorAnnotation message, length delimited. Does not implicitly {@link onnx.TensorAnnotation.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.TensorAnnotation\n     * @static\n     * @param {onnx.ITensorAnnotation} message TensorAnnotation message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TensorAnnotation.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a TensorAnnotation message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.TensorAnnotation\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.TensorAnnotation} TensorAnnotation\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TensorAnnotation.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.TensorAnnotation();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.tensorName = reader.string();\n            break;\n          }\n          case 2: {\n            if (!(message.quantParameterTensorNames && message.quantParameterTensorNames.length))\n              message.quantParameterTensorNames = [];\n            message.quantParameterTensorNames.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a TensorAnnotation message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.TensorAnnotation\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.TensorAnnotation} TensorAnnotation\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TensorAnnotation.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a TensorAnnotation message.\n     * @function verify\n     * @memberof onnx.TensorAnnotation\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    TensorAnnotation.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.tensorName != null && message.hasOwnProperty('tensorName'))\n        if (!$util.isString(message.tensorName)) return 'tensorName: string expected';\n      if (message.quantParameterTensorNames != null && message.hasOwnProperty('quantParameterTensorNames')) {\n        if (!Array.isArray(message.quantParameterTensorNames)) return 'quantParameterTensorNames: array expected';\n        for (var i = 0; i < message.quantParameterTensorNames.length; ++i) {\n          var error = $root.onnx.StringStringEntryProto.verify(message.quantParameterTensorNames[i]);\n          if (error) return 'quantParameterTensorNames.' + error;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Creates a TensorAnnotation message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.TensorAnnotation\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.TensorAnnotation} TensorAnnotation\n     */\n    TensorAnnotation.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.TensorAnnotation) return object;\n      var message = new $root.onnx.TensorAnnotation();\n      if (object.tensorName != null) message.tensorName = String(object.tensorName);\n      if (object.quantParameterTensorNames) {\n        if (!Array.isArray(object.quantParameterTensorNames))\n          throw TypeError('.onnx.TensorAnnotation.quantParameterTensorNames: array expected');\n        message.quantParameterTensorNames = [];\n        for (var i = 0; i < object.quantParameterTensorNames.length; ++i) {\n          if (typeof object.quantParameterTensorNames[i] !== 'object')\n            throw TypeError('.onnx.TensorAnnotation.quantParameterTensorNames: object expected');\n          message.quantParameterTensorNames[i] = $root.onnx.StringStringEntryProto.fromObject(\n            object.quantParameterTensorNames[i],\n          );\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a TensorAnnotation message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.TensorAnnotation\n     * @static\n     * @param {onnx.TensorAnnotation} message TensorAnnotation\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    TensorAnnotation.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) object.quantParameterTensorNames = [];\n      if (options.defaults) object.tensorName = '';\n      if (message.tensorName != null && message.hasOwnProperty('tensorName')) object.tensorName = message.tensorName;\n      if (message.quantParameterTensorNames && message.quantParameterTensorNames.length) {\n        object.quantParameterTensorNames = [];\n        for (var j = 0; j < message.quantParameterTensorNames.length; ++j)\n          object.quantParameterTensorNames[j] = $root.onnx.StringStringEntryProto.toObject(\n            message.quantParameterTensorNames[j],\n            options,\n          );\n      }\n      return object;\n    };\n\n    /**\n     * Converts this TensorAnnotation to JSON.\n     * @function toJSON\n     * @memberof onnx.TensorAnnotation\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    TensorAnnotation.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for TensorAnnotation\n     * @function getTypeUrl\n     * @memberof onnx.TensorAnnotation\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    TensorAnnotation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.TensorAnnotation';\n    };\n\n    return TensorAnnotation;\n  })();\n\n  onnx.GraphProto = (function () {\n    /**\n     * Properties of a GraphProto.\n     * @memberof onnx\n     * @interface IGraphProto\n     * @property {Array.<onnx.INodeProto>|null} [node] GraphProto node\n     * @property {string|null} [name] GraphProto name\n     * @property {Array.<onnx.ITensorProto>|null} [initializer] GraphProto initializer\n     * @property {Array.<onnx.ISparseTensorProto>|null} [sparseInitializer] GraphProto sparseInitializer\n     * @property {string|null} [docString] GraphProto docString\n     * @property {Array.<onnx.IValueInfoProto>|null} [input] GraphProto input\n     * @property {Array.<onnx.IValueInfoProto>|null} [output] GraphProto output\n     * @property {Array.<onnx.IValueInfoProto>|null} [valueInfo] GraphProto valueInfo\n     * @property {Array.<onnx.ITensorAnnotation>|null} [quantizationAnnotation] GraphProto quantizationAnnotation\n     */\n\n    /**\n     * Constructs a new GraphProto.\n     * @memberof onnx\n     * @classdesc Represents a GraphProto.\n     * @implements IGraphProto\n     * @constructor\n     * @param {onnx.IGraphProto=} [properties] Properties to set\n     */\n    function GraphProto(properties) {\n      this.node = [];\n      this.initializer = [];\n      this.sparseInitializer = [];\n      this.input = [];\n      this.output = [];\n      this.valueInfo = [];\n      this.quantizationAnnotation = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GraphProto node.\n     * @member {Array.<onnx.INodeProto>} node\n     * @memberof onnx.GraphProto\n     * @instance\n     */\n    GraphProto.prototype.node = $util.emptyArray;\n\n    /**\n     * GraphProto name.\n     * @member {string} name\n     * @memberof onnx.GraphProto\n     * @instance\n     */\n    GraphProto.prototype.name = '';\n\n    /**\n     * GraphProto initializer.\n     * @member {Array.<onnx.ITensorProto>} initializer\n     * @memberof onnx.GraphProto\n     * @instance\n     */\n    GraphProto.prototype.initializer = $util.emptyArray;\n\n    /**\n     * GraphProto sparseInitializer.\n     * @member {Array.<onnx.ISparseTensorProto>} sparseInitializer\n     * @memberof onnx.GraphProto\n     * @instance\n     */\n    GraphProto.prototype.sparseInitializer = $util.emptyArray;\n\n    /**\n     * GraphProto docString.\n     * @member {string} docString\n     * @memberof onnx.GraphProto\n     * @instance\n     */\n    GraphProto.prototype.docString = '';\n\n    /**\n     * GraphProto input.\n     * @member {Array.<onnx.IValueInfoProto>} input\n     * @memberof onnx.GraphProto\n     * @instance\n     */\n    GraphProto.prototype.input = $util.emptyArray;\n\n    /**\n     * GraphProto output.\n     * @member {Array.<onnx.IValueInfoProto>} output\n     * @memberof onnx.GraphProto\n     * @instance\n     */\n    GraphProto.prototype.output = $util.emptyArray;\n\n    /**\n     * GraphProto valueInfo.\n     * @member {Array.<onnx.IValueInfoProto>} valueInfo\n     * @memberof onnx.GraphProto\n     * @instance\n     */\n    GraphProto.prototype.valueInfo = $util.emptyArray;\n\n    /**\n     * GraphProto quantizationAnnotation.\n     * @member {Array.<onnx.ITensorAnnotation>} quantizationAnnotation\n     * @memberof onnx.GraphProto\n     * @instance\n     */\n    GraphProto.prototype.quantizationAnnotation = $util.emptyArray;\n\n    /**\n     * Creates a new GraphProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.GraphProto\n     * @static\n     * @param {onnx.IGraphProto=} [properties] Properties to set\n     * @returns {onnx.GraphProto} GraphProto instance\n     */\n    GraphProto.create = function create(properties) {\n      return new GraphProto(properties);\n    };\n\n    /**\n     * Encodes the specified GraphProto message. Does not implicitly {@link onnx.GraphProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.GraphProto\n     * @static\n     * @param {onnx.IGraphProto} message GraphProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GraphProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.node != null && message.node.length)\n        for (var i = 0; i < message.node.length; ++i)\n          $root.onnx.NodeProto.encode(message.node[i], writer.uint32(/* id 1, wireType 2 =*/ 10).fork()).ldelim();\n      if (message.name != null && Object.hasOwnProperty.call(message, 'name'))\n        writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.name);\n      if (message.initializer != null && message.initializer.length)\n        for (var i = 0; i < message.initializer.length; ++i)\n          $root.onnx.TensorProto.encode(\n            message.initializer[i],\n            writer.uint32(/* id 5, wireType 2 =*/ 42).fork(),\n          ).ldelim();\n      if (message.docString != null && Object.hasOwnProperty.call(message, 'docString'))\n        writer.uint32(/* id 10, wireType 2 =*/ 82).string(message.docString);\n      if (message.input != null && message.input.length)\n        for (var i = 0; i < message.input.length; ++i)\n          $root.onnx.ValueInfoProto.encode(\n            message.input[i],\n            writer.uint32(/* id 11, wireType 2 =*/ 90).fork(),\n          ).ldelim();\n      if (message.output != null && message.output.length)\n        for (var i = 0; i < message.output.length; ++i)\n          $root.onnx.ValueInfoProto.encode(\n            message.output[i],\n            writer.uint32(/* id 12, wireType 2 =*/ 98).fork(),\n          ).ldelim();\n      if (message.valueInfo != null && message.valueInfo.length)\n        for (var i = 0; i < message.valueInfo.length; ++i)\n          $root.onnx.ValueInfoProto.encode(\n            message.valueInfo[i],\n            writer.uint32(/* id 13, wireType 2 =*/ 106).fork(),\n          ).ldelim();\n      if (message.quantizationAnnotation != null && message.quantizationAnnotation.length)\n        for (var i = 0; i < message.quantizationAnnotation.length; ++i)\n          $root.onnx.TensorAnnotation.encode(\n            message.quantizationAnnotation[i],\n            writer.uint32(/* id 14, wireType 2 =*/ 114).fork(),\n          ).ldelim();\n      if (message.sparseInitializer != null && message.sparseInitializer.length)\n        for (var i = 0; i < message.sparseInitializer.length; ++i)\n          $root.onnx.SparseTensorProto.encode(\n            message.sparseInitializer[i],\n            writer.uint32(/* id 15, wireType 2 =*/ 122).fork(),\n          ).ldelim();\n      return writer;\n    };\n\n    /**\n     * Encodes the specified GraphProto message, length delimited. Does not implicitly {@link onnx.GraphProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.GraphProto\n     * @static\n     * @param {onnx.IGraphProto} message GraphProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GraphProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GraphProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.GraphProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.GraphProto} GraphProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GraphProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.GraphProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            if (!(message.node && message.node.length)) message.node = [];\n            message.node.push($root.onnx.NodeProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 2: {\n            message.name = reader.string();\n            break;\n          }\n          case 5: {\n            if (!(message.initializer && message.initializer.length)) message.initializer = [];\n            message.initializer.push($root.onnx.TensorProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 15: {\n            if (!(message.sparseInitializer && message.sparseInitializer.length)) message.sparseInitializer = [];\n            message.sparseInitializer.push($root.onnx.SparseTensorProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 10: {\n            message.docString = reader.string();\n            break;\n          }\n          case 11: {\n            if (!(message.input && message.input.length)) message.input = [];\n            message.input.push($root.onnx.ValueInfoProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 12: {\n            if (!(message.output && message.output.length)) message.output = [];\n            message.output.push($root.onnx.ValueInfoProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 13: {\n            if (!(message.valueInfo && message.valueInfo.length)) message.valueInfo = [];\n            message.valueInfo.push($root.onnx.ValueInfoProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 14: {\n            if (!(message.quantizationAnnotation && message.quantizationAnnotation.length))\n              message.quantizationAnnotation = [];\n            message.quantizationAnnotation.push($root.onnx.TensorAnnotation.decode(reader, reader.uint32()));\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a GraphProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.GraphProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.GraphProto} GraphProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GraphProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GraphProto message.\n     * @function verify\n     * @memberof onnx.GraphProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GraphProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.node != null && message.hasOwnProperty('node')) {\n        if (!Array.isArray(message.node)) return 'node: array expected';\n        for (var i = 0; i < message.node.length; ++i) {\n          var error = $root.onnx.NodeProto.verify(message.node[i]);\n          if (error) return 'node.' + error;\n        }\n      }\n      if (message.name != null && message.hasOwnProperty('name'))\n        if (!$util.isString(message.name)) return 'name: string expected';\n      if (message.initializer != null && message.hasOwnProperty('initializer')) {\n        if (!Array.isArray(message.initializer)) return 'initializer: array expected';\n        for (var i = 0; i < message.initializer.length; ++i) {\n          var error = $root.onnx.TensorProto.verify(message.initializer[i]);\n          if (error) return 'initializer.' + error;\n        }\n      }\n      if (message.sparseInitializer != null && message.hasOwnProperty('sparseInitializer')) {\n        if (!Array.isArray(message.sparseInitializer)) return 'sparseInitializer: array expected';\n        for (var i = 0; i < message.sparseInitializer.length; ++i) {\n          var error = $root.onnx.SparseTensorProto.verify(message.sparseInitializer[i]);\n          if (error) return 'sparseInitializer.' + error;\n        }\n      }\n      if (message.docString != null && message.hasOwnProperty('docString'))\n        if (!$util.isString(message.docString)) return 'docString: string expected';\n      if (message.input != null && message.hasOwnProperty('input')) {\n        if (!Array.isArray(message.input)) return 'input: array expected';\n        for (var i = 0; i < message.input.length; ++i) {\n          var error = $root.onnx.ValueInfoProto.verify(message.input[i]);\n          if (error) return 'input.' + error;\n        }\n      }\n      if (message.output != null && message.hasOwnProperty('output')) {\n        if (!Array.isArray(message.output)) return 'output: array expected';\n        for (var i = 0; i < message.output.length; ++i) {\n          var error = $root.onnx.ValueInfoProto.verify(message.output[i]);\n          if (error) return 'output.' + error;\n        }\n      }\n      if (message.valueInfo != null && message.hasOwnProperty('valueInfo')) {\n        if (!Array.isArray(message.valueInfo)) return 'valueInfo: array expected';\n        for (var i = 0; i < message.valueInfo.length; ++i) {\n          var error = $root.onnx.ValueInfoProto.verify(message.valueInfo[i]);\n          if (error) return 'valueInfo.' + error;\n        }\n      }\n      if (message.quantizationAnnotation != null && message.hasOwnProperty('quantizationAnnotation')) {\n        if (!Array.isArray(message.quantizationAnnotation)) return 'quantizationAnnotation: array expected';\n        for (var i = 0; i < message.quantizationAnnotation.length; ++i) {\n          var error = $root.onnx.TensorAnnotation.verify(message.quantizationAnnotation[i]);\n          if (error) return 'quantizationAnnotation.' + error;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Creates a GraphProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.GraphProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.GraphProto} GraphProto\n     */\n    GraphProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.GraphProto) return object;\n      var message = new $root.onnx.GraphProto();\n      if (object.node) {\n        if (!Array.isArray(object.node)) throw TypeError('.onnx.GraphProto.node: array expected');\n        message.node = [];\n        for (var i = 0; i < object.node.length; ++i) {\n          if (typeof object.node[i] !== 'object') throw TypeError('.onnx.GraphProto.node: object expected');\n          message.node[i] = $root.onnx.NodeProto.fromObject(object.node[i]);\n        }\n      }\n      if (object.name != null) message.name = String(object.name);\n      if (object.initializer) {\n        if (!Array.isArray(object.initializer)) throw TypeError('.onnx.GraphProto.initializer: array expected');\n        message.initializer = [];\n        for (var i = 0; i < object.initializer.length; ++i) {\n          if (typeof object.initializer[i] !== 'object')\n            throw TypeError('.onnx.GraphProto.initializer: object expected');\n          message.initializer[i] = $root.onnx.TensorProto.fromObject(object.initializer[i]);\n        }\n      }\n      if (object.sparseInitializer) {\n        if (!Array.isArray(object.sparseInitializer))\n          throw TypeError('.onnx.GraphProto.sparseInitializer: array expected');\n        message.sparseInitializer = [];\n        for (var i = 0; i < object.sparseInitializer.length; ++i) {\n          if (typeof object.sparseInitializer[i] !== 'object')\n            throw TypeError('.onnx.GraphProto.sparseInitializer: object expected');\n          message.sparseInitializer[i] = $root.onnx.SparseTensorProto.fromObject(object.sparseInitializer[i]);\n        }\n      }\n      if (object.docString != null) message.docString = String(object.docString);\n      if (object.input) {\n        if (!Array.isArray(object.input)) throw TypeError('.onnx.GraphProto.input: array expected');\n        message.input = [];\n        for (var i = 0; i < object.input.length; ++i) {\n          if (typeof object.input[i] !== 'object') throw TypeError('.onnx.GraphProto.input: object expected');\n          message.input[i] = $root.onnx.ValueInfoProto.fromObject(object.input[i]);\n        }\n      }\n      if (object.output) {\n        if (!Array.isArray(object.output)) throw TypeError('.onnx.GraphProto.output: array expected');\n        message.output = [];\n        for (var i = 0; i < object.output.length; ++i) {\n          if (typeof object.output[i] !== 'object') throw TypeError('.onnx.GraphProto.output: object expected');\n          message.output[i] = $root.onnx.ValueInfoProto.fromObject(object.output[i]);\n        }\n      }\n      if (object.valueInfo) {\n        if (!Array.isArray(object.valueInfo)) throw TypeError('.onnx.GraphProto.valueInfo: array expected');\n        message.valueInfo = [];\n        for (var i = 0; i < object.valueInfo.length; ++i) {\n          if (typeof object.valueInfo[i] !== 'object') throw TypeError('.onnx.GraphProto.valueInfo: object expected');\n          message.valueInfo[i] = $root.onnx.ValueInfoProto.fromObject(object.valueInfo[i]);\n        }\n      }\n      if (object.quantizationAnnotation) {\n        if (!Array.isArray(object.quantizationAnnotation))\n          throw TypeError('.onnx.GraphProto.quantizationAnnotation: array expected');\n        message.quantizationAnnotation = [];\n        for (var i = 0; i < object.quantizationAnnotation.length; ++i) {\n          if (typeof object.quantizationAnnotation[i] !== 'object')\n            throw TypeError('.onnx.GraphProto.quantizationAnnotation: object expected');\n          message.quantizationAnnotation[i] = $root.onnx.TensorAnnotation.fromObject(object.quantizationAnnotation[i]);\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a GraphProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.GraphProto\n     * @static\n     * @param {onnx.GraphProto} message GraphProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GraphProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) {\n        object.node = [];\n        object.initializer = [];\n        object.input = [];\n        object.output = [];\n        object.valueInfo = [];\n        object.quantizationAnnotation = [];\n        object.sparseInitializer = [];\n      }\n      if (options.defaults) {\n        object.name = '';\n        object.docString = '';\n      }\n      if (message.node && message.node.length) {\n        object.node = [];\n        for (var j = 0; j < message.node.length; ++j)\n          object.node[j] = $root.onnx.NodeProto.toObject(message.node[j], options);\n      }\n      if (message.name != null && message.hasOwnProperty('name')) object.name = message.name;\n      if (message.initializer && message.initializer.length) {\n        object.initializer = [];\n        for (var j = 0; j < message.initializer.length; ++j)\n          object.initializer[j] = $root.onnx.TensorProto.toObject(message.initializer[j], options);\n      }\n      if (message.docString != null && message.hasOwnProperty('docString')) object.docString = message.docString;\n      if (message.input && message.input.length) {\n        object.input = [];\n        for (var j = 0; j < message.input.length; ++j)\n          object.input[j] = $root.onnx.ValueInfoProto.toObject(message.input[j], options);\n      }\n      if (message.output && message.output.length) {\n        object.output = [];\n        for (var j = 0; j < message.output.length; ++j)\n          object.output[j] = $root.onnx.ValueInfoProto.toObject(message.output[j], options);\n      }\n      if (message.valueInfo && message.valueInfo.length) {\n        object.valueInfo = [];\n        for (var j = 0; j < message.valueInfo.length; ++j)\n          object.valueInfo[j] = $root.onnx.ValueInfoProto.toObject(message.valueInfo[j], options);\n      }\n      if (message.quantizationAnnotation && message.quantizationAnnotation.length) {\n        object.quantizationAnnotation = [];\n        for (var j = 0; j < message.quantizationAnnotation.length; ++j)\n          object.quantizationAnnotation[j] = $root.onnx.TensorAnnotation.toObject(\n            message.quantizationAnnotation[j],\n            options,\n          );\n      }\n      if (message.sparseInitializer && message.sparseInitializer.length) {\n        object.sparseInitializer = [];\n        for (var j = 0; j < message.sparseInitializer.length; ++j)\n          object.sparseInitializer[j] = $root.onnx.SparseTensorProto.toObject(message.sparseInitializer[j], options);\n      }\n      return object;\n    };\n\n    /**\n     * Converts this GraphProto to JSON.\n     * @function toJSON\n     * @memberof onnx.GraphProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GraphProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for GraphProto\n     * @function getTypeUrl\n     * @memberof onnx.GraphProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    GraphProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.GraphProto';\n    };\n\n    return GraphProto;\n  })();\n\n  onnx.TensorProto = (function () {\n    /**\n     * Properties of a TensorProto.\n     * @memberof onnx\n     * @interface ITensorProto\n     * @property {Array.<number|Long>|null} [dims] TensorProto dims\n     * @property {number|null} [dataType] TensorProto dataType\n     * @property {onnx.TensorProto.ISegment|null} [segment] TensorProto segment\n     * @property {Array.<number>|null} [floatData] TensorProto floatData\n     * @property {Array.<number>|null} [int32Data] TensorProto int32Data\n     * @property {Array.<Uint8Array>|null} [stringData] TensorProto stringData\n     * @property {Array.<number|Long>|null} [int64Data] TensorProto int64Data\n     * @property {string|null} [name] TensorProto name\n     * @property {string|null} [docString] TensorProto docString\n     * @property {Uint8Array|null} [rawData] TensorProto rawData\n     * @property {Array.<onnx.IStringStringEntryProto>|null} [externalData] TensorProto externalData\n     * @property {onnx.TensorProto.DataLocation|null} [dataLocation] TensorProto dataLocation\n     * @property {Array.<number>|null} [doubleData] TensorProto doubleData\n     * @property {Array.<number|Long>|null} [uint64Data] TensorProto uint64Data\n     */\n\n    /**\n     * Constructs a new TensorProto.\n     * @memberof onnx\n     * @classdesc Represents a TensorProto.\n     * @implements ITensorProto\n     * @constructor\n     * @param {onnx.ITensorProto=} [properties] Properties to set\n     */\n    function TensorProto(properties) {\n      this.dims = [];\n      this.floatData = [];\n      this.int32Data = [];\n      this.stringData = [];\n      this.int64Data = [];\n      this.externalData = [];\n      this.doubleData = [];\n      this.uint64Data = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * TensorProto dims.\n     * @member {Array.<number|Long>} dims\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.dims = $util.emptyArray;\n\n    /**\n     * TensorProto dataType.\n     * @member {number} dataType\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.dataType = 0;\n\n    /**\n     * TensorProto segment.\n     * @member {onnx.TensorProto.ISegment|null|undefined} segment\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.segment = null;\n\n    /**\n     * TensorProto floatData.\n     * @member {Array.<number>} floatData\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.floatData = $util.emptyArray;\n\n    /**\n     * TensorProto int32Data.\n     * @member {Array.<number>} int32Data\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.int32Data = $util.emptyArray;\n\n    /**\n     * TensorProto stringData.\n     * @member {Array.<Uint8Array>} stringData\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.stringData = $util.emptyArray;\n\n    /**\n     * TensorProto int64Data.\n     * @member {Array.<number|Long>} int64Data\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.int64Data = $util.emptyArray;\n\n    /**\n     * TensorProto name.\n     * @member {string} name\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.name = '';\n\n    /**\n     * TensorProto docString.\n     * @member {string} docString\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.docString = '';\n\n    /**\n     * TensorProto rawData.\n     * @member {Uint8Array} rawData\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.rawData = $util.newBuffer([]);\n\n    /**\n     * TensorProto externalData.\n     * @member {Array.<onnx.IStringStringEntryProto>} externalData\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.externalData = $util.emptyArray;\n\n    /**\n     * TensorProto dataLocation.\n     * @member {onnx.TensorProto.DataLocation} dataLocation\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.dataLocation = 0;\n\n    /**\n     * TensorProto doubleData.\n     * @member {Array.<number>} doubleData\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.doubleData = $util.emptyArray;\n\n    /**\n     * TensorProto uint64Data.\n     * @member {Array.<number|Long>} uint64Data\n     * @memberof onnx.TensorProto\n     * @instance\n     */\n    TensorProto.prototype.uint64Data = $util.emptyArray;\n\n    /**\n     * Creates a new TensorProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.TensorProto\n     * @static\n     * @param {onnx.ITensorProto=} [properties] Properties to set\n     * @returns {onnx.TensorProto} TensorProto instance\n     */\n    TensorProto.create = function create(properties) {\n      return new TensorProto(properties);\n    };\n\n    /**\n     * Encodes the specified TensorProto message. Does not implicitly {@link onnx.TensorProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.TensorProto\n     * @static\n     * @param {onnx.ITensorProto} message TensorProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TensorProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.dims != null && message.dims.length) {\n        writer.uint32(/* id 1, wireType 2 =*/ 10).fork();\n        for (var i = 0; i < message.dims.length; ++i) writer.int64(message.dims[i]);\n        writer.ldelim();\n      }\n      if (message.dataType != null && Object.hasOwnProperty.call(message, 'dataType'))\n        writer.uint32(/* id 2, wireType 0 =*/ 16).int32(message.dataType);\n      if (message.segment != null && Object.hasOwnProperty.call(message, 'segment'))\n        $root.onnx.TensorProto.Segment.encode(\n          message.segment,\n          writer.uint32(/* id 3, wireType 2 =*/ 26).fork(),\n        ).ldelim();\n      if (message.floatData != null && message.floatData.length) {\n        writer.uint32(/* id 4, wireType 2 =*/ 34).fork();\n        for (var i = 0; i < message.floatData.length; ++i) writer.float(message.floatData[i]);\n        writer.ldelim();\n      }\n      if (message.int32Data != null && message.int32Data.length) {\n        writer.uint32(/* id 5, wireType 2 =*/ 42).fork();\n        for (var i = 0; i < message.int32Data.length; ++i) writer.int32(message.int32Data[i]);\n        writer.ldelim();\n      }\n      if (message.stringData != null && message.stringData.length)\n        for (var i = 0; i < message.stringData.length; ++i)\n          writer.uint32(/* id 6, wireType 2 =*/ 50).bytes(message.stringData[i]);\n      if (message.int64Data != null && message.int64Data.length) {\n        writer.uint32(/* id 7, wireType 2 =*/ 58).fork();\n        for (var i = 0; i < message.int64Data.length; ++i) writer.int64(message.int64Data[i]);\n        writer.ldelim();\n      }\n      if (message.name != null && Object.hasOwnProperty.call(message, 'name'))\n        writer.uint32(/* id 8, wireType 2 =*/ 66).string(message.name);\n      if (message.rawData != null && Object.hasOwnProperty.call(message, 'rawData'))\n        writer.uint32(/* id 9, wireType 2 =*/ 74).bytes(message.rawData);\n      if (message.doubleData != null && message.doubleData.length) {\n        writer.uint32(/* id 10, wireType 2 =*/ 82).fork();\n        for (var i = 0; i < message.doubleData.length; ++i) writer.double(message.doubleData[i]);\n        writer.ldelim();\n      }\n      if (message.uint64Data != null && message.uint64Data.length) {\n        writer.uint32(/* id 11, wireType 2 =*/ 90).fork();\n        for (var i = 0; i < message.uint64Data.length; ++i) writer.uint64(message.uint64Data[i]);\n        writer.ldelim();\n      }\n      if (message.docString != null && Object.hasOwnProperty.call(message, 'docString'))\n        writer.uint32(/* id 12, wireType 2 =*/ 98).string(message.docString);\n      if (message.externalData != null && message.externalData.length)\n        for (var i = 0; i < message.externalData.length; ++i)\n          $root.onnx.StringStringEntryProto.encode(\n            message.externalData[i],\n            writer.uint32(/* id 13, wireType 2 =*/ 106).fork(),\n          ).ldelim();\n      if (message.dataLocation != null && Object.hasOwnProperty.call(message, 'dataLocation'))\n        writer.uint32(/* id 14, wireType 0 =*/ 112).int32(message.dataLocation);\n      return writer;\n    };\n\n    /**\n     * Encodes the specified TensorProto message, length delimited. Does not implicitly {@link onnx.TensorProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.TensorProto\n     * @static\n     * @param {onnx.ITensorProto} message TensorProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TensorProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a TensorProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.TensorProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.TensorProto} TensorProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TensorProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.TensorProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            if (!(message.dims && message.dims.length)) message.dims = [];\n            if ((tag & 7) === 2) {\n              var end2 = reader.uint32() + reader.pos;\n              while (reader.pos < end2) message.dims.push(reader.int64());\n            } else message.dims.push(reader.int64());\n            break;\n          }\n          case 2: {\n            message.dataType = reader.int32();\n            break;\n          }\n          case 3: {\n            message.segment = $root.onnx.TensorProto.Segment.decode(reader, reader.uint32());\n            break;\n          }\n          case 4: {\n            if (!(message.floatData && message.floatData.length)) message.floatData = [];\n            if ((tag & 7) === 2) {\n              var end2 = reader.uint32() + reader.pos;\n              while (reader.pos < end2) message.floatData.push(reader.float());\n            } else message.floatData.push(reader.float());\n            break;\n          }\n          case 5: {\n            if (!(message.int32Data && message.int32Data.length)) message.int32Data = [];\n            if ((tag & 7) === 2) {\n              var end2 = reader.uint32() + reader.pos;\n              while (reader.pos < end2) message.int32Data.push(reader.int32());\n            } else message.int32Data.push(reader.int32());\n            break;\n          }\n          case 6: {\n            if (!(message.stringData && message.stringData.length)) message.stringData = [];\n            message.stringData.push(reader.bytes());\n            break;\n          }\n          case 7: {\n            if (!(message.int64Data && message.int64Data.length)) message.int64Data = [];\n            if ((tag & 7) === 2) {\n              var end2 = reader.uint32() + reader.pos;\n              while (reader.pos < end2) message.int64Data.push(reader.int64());\n            } else message.int64Data.push(reader.int64());\n            break;\n          }\n          case 8: {\n            message.name = reader.string();\n            break;\n          }\n          case 12: {\n            message.docString = reader.string();\n            break;\n          }\n          case 9: {\n            message.rawData = reader.bytes();\n            break;\n          }\n          case 13: {\n            if (!(message.externalData && message.externalData.length)) message.externalData = [];\n            message.externalData.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 14: {\n            message.dataLocation = reader.int32();\n            break;\n          }\n          case 10: {\n            if (!(message.doubleData && message.doubleData.length)) message.doubleData = [];\n            if ((tag & 7) === 2) {\n              var end2 = reader.uint32() + reader.pos;\n              while (reader.pos < end2) message.doubleData.push(reader.double());\n            } else message.doubleData.push(reader.double());\n            break;\n          }\n          case 11: {\n            if (!(message.uint64Data && message.uint64Data.length)) message.uint64Data = [];\n            if ((tag & 7) === 2) {\n              var end2 = reader.uint32() + reader.pos;\n              while (reader.pos < end2) message.uint64Data.push(reader.uint64());\n            } else message.uint64Data.push(reader.uint64());\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a TensorProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.TensorProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.TensorProto} TensorProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TensorProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a TensorProto message.\n     * @function verify\n     * @memberof onnx.TensorProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    TensorProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.dims != null && message.hasOwnProperty('dims')) {\n        if (!Array.isArray(message.dims)) return 'dims: array expected';\n        for (var i = 0; i < message.dims.length; ++i)\n          if (\n            !$util.isInteger(message.dims[i]) &&\n            !(message.dims[i] && $util.isInteger(message.dims[i].low) && $util.isInteger(message.dims[i].high))\n          )\n            return 'dims: integer|Long[] expected';\n      }\n      if (message.dataType != null && message.hasOwnProperty('dataType'))\n        if (!$util.isInteger(message.dataType)) return 'dataType: integer expected';\n      if (message.segment != null && message.hasOwnProperty('segment')) {\n        var error = $root.onnx.TensorProto.Segment.verify(message.segment);\n        if (error) return 'segment.' + error;\n      }\n      if (message.floatData != null && message.hasOwnProperty('floatData')) {\n        if (!Array.isArray(message.floatData)) return 'floatData: array expected';\n        for (var i = 0; i < message.floatData.length; ++i)\n          if (typeof message.floatData[i] !== 'number') return 'floatData: number[] expected';\n      }\n      if (message.int32Data != null && message.hasOwnProperty('int32Data')) {\n        if (!Array.isArray(message.int32Data)) return 'int32Data: array expected';\n        for (var i = 0; i < message.int32Data.length; ++i)\n          if (!$util.isInteger(message.int32Data[i])) return 'int32Data: integer[] expected';\n      }\n      if (message.stringData != null && message.hasOwnProperty('stringData')) {\n        if (!Array.isArray(message.stringData)) return 'stringData: array expected';\n        for (var i = 0; i < message.stringData.length; ++i)\n          if (\n            !(\n              (message.stringData[i] && typeof message.stringData[i].length === 'number') ||\n              $util.isString(message.stringData[i])\n            )\n          )\n            return 'stringData: buffer[] expected';\n      }\n      if (message.int64Data != null && message.hasOwnProperty('int64Data')) {\n        if (!Array.isArray(message.int64Data)) return 'int64Data: array expected';\n        for (var i = 0; i < message.int64Data.length; ++i)\n          if (\n            !$util.isInteger(message.int64Data[i]) &&\n            !(\n              message.int64Data[i] &&\n              $util.isInteger(message.int64Data[i].low) &&\n              $util.isInteger(message.int64Data[i].high)\n            )\n          )\n            return 'int64Data: integer|Long[] expected';\n      }\n      if (message.name != null && message.hasOwnProperty('name'))\n        if (!$util.isString(message.name)) return 'name: string expected';\n      if (message.docString != null && message.hasOwnProperty('docString'))\n        if (!$util.isString(message.docString)) return 'docString: string expected';\n      if (message.rawData != null && message.hasOwnProperty('rawData'))\n        if (!((message.rawData && typeof message.rawData.length === 'number') || $util.isString(message.rawData)))\n          return 'rawData: buffer expected';\n      if (message.externalData != null && message.hasOwnProperty('externalData')) {\n        if (!Array.isArray(message.externalData)) return 'externalData: array expected';\n        for (var i = 0; i < message.externalData.length; ++i) {\n          var error = $root.onnx.StringStringEntryProto.verify(message.externalData[i]);\n          if (error) return 'externalData.' + error;\n        }\n      }\n      if (message.dataLocation != null && message.hasOwnProperty('dataLocation'))\n        switch (message.dataLocation) {\n          default:\n            return 'dataLocation: enum value expected';\n          case 0:\n          case 1:\n            break;\n        }\n      if (message.doubleData != null && message.hasOwnProperty('doubleData')) {\n        if (!Array.isArray(message.doubleData)) return 'doubleData: array expected';\n        for (var i = 0; i < message.doubleData.length; ++i)\n          if (typeof message.doubleData[i] !== 'number') return 'doubleData: number[] expected';\n      }\n      if (message.uint64Data != null && message.hasOwnProperty('uint64Data')) {\n        if (!Array.isArray(message.uint64Data)) return 'uint64Data: array expected';\n        for (var i = 0; i < message.uint64Data.length; ++i)\n          if (\n            !$util.isInteger(message.uint64Data[i]) &&\n            !(\n              message.uint64Data[i] &&\n              $util.isInteger(message.uint64Data[i].low) &&\n              $util.isInteger(message.uint64Data[i].high)\n            )\n          )\n            return 'uint64Data: integer|Long[] expected';\n      }\n      return null;\n    };\n\n    /**\n     * Creates a TensorProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.TensorProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.TensorProto} TensorProto\n     */\n    TensorProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.TensorProto) return object;\n      var message = new $root.onnx.TensorProto();\n      if (object.dims) {\n        if (!Array.isArray(object.dims)) throw TypeError('.onnx.TensorProto.dims: array expected');\n        message.dims = [];\n        for (var i = 0; i < object.dims.length; ++i)\n          if ($util.Long) (message.dims[i] = $util.Long.fromValue(object.dims[i])).unsigned = false;\n          else if (typeof object.dims[i] === 'string') message.dims[i] = parseInt(object.dims[i], 10);\n          else if (typeof object.dims[i] === 'number') message.dims[i] = object.dims[i];\n          else if (typeof object.dims[i] === 'object')\n            message.dims[i] = new $util.LongBits(object.dims[i].low >>> 0, object.dims[i].high >>> 0).toNumber();\n      }\n      if (object.dataType != null) message.dataType = object.dataType | 0;\n      if (object.segment != null) {\n        if (typeof object.segment !== 'object') throw TypeError('.onnx.TensorProto.segment: object expected');\n        message.segment = $root.onnx.TensorProto.Segment.fromObject(object.segment);\n      }\n      if (object.floatData) {\n        if (!Array.isArray(object.floatData)) throw TypeError('.onnx.TensorProto.floatData: array expected');\n        message.floatData = [];\n        for (var i = 0; i < object.floatData.length; ++i) message.floatData[i] = Number(object.floatData[i]);\n      }\n      if (object.int32Data) {\n        if (!Array.isArray(object.int32Data)) throw TypeError('.onnx.TensorProto.int32Data: array expected');\n        message.int32Data = [];\n        for (var i = 0; i < object.int32Data.length; ++i) message.int32Data[i] = object.int32Data[i] | 0;\n      }\n      if (object.stringData) {\n        if (!Array.isArray(object.stringData)) throw TypeError('.onnx.TensorProto.stringData: array expected');\n        message.stringData = [];\n        for (var i = 0; i < object.stringData.length; ++i)\n          if (typeof object.stringData[i] === 'string')\n            $util.base64.decode(\n              object.stringData[i],\n              (message.stringData[i] = $util.newBuffer($util.base64.length(object.stringData[i]))),\n              0,\n            );\n          else if (object.stringData[i].length >= 0) message.stringData[i] = object.stringData[i];\n      }\n      if (object.int64Data) {\n        if (!Array.isArray(object.int64Data)) throw TypeError('.onnx.TensorProto.int64Data: array expected');\n        message.int64Data = [];\n        for (var i = 0; i < object.int64Data.length; ++i)\n          if ($util.Long) (message.int64Data[i] = $util.Long.fromValue(object.int64Data[i])).unsigned = false;\n          else if (typeof object.int64Data[i] === 'string') message.int64Data[i] = parseInt(object.int64Data[i], 10);\n          else if (typeof object.int64Data[i] === 'number') message.int64Data[i] = object.int64Data[i];\n          else if (typeof object.int64Data[i] === 'object')\n            message.int64Data[i] = new $util.LongBits(\n              object.int64Data[i].low >>> 0,\n              object.int64Data[i].high >>> 0,\n            ).toNumber();\n      }\n      if (object.name != null) message.name = String(object.name);\n      if (object.docString != null) message.docString = String(object.docString);\n      if (object.rawData != null)\n        if (typeof object.rawData === 'string')\n          $util.base64.decode(\n            object.rawData,\n            (message.rawData = $util.newBuffer($util.base64.length(object.rawData))),\n            0,\n          );\n        else if (object.rawData.length >= 0) message.rawData = object.rawData;\n      if (object.externalData) {\n        if (!Array.isArray(object.externalData)) throw TypeError('.onnx.TensorProto.externalData: array expected');\n        message.externalData = [];\n        for (var i = 0; i < object.externalData.length; ++i) {\n          if (typeof object.externalData[i] !== 'object')\n            throw TypeError('.onnx.TensorProto.externalData: object expected');\n          message.externalData[i] = $root.onnx.StringStringEntryProto.fromObject(object.externalData[i]);\n        }\n      }\n      switch (object.dataLocation) {\n        default:\n          if (typeof object.dataLocation === 'number') {\n            message.dataLocation = object.dataLocation;\n            break;\n          }\n          break;\n        case 'DEFAULT':\n        case 0:\n          message.dataLocation = 0;\n          break;\n        case 'EXTERNAL':\n        case 1:\n          message.dataLocation = 1;\n          break;\n      }\n      if (object.doubleData) {\n        if (!Array.isArray(object.doubleData)) throw TypeError('.onnx.TensorProto.doubleData: array expected');\n        message.doubleData = [];\n        for (var i = 0; i < object.doubleData.length; ++i) message.doubleData[i] = Number(object.doubleData[i]);\n      }\n      if (object.uint64Data) {\n        if (!Array.isArray(object.uint64Data)) throw TypeError('.onnx.TensorProto.uint64Data: array expected');\n        message.uint64Data = [];\n        for (var i = 0; i < object.uint64Data.length; ++i)\n          if ($util.Long) (message.uint64Data[i] = $util.Long.fromValue(object.uint64Data[i])).unsigned = true;\n          else if (typeof object.uint64Data[i] === 'string') message.uint64Data[i] = parseInt(object.uint64Data[i], 10);\n          else if (typeof object.uint64Data[i] === 'number') message.uint64Data[i] = object.uint64Data[i];\n          else if (typeof object.uint64Data[i] === 'object')\n            message.uint64Data[i] = new $util.LongBits(\n              object.uint64Data[i].low >>> 0,\n              object.uint64Data[i].high >>> 0,\n            ).toNumber(true);\n      }\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a TensorProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.TensorProto\n     * @static\n     * @param {onnx.TensorProto} message TensorProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    TensorProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) {\n        object.dims = [];\n        object.floatData = [];\n        object.int32Data = [];\n        object.stringData = [];\n        object.int64Data = [];\n        object.doubleData = [];\n        object.uint64Data = [];\n        object.externalData = [];\n      }\n      if (options.defaults) {\n        object.dataType = 0;\n        object.segment = null;\n        object.name = '';\n        if (options.bytes === String) object.rawData = '';\n        else {\n          object.rawData = [];\n          if (options.bytes !== Array) object.rawData = $util.newBuffer(object.rawData);\n        }\n        object.docString = '';\n        object.dataLocation = options.enums === String ? 'DEFAULT' : 0;\n      }\n      if (message.dims && message.dims.length) {\n        object.dims = [];\n        for (var j = 0; j < message.dims.length; ++j)\n          if (typeof message.dims[j] === 'number')\n            object.dims[j] = options.longs === String ? String(message.dims[j]) : message.dims[j];\n          else\n            object.dims[j] =\n              options.longs === String\n                ? $util.Long.prototype.toString.call(message.dims[j])\n                : options.longs === Number\n                  ? new $util.LongBits(message.dims[j].low >>> 0, message.dims[j].high >>> 0).toNumber()\n                  : message.dims[j];\n      }\n      if (message.dataType != null && message.hasOwnProperty('dataType')) object.dataType = message.dataType;\n      if (message.segment != null && message.hasOwnProperty('segment'))\n        object.segment = $root.onnx.TensorProto.Segment.toObject(message.segment, options);\n      if (message.floatData && message.floatData.length) {\n        object.floatData = [];\n        for (var j = 0; j < message.floatData.length; ++j)\n          object.floatData[j] =\n            options.json && !isFinite(message.floatData[j]) ? String(message.floatData[j]) : message.floatData[j];\n      }\n      if (message.int32Data && message.int32Data.length) {\n        object.int32Data = [];\n        for (var j = 0; j < message.int32Data.length; ++j) object.int32Data[j] = message.int32Data[j];\n      }\n      if (message.stringData && message.stringData.length) {\n        object.stringData = [];\n        for (var j = 0; j < message.stringData.length; ++j)\n          object.stringData[j] =\n            options.bytes === String\n              ? $util.base64.encode(message.stringData[j], 0, message.stringData[j].length)\n              : options.bytes === Array\n                ? Array.prototype.slice.call(message.stringData[j])\n                : message.stringData[j];\n      }\n      if (message.int64Data && message.int64Data.length) {\n        object.int64Data = [];\n        for (var j = 0; j < message.int64Data.length; ++j)\n          if (typeof message.int64Data[j] === 'number')\n            object.int64Data[j] = options.longs === String ? String(message.int64Data[j]) : message.int64Data[j];\n          else\n            object.int64Data[j] =\n              options.longs === String\n                ? $util.Long.prototype.toString.call(message.int64Data[j])\n                : options.longs === Number\n                  ? new $util.LongBits(message.int64Data[j].low >>> 0, message.int64Data[j].high >>> 0).toNumber()\n                  : message.int64Data[j];\n      }\n      if (message.name != null && message.hasOwnProperty('name')) object.name = message.name;\n      if (message.rawData != null && message.hasOwnProperty('rawData'))\n        object.rawData =\n          options.bytes === String\n            ? $util.base64.encode(message.rawData, 0, message.rawData.length)\n            : options.bytes === Array\n              ? Array.prototype.slice.call(message.rawData)\n              : message.rawData;\n      if (message.doubleData && message.doubleData.length) {\n        object.doubleData = [];\n        for (var j = 0; j < message.doubleData.length; ++j)\n          object.doubleData[j] =\n            options.json && !isFinite(message.doubleData[j]) ? String(message.doubleData[j]) : message.doubleData[j];\n      }\n      if (message.uint64Data && message.uint64Data.length) {\n        object.uint64Data = [];\n        for (var j = 0; j < message.uint64Data.length; ++j)\n          if (typeof message.uint64Data[j] === 'number')\n            object.uint64Data[j] = options.longs === String ? String(message.uint64Data[j]) : message.uint64Data[j];\n          else\n            object.uint64Data[j] =\n              options.longs === String\n                ? $util.Long.prototype.toString.call(message.uint64Data[j])\n                : options.longs === Number\n                  ? new $util.LongBits(message.uint64Data[j].low >>> 0, message.uint64Data[j].high >>> 0).toNumber(true)\n                  : message.uint64Data[j];\n      }\n      if (message.docString != null && message.hasOwnProperty('docString')) object.docString = message.docString;\n      if (message.externalData && message.externalData.length) {\n        object.externalData = [];\n        for (var j = 0; j < message.externalData.length; ++j)\n          object.externalData[j] = $root.onnx.StringStringEntryProto.toObject(message.externalData[j], options);\n      }\n      if (message.dataLocation != null && message.hasOwnProperty('dataLocation'))\n        object.dataLocation =\n          options.enums === String\n            ? $root.onnx.TensorProto.DataLocation[message.dataLocation] === undefined\n              ? message.dataLocation\n              : $root.onnx.TensorProto.DataLocation[message.dataLocation]\n            : message.dataLocation;\n      return object;\n    };\n\n    /**\n     * Converts this TensorProto to JSON.\n     * @function toJSON\n     * @memberof onnx.TensorProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    TensorProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for TensorProto\n     * @function getTypeUrl\n     * @memberof onnx.TensorProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    TensorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.TensorProto';\n    };\n\n    /**\n     * DataType enum.\n     * @name onnx.TensorProto.DataType\n     * @enum {number}\n     * @property {number} UNDEFINED=0 UNDEFINED value\n     * @property {number} FLOAT=1 FLOAT value\n     * @property {number} UINT8=2 UINT8 value\n     * @property {number} INT8=3 INT8 value\n     * @property {number} UINT16=4 UINT16 value\n     * @property {number} INT16=5 INT16 value\n     * @property {number} INT32=6 INT32 value\n     * @property {number} INT64=7 INT64 value\n     * @property {number} STRING=8 STRING value\n     * @property {number} BOOL=9 BOOL value\n     * @property {number} FLOAT16=10 FLOAT16 value\n     * @property {number} DOUBLE=11 DOUBLE value\n     * @property {number} UINT32=12 UINT32 value\n     * @property {number} UINT64=13 UINT64 value\n     * @property {number} COMPLEX64=14 COMPLEX64 value\n     * @property {number} COMPLEX128=15 COMPLEX128 value\n     * @property {number} BFLOAT16=16 BFLOAT16 value\n     * @property {number} FLOAT8E4M3FN=17 FLOAT8E4M3FN value\n     * @property {number} FLOAT8E4M3FNUZ=18 FLOAT8E4M3FNUZ value\n     * @property {number} FLOAT8E5M2=19 FLOAT8E5M2 value\n     * @property {number} FLOAT8E5M2FNUZ=20 FLOAT8E5M2FNUZ value\n     */\n    TensorProto.DataType = (function () {\n      var valuesById = {},\n        values = Object.create(valuesById);\n      values[(valuesById[0] = 'UNDEFINED')] = 0;\n      values[(valuesById[1] = 'FLOAT')] = 1;\n      values[(valuesById[2] = 'UINT8')] = 2;\n      values[(valuesById[3] = 'INT8')] = 3;\n      values[(valuesById[4] = 'UINT16')] = 4;\n      values[(valuesById[5] = 'INT16')] = 5;\n      values[(valuesById[6] = 'INT32')] = 6;\n      values[(valuesById[7] = 'INT64')] = 7;\n      values[(valuesById[8] = 'STRING')] = 8;\n      values[(valuesById[9] = 'BOOL')] = 9;\n      values[(valuesById[10] = 'FLOAT16')] = 10;\n      values[(valuesById[11] = 'DOUBLE')] = 11;\n      values[(valuesById[12] = 'UINT32')] = 12;\n      values[(valuesById[13] = 'UINT64')] = 13;\n      values[(valuesById[14] = 'COMPLEX64')] = 14;\n      values[(valuesById[15] = 'COMPLEX128')] = 15;\n      values[(valuesById[16] = 'BFLOAT16')] = 16;\n      values[(valuesById[17] = 'FLOAT8E4M3FN')] = 17;\n      values[(valuesById[18] = 'FLOAT8E4M3FNUZ')] = 18;\n      values[(valuesById[19] = 'FLOAT8E5M2')] = 19;\n      values[(valuesById[20] = 'FLOAT8E5M2FNUZ')] = 20;\n      return values;\n    })();\n\n    TensorProto.Segment = (function () {\n      /**\n       * Properties of a Segment.\n       * @memberof onnx.TensorProto\n       * @interface ISegment\n       * @property {number|Long|null} [begin] Segment begin\n       * @property {number|Long|null} [end] Segment end\n       */\n\n      /**\n       * Constructs a new Segment.\n       * @memberof onnx.TensorProto\n       * @classdesc Represents a Segment.\n       * @implements ISegment\n       * @constructor\n       * @param {onnx.TensorProto.ISegment=} [properties] Properties to set\n       */\n      function Segment(properties) {\n        if (properties)\n          for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n      }\n\n      /**\n       * Segment begin.\n       * @member {number|Long} begin\n       * @memberof onnx.TensorProto.Segment\n       * @instance\n       */\n      Segment.prototype.begin = $util.Long ? $util.Long.fromBits(0, 0, false) : 0;\n\n      /**\n       * Segment end.\n       * @member {number|Long} end\n       * @memberof onnx.TensorProto.Segment\n       * @instance\n       */\n      Segment.prototype.end = $util.Long ? $util.Long.fromBits(0, 0, false) : 0;\n\n      /**\n       * Creates a new Segment instance using the specified properties.\n       * @function create\n       * @memberof onnx.TensorProto.Segment\n       * @static\n       * @param {onnx.TensorProto.ISegment=} [properties] Properties to set\n       * @returns {onnx.TensorProto.Segment} Segment instance\n       */\n      Segment.create = function create(properties) {\n        return new Segment(properties);\n      };\n\n      /**\n       * Encodes the specified Segment message. Does not implicitly {@link onnx.TensorProto.Segment.verify|verify} messages.\n       * @function encode\n       * @memberof onnx.TensorProto.Segment\n       * @static\n       * @param {onnx.TensorProto.ISegment} message Segment message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Segment.encode = function encode(message, writer) {\n        if (!writer) writer = $Writer.create();\n        if (message.begin != null && Object.hasOwnProperty.call(message, 'begin'))\n          writer.uint32(/* id 1, wireType 0 =*/ 8).int64(message.begin);\n        if (message.end != null && Object.hasOwnProperty.call(message, 'end'))\n          writer.uint32(/* id 2, wireType 0 =*/ 16).int64(message.end);\n        return writer;\n      };\n\n      /**\n       * Encodes the specified Segment message, length delimited. Does not implicitly {@link onnx.TensorProto.Segment.verify|verify} messages.\n       * @function encodeDelimited\n       * @memberof onnx.TensorProto.Segment\n       * @static\n       * @param {onnx.TensorProto.ISegment} message Segment message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Segment.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n      };\n\n      /**\n       * Decodes a Segment message from the specified reader or buffer.\n       * @function decode\n       * @memberof onnx.TensorProto.Segment\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @param {number} [length] Message length if known beforehand\n       * @returns {onnx.TensorProto.Segment} Segment\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Segment.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length,\n          message = new $root.onnx.TensorProto.Segment();\n        while (reader.pos < end) {\n          var tag = reader.uint32();\n          switch (tag >>> 3) {\n            case 1: {\n              message.begin = reader.int64();\n              break;\n            }\n            case 2: {\n              message.end = reader.int64();\n              break;\n            }\n            default:\n              reader.skipType(tag & 7);\n              break;\n          }\n        }\n        return message;\n      };\n\n      /**\n       * Decodes a Segment message from the specified reader or buffer, length delimited.\n       * @function decodeDelimited\n       * @memberof onnx.TensorProto.Segment\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @returns {onnx.TensorProto.Segment} Segment\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Segment.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n      };\n\n      /**\n       * Verifies a Segment message.\n       * @function verify\n       * @memberof onnx.TensorProto.Segment\n       * @static\n       * @param {Object.<string,*>} message Plain object to verify\n       * @returns {string|null} `null` if valid, otherwise the reason why it is not\n       */\n      Segment.verify = function verify(message) {\n        if (typeof message !== 'object' || message === null) return 'object expected';\n        if (message.begin != null && message.hasOwnProperty('begin'))\n          if (\n            !$util.isInteger(message.begin) &&\n            !(message.begin && $util.isInteger(message.begin.low) && $util.isInteger(message.begin.high))\n          )\n            return 'begin: integer|Long expected';\n        if (message.end != null && message.hasOwnProperty('end'))\n          if (\n            !$util.isInteger(message.end) &&\n            !(message.end && $util.isInteger(message.end.low) && $util.isInteger(message.end.high))\n          )\n            return 'end: integer|Long expected';\n        return null;\n      };\n\n      /**\n       * Creates a Segment message from a plain object. Also converts values to their respective internal types.\n       * @function fromObject\n       * @memberof onnx.TensorProto.Segment\n       * @static\n       * @param {Object.<string,*>} object Plain object\n       * @returns {onnx.TensorProto.Segment} Segment\n       */\n      Segment.fromObject = function fromObject(object) {\n        if (object instanceof $root.onnx.TensorProto.Segment) return object;\n        var message = new $root.onnx.TensorProto.Segment();\n        if (object.begin != null)\n          if ($util.Long) (message.begin = $util.Long.fromValue(object.begin)).unsigned = false;\n          else if (typeof object.begin === 'string') message.begin = parseInt(object.begin, 10);\n          else if (typeof object.begin === 'number') message.begin = object.begin;\n          else if (typeof object.begin === 'object')\n            message.begin = new $util.LongBits(object.begin.low >>> 0, object.begin.high >>> 0).toNumber();\n        if (object.end != null)\n          if ($util.Long) (message.end = $util.Long.fromValue(object.end)).unsigned = false;\n          else if (typeof object.end === 'string') message.end = parseInt(object.end, 10);\n          else if (typeof object.end === 'number') message.end = object.end;\n          else if (typeof object.end === 'object')\n            message.end = new $util.LongBits(object.end.low >>> 0, object.end.high >>> 0).toNumber();\n        return message;\n      };\n\n      /**\n       * Creates a plain object from a Segment message. Also converts values to other types if specified.\n       * @function toObject\n       * @memberof onnx.TensorProto.Segment\n       * @static\n       * @param {onnx.TensorProto.Segment} message Segment\n       * @param {$protobuf.IConversionOptions} [options] Conversion options\n       * @returns {Object.<string,*>} Plain object\n       */\n      Segment.toObject = function toObject(message, options) {\n        if (!options) options = {};\n        var object = {};\n        if (options.defaults) {\n          if ($util.Long) {\n            var long = new $util.Long(0, 0, false);\n            object.begin =\n              options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n          } else object.begin = options.longs === String ? '0' : 0;\n          if ($util.Long) {\n            var long = new $util.Long(0, 0, false);\n            object.end = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n          } else object.end = options.longs === String ? '0' : 0;\n        }\n        if (message.begin != null && message.hasOwnProperty('begin'))\n          if (typeof message.begin === 'number')\n            object.begin = options.longs === String ? String(message.begin) : message.begin;\n          else\n            object.begin =\n              options.longs === String\n                ? $util.Long.prototype.toString.call(message.begin)\n                : options.longs === Number\n                  ? new $util.LongBits(message.begin.low >>> 0, message.begin.high >>> 0).toNumber()\n                  : message.begin;\n        if (message.end != null && message.hasOwnProperty('end'))\n          if (typeof message.end === 'number')\n            object.end = options.longs === String ? String(message.end) : message.end;\n          else\n            object.end =\n              options.longs === String\n                ? $util.Long.prototype.toString.call(message.end)\n                : options.longs === Number\n                  ? new $util.LongBits(message.end.low >>> 0, message.end.high >>> 0).toNumber()\n                  : message.end;\n        return object;\n      };\n\n      /**\n       * Converts this Segment to JSON.\n       * @function toJSON\n       * @memberof onnx.TensorProto.Segment\n       * @instance\n       * @returns {Object.<string,*>} JSON object\n       */\n      Segment.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n      };\n\n      /**\n       * Gets the default type url for Segment\n       * @function getTypeUrl\n       * @memberof onnx.TensorProto.Segment\n       * @static\n       * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n       * @returns {string} The default type url\n       */\n      Segment.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n        if (typeUrlPrefix === undefined) {\n          typeUrlPrefix = 'type.googleapis.com';\n        }\n        return typeUrlPrefix + '/onnx.TensorProto.Segment';\n      };\n\n      return Segment;\n    })();\n\n    /**\n     * DataLocation enum.\n     * @name onnx.TensorProto.DataLocation\n     * @enum {number}\n     * @property {number} DEFAULT=0 DEFAULT value\n     * @property {number} EXTERNAL=1 EXTERNAL value\n     */\n    TensorProto.DataLocation = (function () {\n      var valuesById = {},\n        values = Object.create(valuesById);\n      values[(valuesById[0] = 'DEFAULT')] = 0;\n      values[(valuesById[1] = 'EXTERNAL')] = 1;\n      return values;\n    })();\n\n    return TensorProto;\n  })();\n\n  onnx.SparseTensorProto = (function () {\n    /**\n     * Properties of a SparseTensorProto.\n     * @memberof onnx\n     * @interface ISparseTensorProto\n     * @property {onnx.ITensorProto|null} [values] SparseTensorProto values\n     * @property {onnx.ITensorProto|null} [indices] SparseTensorProto indices\n     * @property {Array.<number|Long>|null} [dims] SparseTensorProto dims\n     */\n\n    /**\n     * Constructs a new SparseTensorProto.\n     * @memberof onnx\n     * @classdesc Represents a SparseTensorProto.\n     * @implements ISparseTensorProto\n     * @constructor\n     * @param {onnx.ISparseTensorProto=} [properties] Properties to set\n     */\n    function SparseTensorProto(properties) {\n      this.dims = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * SparseTensorProto values.\n     * @member {onnx.ITensorProto|null|undefined} values\n     * @memberof onnx.SparseTensorProto\n     * @instance\n     */\n    SparseTensorProto.prototype.values = null;\n\n    /**\n     * SparseTensorProto indices.\n     * @member {onnx.ITensorProto|null|undefined} indices\n     * @memberof onnx.SparseTensorProto\n     * @instance\n     */\n    SparseTensorProto.prototype.indices = null;\n\n    /**\n     * SparseTensorProto dims.\n     * @member {Array.<number|Long>} dims\n     * @memberof onnx.SparseTensorProto\n     * @instance\n     */\n    SparseTensorProto.prototype.dims = $util.emptyArray;\n\n    /**\n     * Creates a new SparseTensorProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.SparseTensorProto\n     * @static\n     * @param {onnx.ISparseTensorProto=} [properties] Properties to set\n     * @returns {onnx.SparseTensorProto} SparseTensorProto instance\n     */\n    SparseTensorProto.create = function create(properties) {\n      return new SparseTensorProto(properties);\n    };\n\n    /**\n     * Encodes the specified SparseTensorProto message. Does not implicitly {@link onnx.SparseTensorProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.SparseTensorProto\n     * @static\n     * @param {onnx.ISparseTensorProto} message SparseTensorProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    SparseTensorProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.values != null && Object.hasOwnProperty.call(message, 'values'))\n        $root.onnx.TensorProto.encode(message.values, writer.uint32(/* id 1, wireType 2 =*/ 10).fork()).ldelim();\n      if (message.indices != null && Object.hasOwnProperty.call(message, 'indices'))\n        $root.onnx.TensorProto.encode(message.indices, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();\n      if (message.dims != null && message.dims.length) {\n        writer.uint32(/* id 3, wireType 2 =*/ 26).fork();\n        for (var i = 0; i < message.dims.length; ++i) writer.int64(message.dims[i]);\n        writer.ldelim();\n      }\n      return writer;\n    };\n\n    /**\n     * Encodes the specified SparseTensorProto message, length delimited. Does not implicitly {@link onnx.SparseTensorProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.SparseTensorProto\n     * @static\n     * @param {onnx.ISparseTensorProto} message SparseTensorProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    SparseTensorProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a SparseTensorProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.SparseTensorProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.SparseTensorProto} SparseTensorProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    SparseTensorProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.SparseTensorProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.values = $root.onnx.TensorProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 2: {\n            message.indices = $root.onnx.TensorProto.decode(reader, reader.uint32());\n            break;\n          }\n          case 3: {\n            if (!(message.dims && message.dims.length)) message.dims = [];\n            if ((tag & 7) === 2) {\n              var end2 = reader.uint32() + reader.pos;\n              while (reader.pos < end2) message.dims.push(reader.int64());\n            } else message.dims.push(reader.int64());\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a SparseTensorProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.SparseTensorProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.SparseTensorProto} SparseTensorProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    SparseTensorProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a SparseTensorProto message.\n     * @function verify\n     * @memberof onnx.SparseTensorProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    SparseTensorProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.values != null && message.hasOwnProperty('values')) {\n        var error = $root.onnx.TensorProto.verify(message.values);\n        if (error) return 'values.' + error;\n      }\n      if (message.indices != null && message.hasOwnProperty('indices')) {\n        var error = $root.onnx.TensorProto.verify(message.indices);\n        if (error) return 'indices.' + error;\n      }\n      if (message.dims != null && message.hasOwnProperty('dims')) {\n        if (!Array.isArray(message.dims)) return 'dims: array expected';\n        for (var i = 0; i < message.dims.length; ++i)\n          if (\n            !$util.isInteger(message.dims[i]) &&\n            !(message.dims[i] && $util.isInteger(message.dims[i].low) && $util.isInteger(message.dims[i].high))\n          )\n            return 'dims: integer|Long[] expected';\n      }\n      return null;\n    };\n\n    /**\n     * Creates a SparseTensorProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.SparseTensorProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.SparseTensorProto} SparseTensorProto\n     */\n    SparseTensorProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.SparseTensorProto) return object;\n      var message = new $root.onnx.SparseTensorProto();\n      if (object.values != null) {\n        if (typeof object.values !== 'object') throw TypeError('.onnx.SparseTensorProto.values: object expected');\n        message.values = $root.onnx.TensorProto.fromObject(object.values);\n      }\n      if (object.indices != null) {\n        if (typeof object.indices !== 'object') throw TypeError('.onnx.SparseTensorProto.indices: object expected');\n        message.indices = $root.onnx.TensorProto.fromObject(object.indices);\n      }\n      if (object.dims) {\n        if (!Array.isArray(object.dims)) throw TypeError('.onnx.SparseTensorProto.dims: array expected');\n        message.dims = [];\n        for (var i = 0; i < object.dims.length; ++i)\n          if ($util.Long) (message.dims[i] = $util.Long.fromValue(object.dims[i])).unsigned = false;\n          else if (typeof object.dims[i] === 'string') message.dims[i] = parseInt(object.dims[i], 10);\n          else if (typeof object.dims[i] === 'number') message.dims[i] = object.dims[i];\n          else if (typeof object.dims[i] === 'object')\n            message.dims[i] = new $util.LongBits(object.dims[i].low >>> 0, object.dims[i].high >>> 0).toNumber();\n      }\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a SparseTensorProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.SparseTensorProto\n     * @static\n     * @param {onnx.SparseTensorProto} message SparseTensorProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    SparseTensorProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) object.dims = [];\n      if (options.defaults) {\n        object.values = null;\n        object.indices = null;\n      }\n      if (message.values != null && message.hasOwnProperty('values'))\n        object.values = $root.onnx.TensorProto.toObject(message.values, options);\n      if (message.indices != null && message.hasOwnProperty('indices'))\n        object.indices = $root.onnx.TensorProto.toObject(message.indices, options);\n      if (message.dims && message.dims.length) {\n        object.dims = [];\n        for (var j = 0; j < message.dims.length; ++j)\n          if (typeof message.dims[j] === 'number')\n            object.dims[j] = options.longs === String ? String(message.dims[j]) : message.dims[j];\n          else\n            object.dims[j] =\n              options.longs === String\n                ? $util.Long.prototype.toString.call(message.dims[j])\n                : options.longs === Number\n                  ? new $util.LongBits(message.dims[j].low >>> 0, message.dims[j].high >>> 0).toNumber()\n                  : message.dims[j];\n      }\n      return object;\n    };\n\n    /**\n     * Converts this SparseTensorProto to JSON.\n     * @function toJSON\n     * @memberof onnx.SparseTensorProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    SparseTensorProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for SparseTensorProto\n     * @function getTypeUrl\n     * @memberof onnx.SparseTensorProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    SparseTensorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.SparseTensorProto';\n    };\n\n    return SparseTensorProto;\n  })();\n\n  onnx.TensorShapeProto = (function () {\n    /**\n     * Properties of a TensorShapeProto.\n     * @memberof onnx\n     * @interface ITensorShapeProto\n     * @property {Array.<onnx.TensorShapeProto.IDimension>|null} [dim] TensorShapeProto dim\n     */\n\n    /**\n     * Constructs a new TensorShapeProto.\n     * @memberof onnx\n     * @classdesc Represents a TensorShapeProto.\n     * @implements ITensorShapeProto\n     * @constructor\n     * @param {onnx.ITensorShapeProto=} [properties] Properties to set\n     */\n    function TensorShapeProto(properties) {\n      this.dim = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * TensorShapeProto dim.\n     * @member {Array.<onnx.TensorShapeProto.IDimension>} dim\n     * @memberof onnx.TensorShapeProto\n     * @instance\n     */\n    TensorShapeProto.prototype.dim = $util.emptyArray;\n\n    /**\n     * Creates a new TensorShapeProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.TensorShapeProto\n     * @static\n     * @param {onnx.ITensorShapeProto=} [properties] Properties to set\n     * @returns {onnx.TensorShapeProto} TensorShapeProto instance\n     */\n    TensorShapeProto.create = function create(properties) {\n      return new TensorShapeProto(properties);\n    };\n\n    /**\n     * Encodes the specified TensorShapeProto message. Does not implicitly {@link onnx.TensorShapeProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.TensorShapeProto\n     * @static\n     * @param {onnx.ITensorShapeProto} message TensorShapeProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TensorShapeProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.dim != null && message.dim.length)\n        for (var i = 0; i < message.dim.length; ++i)\n          $root.onnx.TensorShapeProto.Dimension.encode(\n            message.dim[i],\n            writer.uint32(/* id 1, wireType 2 =*/ 10).fork(),\n          ).ldelim();\n      return writer;\n    };\n\n    /**\n     * Encodes the specified TensorShapeProto message, length delimited. Does not implicitly {@link onnx.TensorShapeProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.TensorShapeProto\n     * @static\n     * @param {onnx.ITensorShapeProto} message TensorShapeProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TensorShapeProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a TensorShapeProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.TensorShapeProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.TensorShapeProto} TensorShapeProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TensorShapeProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.TensorShapeProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            if (!(message.dim && message.dim.length)) message.dim = [];\n            message.dim.push($root.onnx.TensorShapeProto.Dimension.decode(reader, reader.uint32()));\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a TensorShapeProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.TensorShapeProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.TensorShapeProto} TensorShapeProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TensorShapeProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a TensorShapeProto message.\n     * @function verify\n     * @memberof onnx.TensorShapeProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    TensorShapeProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.dim != null && message.hasOwnProperty('dim')) {\n        if (!Array.isArray(message.dim)) return 'dim: array expected';\n        for (var i = 0; i < message.dim.length; ++i) {\n          var error = $root.onnx.TensorShapeProto.Dimension.verify(message.dim[i]);\n          if (error) return 'dim.' + error;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Creates a TensorShapeProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.TensorShapeProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.TensorShapeProto} TensorShapeProto\n     */\n    TensorShapeProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.TensorShapeProto) return object;\n      var message = new $root.onnx.TensorShapeProto();\n      if (object.dim) {\n        if (!Array.isArray(object.dim)) throw TypeError('.onnx.TensorShapeProto.dim: array expected');\n        message.dim = [];\n        for (var i = 0; i < object.dim.length; ++i) {\n          if (typeof object.dim[i] !== 'object') throw TypeError('.onnx.TensorShapeProto.dim: object expected');\n          message.dim[i] = $root.onnx.TensorShapeProto.Dimension.fromObject(object.dim[i]);\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a TensorShapeProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.TensorShapeProto\n     * @static\n     * @param {onnx.TensorShapeProto} message TensorShapeProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    TensorShapeProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) object.dim = [];\n      if (message.dim && message.dim.length) {\n        object.dim = [];\n        for (var j = 0; j < message.dim.length; ++j)\n          object.dim[j] = $root.onnx.TensorShapeProto.Dimension.toObject(message.dim[j], options);\n      }\n      return object;\n    };\n\n    /**\n     * Converts this TensorShapeProto to JSON.\n     * @function toJSON\n     * @memberof onnx.TensorShapeProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    TensorShapeProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for TensorShapeProto\n     * @function getTypeUrl\n     * @memberof onnx.TensorShapeProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    TensorShapeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.TensorShapeProto';\n    };\n\n    TensorShapeProto.Dimension = (function () {\n      /**\n       * Properties of a Dimension.\n       * @memberof onnx.TensorShapeProto\n       * @interface IDimension\n       * @property {number|Long|null} [dimValue] Dimension dimValue\n       * @property {string|null} [dimParam] Dimension dimParam\n       * @property {string|null} [denotation] Dimension denotation\n       */\n\n      /**\n       * Constructs a new Dimension.\n       * @memberof onnx.TensorShapeProto\n       * @classdesc Represents a Dimension.\n       * @implements IDimension\n       * @constructor\n       * @param {onnx.TensorShapeProto.IDimension=} [properties] Properties to set\n       */\n      function Dimension(properties) {\n        if (properties)\n          for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n      }\n\n      /**\n       * Dimension dimValue.\n       * @member {number|Long|null|undefined} dimValue\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @instance\n       */\n      Dimension.prototype.dimValue = null;\n\n      /**\n       * Dimension dimParam.\n       * @member {string|null|undefined} dimParam\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @instance\n       */\n      Dimension.prototype.dimParam = null;\n\n      /**\n       * Dimension denotation.\n       * @member {string} denotation\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @instance\n       */\n      Dimension.prototype.denotation = '';\n\n      // OneOf field names bound to virtual getters and setters\n      var $oneOfFields;\n\n      /**\n       * Dimension value.\n       * @member {\"dimValue\"|\"dimParam\"|undefined} value\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @instance\n       */\n      Object.defineProperty(Dimension.prototype, 'value', {\n        get: $util.oneOfGetter(($oneOfFields = ['dimValue', 'dimParam'])),\n        set: $util.oneOfSetter($oneOfFields),\n      });\n\n      /**\n       * Creates a new Dimension instance using the specified properties.\n       * @function create\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @static\n       * @param {onnx.TensorShapeProto.IDimension=} [properties] Properties to set\n       * @returns {onnx.TensorShapeProto.Dimension} Dimension instance\n       */\n      Dimension.create = function create(properties) {\n        return new Dimension(properties);\n      };\n\n      /**\n       * Encodes the specified Dimension message. Does not implicitly {@link onnx.TensorShapeProto.Dimension.verify|verify} messages.\n       * @function encode\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @static\n       * @param {onnx.TensorShapeProto.IDimension} message Dimension message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Dimension.encode = function encode(message, writer) {\n        if (!writer) writer = $Writer.create();\n        if (message.dimValue != null && Object.hasOwnProperty.call(message, 'dimValue'))\n          writer.uint32(/* id 1, wireType 0 =*/ 8).int64(message.dimValue);\n        if (message.dimParam != null && Object.hasOwnProperty.call(message, 'dimParam'))\n          writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.dimParam);\n        if (message.denotation != null && Object.hasOwnProperty.call(message, 'denotation'))\n          writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.denotation);\n        return writer;\n      };\n\n      /**\n       * Encodes the specified Dimension message, length delimited. Does not implicitly {@link onnx.TensorShapeProto.Dimension.verify|verify} messages.\n       * @function encodeDelimited\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @static\n       * @param {onnx.TensorShapeProto.IDimension} message Dimension message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Dimension.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n      };\n\n      /**\n       * Decodes a Dimension message from the specified reader or buffer.\n       * @function decode\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @param {number} [length] Message length if known beforehand\n       * @returns {onnx.TensorShapeProto.Dimension} Dimension\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Dimension.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length,\n          message = new $root.onnx.TensorShapeProto.Dimension();\n        while (reader.pos < end) {\n          var tag = reader.uint32();\n          switch (tag >>> 3) {\n            case 1: {\n              message.dimValue = reader.int64();\n              break;\n            }\n            case 2: {\n              message.dimParam = reader.string();\n              break;\n            }\n            case 3: {\n              message.denotation = reader.string();\n              break;\n            }\n            default:\n              reader.skipType(tag & 7);\n              break;\n          }\n        }\n        return message;\n      };\n\n      /**\n       * Decodes a Dimension message from the specified reader or buffer, length delimited.\n       * @function decodeDelimited\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @returns {onnx.TensorShapeProto.Dimension} Dimension\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Dimension.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n      };\n\n      /**\n       * Verifies a Dimension message.\n       * @function verify\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @static\n       * @param {Object.<string,*>} message Plain object to verify\n       * @returns {string|null} `null` if valid, otherwise the reason why it is not\n       */\n      Dimension.verify = function verify(message) {\n        if (typeof message !== 'object' || message === null) return 'object expected';\n        var properties = {};\n        if (message.dimValue != null && message.hasOwnProperty('dimValue')) {\n          properties.value = 1;\n          if (\n            !$util.isInteger(message.dimValue) &&\n            !(message.dimValue && $util.isInteger(message.dimValue.low) && $util.isInteger(message.dimValue.high))\n          )\n            return 'dimValue: integer|Long expected';\n        }\n        if (message.dimParam != null && message.hasOwnProperty('dimParam')) {\n          if (properties.value === 1) return 'value: multiple values';\n          properties.value = 1;\n          if (!$util.isString(message.dimParam)) return 'dimParam: string expected';\n        }\n        if (message.denotation != null && message.hasOwnProperty('denotation'))\n          if (!$util.isString(message.denotation)) return 'denotation: string expected';\n        return null;\n      };\n\n      /**\n       * Creates a Dimension message from a plain object. Also converts values to their respective internal types.\n       * @function fromObject\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @static\n       * @param {Object.<string,*>} object Plain object\n       * @returns {onnx.TensorShapeProto.Dimension} Dimension\n       */\n      Dimension.fromObject = function fromObject(object) {\n        if (object instanceof $root.onnx.TensorShapeProto.Dimension) return object;\n        var message = new $root.onnx.TensorShapeProto.Dimension();\n        if (object.dimValue != null)\n          if ($util.Long) (message.dimValue = $util.Long.fromValue(object.dimValue)).unsigned = false;\n          else if (typeof object.dimValue === 'string') message.dimValue = parseInt(object.dimValue, 10);\n          else if (typeof object.dimValue === 'number') message.dimValue = object.dimValue;\n          else if (typeof object.dimValue === 'object')\n            message.dimValue = new $util.LongBits(object.dimValue.low >>> 0, object.dimValue.high >>> 0).toNumber();\n        if (object.dimParam != null) message.dimParam = String(object.dimParam);\n        if (object.denotation != null) message.denotation = String(object.denotation);\n        return message;\n      };\n\n      /**\n       * Creates a plain object from a Dimension message. Also converts values to other types if specified.\n       * @function toObject\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @static\n       * @param {onnx.TensorShapeProto.Dimension} message Dimension\n       * @param {$protobuf.IConversionOptions} [options] Conversion options\n       * @returns {Object.<string,*>} Plain object\n       */\n      Dimension.toObject = function toObject(message, options) {\n        if (!options) options = {};\n        var object = {};\n        if (options.defaults) object.denotation = '';\n        if (message.dimValue != null && message.hasOwnProperty('dimValue')) {\n          if (typeof message.dimValue === 'number')\n            object.dimValue = options.longs === String ? String(message.dimValue) : message.dimValue;\n          else\n            object.dimValue =\n              options.longs === String\n                ? $util.Long.prototype.toString.call(message.dimValue)\n                : options.longs === Number\n                  ? new $util.LongBits(message.dimValue.low >>> 0, message.dimValue.high >>> 0).toNumber()\n                  : message.dimValue;\n          if (options.oneofs) object.value = 'dimValue';\n        }\n        if (message.dimParam != null && message.hasOwnProperty('dimParam')) {\n          object.dimParam = message.dimParam;\n          if (options.oneofs) object.value = 'dimParam';\n        }\n        if (message.denotation != null && message.hasOwnProperty('denotation')) object.denotation = message.denotation;\n        return object;\n      };\n\n      /**\n       * Converts this Dimension to JSON.\n       * @function toJSON\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @instance\n       * @returns {Object.<string,*>} JSON object\n       */\n      Dimension.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n      };\n\n      /**\n       * Gets the default type url for Dimension\n       * @function getTypeUrl\n       * @memberof onnx.TensorShapeProto.Dimension\n       * @static\n       * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n       * @returns {string} The default type url\n       */\n      Dimension.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n        if (typeUrlPrefix === undefined) {\n          typeUrlPrefix = 'type.googleapis.com';\n        }\n        return typeUrlPrefix + '/onnx.TensorShapeProto.Dimension';\n      };\n\n      return Dimension;\n    })();\n\n    return TensorShapeProto;\n  })();\n\n  onnx.TypeProto = (function () {\n    /**\n     * Properties of a TypeProto.\n     * @memberof onnx\n     * @interface ITypeProto\n     * @property {onnx.TypeProto.ITensor|null} [tensorType] TypeProto tensorType\n     * @property {onnx.TypeProto.ISequence|null} [sequenceType] TypeProto sequenceType\n     * @property {onnx.TypeProto.IMap|null} [mapType] TypeProto mapType\n     * @property {onnx.TypeProto.IOptional|null} [optionalType] TypeProto optionalType\n     * @property {onnx.TypeProto.ISparseTensor|null} [sparseTensorType] TypeProto sparseTensorType\n     * @property {string|null} [denotation] TypeProto denotation\n     */\n\n    /**\n     * Constructs a new TypeProto.\n     * @memberof onnx\n     * @classdesc Represents a TypeProto.\n     * @implements ITypeProto\n     * @constructor\n     * @param {onnx.ITypeProto=} [properties] Properties to set\n     */\n    function TypeProto(properties) {\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * TypeProto tensorType.\n     * @member {onnx.TypeProto.ITensor|null|undefined} tensorType\n     * @memberof onnx.TypeProto\n     * @instance\n     */\n    TypeProto.prototype.tensorType = null;\n\n    /**\n     * TypeProto sequenceType.\n     * @member {onnx.TypeProto.ISequence|null|undefined} sequenceType\n     * @memberof onnx.TypeProto\n     * @instance\n     */\n    TypeProto.prototype.sequenceType = null;\n\n    /**\n     * TypeProto mapType.\n     * @member {onnx.TypeProto.IMap|null|undefined} mapType\n     * @memberof onnx.TypeProto\n     * @instance\n     */\n    TypeProto.prototype.mapType = null;\n\n    /**\n     * TypeProto optionalType.\n     * @member {onnx.TypeProto.IOptional|null|undefined} optionalType\n     * @memberof onnx.TypeProto\n     * @instance\n     */\n    TypeProto.prototype.optionalType = null;\n\n    /**\n     * TypeProto sparseTensorType.\n     * @member {onnx.TypeProto.ISparseTensor|null|undefined} sparseTensorType\n     * @memberof onnx.TypeProto\n     * @instance\n     */\n    TypeProto.prototype.sparseTensorType = null;\n\n    /**\n     * TypeProto denotation.\n     * @member {string} denotation\n     * @memberof onnx.TypeProto\n     * @instance\n     */\n    TypeProto.prototype.denotation = '';\n\n    // OneOf field names bound to virtual getters and setters\n    var $oneOfFields;\n\n    /**\n     * TypeProto value.\n     * @member {\"tensorType\"|\"sequenceType\"|\"mapType\"|\"optionalType\"|\"sparseTensorType\"|undefined} value\n     * @memberof onnx.TypeProto\n     * @instance\n     */\n    Object.defineProperty(TypeProto.prototype, 'value', {\n      get: $util.oneOfGetter(\n        ($oneOfFields = ['tensorType', 'sequenceType', 'mapType', 'optionalType', 'sparseTensorType']),\n      ),\n      set: $util.oneOfSetter($oneOfFields),\n    });\n\n    /**\n     * Creates a new TypeProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.TypeProto\n     * @static\n     * @param {onnx.ITypeProto=} [properties] Properties to set\n     * @returns {onnx.TypeProto} TypeProto instance\n     */\n    TypeProto.create = function create(properties) {\n      return new TypeProto(properties);\n    };\n\n    /**\n     * Encodes the specified TypeProto message. Does not implicitly {@link onnx.TypeProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.TypeProto\n     * @static\n     * @param {onnx.ITypeProto} message TypeProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TypeProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.tensorType != null && Object.hasOwnProperty.call(message, 'tensorType'))\n        $root.onnx.TypeProto.Tensor.encode(\n          message.tensorType,\n          writer.uint32(/* id 1, wireType 2 =*/ 10).fork(),\n        ).ldelim();\n      if (message.sequenceType != null && Object.hasOwnProperty.call(message, 'sequenceType'))\n        $root.onnx.TypeProto.Sequence.encode(\n          message.sequenceType,\n          writer.uint32(/* id 4, wireType 2 =*/ 34).fork(),\n        ).ldelim();\n      if (message.mapType != null && Object.hasOwnProperty.call(message, 'mapType'))\n        $root.onnx.TypeProto.Map.encode(message.mapType, writer.uint32(/* id 5, wireType 2 =*/ 42).fork()).ldelim();\n      if (message.denotation != null && Object.hasOwnProperty.call(message, 'denotation'))\n        writer.uint32(/* id 6, wireType 2 =*/ 50).string(message.denotation);\n      if (message.sparseTensorType != null && Object.hasOwnProperty.call(message, 'sparseTensorType'))\n        $root.onnx.TypeProto.SparseTensor.encode(\n          message.sparseTensorType,\n          writer.uint32(/* id 8, wireType 2 =*/ 66).fork(),\n        ).ldelim();\n      if (message.optionalType != null && Object.hasOwnProperty.call(message, 'optionalType'))\n        $root.onnx.TypeProto.Optional.encode(\n          message.optionalType,\n          writer.uint32(/* id 9, wireType 2 =*/ 74).fork(),\n        ).ldelim();\n      return writer;\n    };\n\n    /**\n     * Encodes the specified TypeProto message, length delimited. Does not implicitly {@link onnx.TypeProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.TypeProto\n     * @static\n     * @param {onnx.ITypeProto} message TypeProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TypeProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a TypeProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.TypeProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.TypeProto} TypeProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TypeProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.TypeProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.tensorType = $root.onnx.TypeProto.Tensor.decode(reader, reader.uint32());\n            break;\n          }\n          case 4: {\n            message.sequenceType = $root.onnx.TypeProto.Sequence.decode(reader, reader.uint32());\n            break;\n          }\n          case 5: {\n            message.mapType = $root.onnx.TypeProto.Map.decode(reader, reader.uint32());\n            break;\n          }\n          case 9: {\n            message.optionalType = $root.onnx.TypeProto.Optional.decode(reader, reader.uint32());\n            break;\n          }\n          case 8: {\n            message.sparseTensorType = $root.onnx.TypeProto.SparseTensor.decode(reader, reader.uint32());\n            break;\n          }\n          case 6: {\n            message.denotation = reader.string();\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a TypeProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.TypeProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.TypeProto} TypeProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TypeProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a TypeProto message.\n     * @function verify\n     * @memberof onnx.TypeProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    TypeProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      var properties = {};\n      if (message.tensorType != null && message.hasOwnProperty('tensorType')) {\n        properties.value = 1;\n        {\n          var error = $root.onnx.TypeProto.Tensor.verify(message.tensorType);\n          if (error) return 'tensorType.' + error;\n        }\n      }\n      if (message.sequenceType != null && message.hasOwnProperty('sequenceType')) {\n        if (properties.value === 1) return 'value: multiple values';\n        properties.value = 1;\n        {\n          var error = $root.onnx.TypeProto.Sequence.verify(message.sequenceType);\n          if (error) return 'sequenceType.' + error;\n        }\n      }\n      if (message.mapType != null && message.hasOwnProperty('mapType')) {\n        if (properties.value === 1) return 'value: multiple values';\n        properties.value = 1;\n        {\n          var error = $root.onnx.TypeProto.Map.verify(message.mapType);\n          if (error) return 'mapType.' + error;\n        }\n      }\n      if (message.optionalType != null && message.hasOwnProperty('optionalType')) {\n        if (properties.value === 1) return 'value: multiple values';\n        properties.value = 1;\n        {\n          var error = $root.onnx.TypeProto.Optional.verify(message.optionalType);\n          if (error) return 'optionalType.' + error;\n        }\n      }\n      if (message.sparseTensorType != null && message.hasOwnProperty('sparseTensorType')) {\n        if (properties.value === 1) return 'value: multiple values';\n        properties.value = 1;\n        {\n          var error = $root.onnx.TypeProto.SparseTensor.verify(message.sparseTensorType);\n          if (error) return 'sparseTensorType.' + error;\n        }\n      }\n      if (message.denotation != null && message.hasOwnProperty('denotation'))\n        if (!$util.isString(message.denotation)) return 'denotation: string expected';\n      return null;\n    };\n\n    /**\n     * Creates a TypeProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.TypeProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.TypeProto} TypeProto\n     */\n    TypeProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.TypeProto) return object;\n      var message = new $root.onnx.TypeProto();\n      if (object.tensorType != null) {\n        if (typeof object.tensorType !== 'object') throw TypeError('.onnx.TypeProto.tensorType: object expected');\n        message.tensorType = $root.onnx.TypeProto.Tensor.fromObject(object.tensorType);\n      }\n      if (object.sequenceType != null) {\n        if (typeof object.sequenceType !== 'object') throw TypeError('.onnx.TypeProto.sequenceType: object expected');\n        message.sequenceType = $root.onnx.TypeProto.Sequence.fromObject(object.sequenceType);\n      }\n      if (object.mapType != null) {\n        if (typeof object.mapType !== 'object') throw TypeError('.onnx.TypeProto.mapType: object expected');\n        message.mapType = $root.onnx.TypeProto.Map.fromObject(object.mapType);\n      }\n      if (object.optionalType != null) {\n        if (typeof object.optionalType !== 'object') throw TypeError('.onnx.TypeProto.optionalType: object expected');\n        message.optionalType = $root.onnx.TypeProto.Optional.fromObject(object.optionalType);\n      }\n      if (object.sparseTensorType != null) {\n        if (typeof object.sparseTensorType !== 'object')\n          throw TypeError('.onnx.TypeProto.sparseTensorType: object expected');\n        message.sparseTensorType = $root.onnx.TypeProto.SparseTensor.fromObject(object.sparseTensorType);\n      }\n      if (object.denotation != null) message.denotation = String(object.denotation);\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a TypeProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.TypeProto\n     * @static\n     * @param {onnx.TypeProto} message TypeProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    TypeProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.defaults) object.denotation = '';\n      if (message.tensorType != null && message.hasOwnProperty('tensorType')) {\n        object.tensorType = $root.onnx.TypeProto.Tensor.toObject(message.tensorType, options);\n        if (options.oneofs) object.value = 'tensorType';\n      }\n      if (message.sequenceType != null && message.hasOwnProperty('sequenceType')) {\n        object.sequenceType = $root.onnx.TypeProto.Sequence.toObject(message.sequenceType, options);\n        if (options.oneofs) object.value = 'sequenceType';\n      }\n      if (message.mapType != null && message.hasOwnProperty('mapType')) {\n        object.mapType = $root.onnx.TypeProto.Map.toObject(message.mapType, options);\n        if (options.oneofs) object.value = 'mapType';\n      }\n      if (message.denotation != null && message.hasOwnProperty('denotation')) object.denotation = message.denotation;\n      if (message.sparseTensorType != null && message.hasOwnProperty('sparseTensorType')) {\n        object.sparseTensorType = $root.onnx.TypeProto.SparseTensor.toObject(message.sparseTensorType, options);\n        if (options.oneofs) object.value = 'sparseTensorType';\n      }\n      if (message.optionalType != null && message.hasOwnProperty('optionalType')) {\n        object.optionalType = $root.onnx.TypeProto.Optional.toObject(message.optionalType, options);\n        if (options.oneofs) object.value = 'optionalType';\n      }\n      return object;\n    };\n\n    /**\n     * Converts this TypeProto to JSON.\n     * @function toJSON\n     * @memberof onnx.TypeProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    TypeProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for TypeProto\n     * @function getTypeUrl\n     * @memberof onnx.TypeProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    TypeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.TypeProto';\n    };\n\n    TypeProto.Tensor = (function () {\n      /**\n       * Properties of a Tensor.\n       * @memberof onnx.TypeProto\n       * @interface ITensor\n       * @property {number|null} [elemType] Tensor elemType\n       * @property {onnx.ITensorShapeProto|null} [shape] Tensor shape\n       */\n\n      /**\n       * Constructs a new Tensor.\n       * @memberof onnx.TypeProto\n       * @classdesc Represents a Tensor.\n       * @implements ITensor\n       * @constructor\n       * @param {onnx.TypeProto.ITensor=} [properties] Properties to set\n       */\n      function Tensor(properties) {\n        if (properties)\n          for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n      }\n\n      /**\n       * Tensor elemType.\n       * @member {number} elemType\n       * @memberof onnx.TypeProto.Tensor\n       * @instance\n       */\n      Tensor.prototype.elemType = 0;\n\n      /**\n       * Tensor shape.\n       * @member {onnx.ITensorShapeProto|null|undefined} shape\n       * @memberof onnx.TypeProto.Tensor\n       * @instance\n       */\n      Tensor.prototype.shape = null;\n\n      /**\n       * Creates a new Tensor instance using the specified properties.\n       * @function create\n       * @memberof onnx.TypeProto.Tensor\n       * @static\n       * @param {onnx.TypeProto.ITensor=} [properties] Properties to set\n       * @returns {onnx.TypeProto.Tensor} Tensor instance\n       */\n      Tensor.create = function create(properties) {\n        return new Tensor(properties);\n      };\n\n      /**\n       * Encodes the specified Tensor message. Does not implicitly {@link onnx.TypeProto.Tensor.verify|verify} messages.\n       * @function encode\n       * @memberof onnx.TypeProto.Tensor\n       * @static\n       * @param {onnx.TypeProto.ITensor} message Tensor message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Tensor.encode = function encode(message, writer) {\n        if (!writer) writer = $Writer.create();\n        if (message.elemType != null && Object.hasOwnProperty.call(message, 'elemType'))\n          writer.uint32(/* id 1, wireType 0 =*/ 8).int32(message.elemType);\n        if (message.shape != null && Object.hasOwnProperty.call(message, 'shape'))\n          $root.onnx.TensorShapeProto.encode(message.shape, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();\n        return writer;\n      };\n\n      /**\n       * Encodes the specified Tensor message, length delimited. Does not implicitly {@link onnx.TypeProto.Tensor.verify|verify} messages.\n       * @function encodeDelimited\n       * @memberof onnx.TypeProto.Tensor\n       * @static\n       * @param {onnx.TypeProto.ITensor} message Tensor message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Tensor.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n      };\n\n      /**\n       * Decodes a Tensor message from the specified reader or buffer.\n       * @function decode\n       * @memberof onnx.TypeProto.Tensor\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @param {number} [length] Message length if known beforehand\n       * @returns {onnx.TypeProto.Tensor} Tensor\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Tensor.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length,\n          message = new $root.onnx.TypeProto.Tensor();\n        while (reader.pos < end) {\n          var tag = reader.uint32();\n          switch (tag >>> 3) {\n            case 1: {\n              message.elemType = reader.int32();\n              break;\n            }\n            case 2: {\n              message.shape = $root.onnx.TensorShapeProto.decode(reader, reader.uint32());\n              break;\n            }\n            default:\n              reader.skipType(tag & 7);\n              break;\n          }\n        }\n        return message;\n      };\n\n      /**\n       * Decodes a Tensor message from the specified reader or buffer, length delimited.\n       * @function decodeDelimited\n       * @memberof onnx.TypeProto.Tensor\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @returns {onnx.TypeProto.Tensor} Tensor\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Tensor.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n      };\n\n      /**\n       * Verifies a Tensor message.\n       * @function verify\n       * @memberof onnx.TypeProto.Tensor\n       * @static\n       * @param {Object.<string,*>} message Plain object to verify\n       * @returns {string|null} `null` if valid, otherwise the reason why it is not\n       */\n      Tensor.verify = function verify(message) {\n        if (typeof message !== 'object' || message === null) return 'object expected';\n        if (message.elemType != null && message.hasOwnProperty('elemType'))\n          if (!$util.isInteger(message.elemType)) return 'elemType: integer expected';\n        if (message.shape != null && message.hasOwnProperty('shape')) {\n          var error = $root.onnx.TensorShapeProto.verify(message.shape);\n          if (error) return 'shape.' + error;\n        }\n        return null;\n      };\n\n      /**\n       * Creates a Tensor message from a plain object. Also converts values to their respective internal types.\n       * @function fromObject\n       * @memberof onnx.TypeProto.Tensor\n       * @static\n       * @param {Object.<string,*>} object Plain object\n       * @returns {onnx.TypeProto.Tensor} Tensor\n       */\n      Tensor.fromObject = function fromObject(object) {\n        if (object instanceof $root.onnx.TypeProto.Tensor) return object;\n        var message = new $root.onnx.TypeProto.Tensor();\n        if (object.elemType != null) message.elemType = object.elemType | 0;\n        if (object.shape != null) {\n          if (typeof object.shape !== 'object') throw TypeError('.onnx.TypeProto.Tensor.shape: object expected');\n          message.shape = $root.onnx.TensorShapeProto.fromObject(object.shape);\n        }\n        return message;\n      };\n\n      /**\n       * Creates a plain object from a Tensor message. Also converts values to other types if specified.\n       * @function toObject\n       * @memberof onnx.TypeProto.Tensor\n       * @static\n       * @param {onnx.TypeProto.Tensor} message Tensor\n       * @param {$protobuf.IConversionOptions} [options] Conversion options\n       * @returns {Object.<string,*>} Plain object\n       */\n      Tensor.toObject = function toObject(message, options) {\n        if (!options) options = {};\n        var object = {};\n        if (options.defaults) {\n          object.elemType = 0;\n          object.shape = null;\n        }\n        if (message.elemType != null && message.hasOwnProperty('elemType')) object.elemType = message.elemType;\n        if (message.shape != null && message.hasOwnProperty('shape'))\n          object.shape = $root.onnx.TensorShapeProto.toObject(message.shape, options);\n        return object;\n      };\n\n      /**\n       * Converts this Tensor to JSON.\n       * @function toJSON\n       * @memberof onnx.TypeProto.Tensor\n       * @instance\n       * @returns {Object.<string,*>} JSON object\n       */\n      Tensor.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n      };\n\n      /**\n       * Gets the default type url for Tensor\n       * @function getTypeUrl\n       * @memberof onnx.TypeProto.Tensor\n       * @static\n       * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n       * @returns {string} The default type url\n       */\n      Tensor.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n        if (typeUrlPrefix === undefined) {\n          typeUrlPrefix = 'type.googleapis.com';\n        }\n        return typeUrlPrefix + '/onnx.TypeProto.Tensor';\n      };\n\n      return Tensor;\n    })();\n\n    TypeProto.Sequence = (function () {\n      /**\n       * Properties of a Sequence.\n       * @memberof onnx.TypeProto\n       * @interface ISequence\n       * @property {onnx.ITypeProto|null} [elemType] Sequence elemType\n       */\n\n      /**\n       * Constructs a new Sequence.\n       * @memberof onnx.TypeProto\n       * @classdesc Represents a Sequence.\n       * @implements ISequence\n       * @constructor\n       * @param {onnx.TypeProto.ISequence=} [properties] Properties to set\n       */\n      function Sequence(properties) {\n        if (properties)\n          for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n      }\n\n      /**\n       * Sequence elemType.\n       * @member {onnx.ITypeProto|null|undefined} elemType\n       * @memberof onnx.TypeProto.Sequence\n       * @instance\n       */\n      Sequence.prototype.elemType = null;\n\n      /**\n       * Creates a new Sequence instance using the specified properties.\n       * @function create\n       * @memberof onnx.TypeProto.Sequence\n       * @static\n       * @param {onnx.TypeProto.ISequence=} [properties] Properties to set\n       * @returns {onnx.TypeProto.Sequence} Sequence instance\n       */\n      Sequence.create = function create(properties) {\n        return new Sequence(properties);\n      };\n\n      /**\n       * Encodes the specified Sequence message. Does not implicitly {@link onnx.TypeProto.Sequence.verify|verify} messages.\n       * @function encode\n       * @memberof onnx.TypeProto.Sequence\n       * @static\n       * @param {onnx.TypeProto.ISequence} message Sequence message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Sequence.encode = function encode(message, writer) {\n        if (!writer) writer = $Writer.create();\n        if (message.elemType != null && Object.hasOwnProperty.call(message, 'elemType'))\n          $root.onnx.TypeProto.encode(message.elemType, writer.uint32(/* id 1, wireType 2 =*/ 10).fork()).ldelim();\n        return writer;\n      };\n\n      /**\n       * Encodes the specified Sequence message, length delimited. Does not implicitly {@link onnx.TypeProto.Sequence.verify|verify} messages.\n       * @function encodeDelimited\n       * @memberof onnx.TypeProto.Sequence\n       * @static\n       * @param {onnx.TypeProto.ISequence} message Sequence message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Sequence.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n      };\n\n      /**\n       * Decodes a Sequence message from the specified reader or buffer.\n       * @function decode\n       * @memberof onnx.TypeProto.Sequence\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @param {number} [length] Message length if known beforehand\n       * @returns {onnx.TypeProto.Sequence} Sequence\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Sequence.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length,\n          message = new $root.onnx.TypeProto.Sequence();\n        while (reader.pos < end) {\n          var tag = reader.uint32();\n          switch (tag >>> 3) {\n            case 1: {\n              message.elemType = $root.onnx.TypeProto.decode(reader, reader.uint32());\n              break;\n            }\n            default:\n              reader.skipType(tag & 7);\n              break;\n          }\n        }\n        return message;\n      };\n\n      /**\n       * Decodes a Sequence message from the specified reader or buffer, length delimited.\n       * @function decodeDelimited\n       * @memberof onnx.TypeProto.Sequence\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @returns {onnx.TypeProto.Sequence} Sequence\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Sequence.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n      };\n\n      /**\n       * Verifies a Sequence message.\n       * @function verify\n       * @memberof onnx.TypeProto.Sequence\n       * @static\n       * @param {Object.<string,*>} message Plain object to verify\n       * @returns {string|null} `null` if valid, otherwise the reason why it is not\n       */\n      Sequence.verify = function verify(message) {\n        if (typeof message !== 'object' || message === null) return 'object expected';\n        if (message.elemType != null && message.hasOwnProperty('elemType')) {\n          var error = $root.onnx.TypeProto.verify(message.elemType);\n          if (error) return 'elemType.' + error;\n        }\n        return null;\n      };\n\n      /**\n       * Creates a Sequence message from a plain object. Also converts values to their respective internal types.\n       * @function fromObject\n       * @memberof onnx.TypeProto.Sequence\n       * @static\n       * @param {Object.<string,*>} object Plain object\n       * @returns {onnx.TypeProto.Sequence} Sequence\n       */\n      Sequence.fromObject = function fromObject(object) {\n        if (object instanceof $root.onnx.TypeProto.Sequence) return object;\n        var message = new $root.onnx.TypeProto.Sequence();\n        if (object.elemType != null) {\n          if (typeof object.elemType !== 'object')\n            throw TypeError('.onnx.TypeProto.Sequence.elemType: object expected');\n          message.elemType = $root.onnx.TypeProto.fromObject(object.elemType);\n        }\n        return message;\n      };\n\n      /**\n       * Creates a plain object from a Sequence message. Also converts values to other types if specified.\n       * @function toObject\n       * @memberof onnx.TypeProto.Sequence\n       * @static\n       * @param {onnx.TypeProto.Sequence} message Sequence\n       * @param {$protobuf.IConversionOptions} [options] Conversion options\n       * @returns {Object.<string,*>} Plain object\n       */\n      Sequence.toObject = function toObject(message, options) {\n        if (!options) options = {};\n        var object = {};\n        if (options.defaults) object.elemType = null;\n        if (message.elemType != null && message.hasOwnProperty('elemType'))\n          object.elemType = $root.onnx.TypeProto.toObject(message.elemType, options);\n        return object;\n      };\n\n      /**\n       * Converts this Sequence to JSON.\n       * @function toJSON\n       * @memberof onnx.TypeProto.Sequence\n       * @instance\n       * @returns {Object.<string,*>} JSON object\n       */\n      Sequence.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n      };\n\n      /**\n       * Gets the default type url for Sequence\n       * @function getTypeUrl\n       * @memberof onnx.TypeProto.Sequence\n       * @static\n       * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n       * @returns {string} The default type url\n       */\n      Sequence.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n        if (typeUrlPrefix === undefined) {\n          typeUrlPrefix = 'type.googleapis.com';\n        }\n        return typeUrlPrefix + '/onnx.TypeProto.Sequence';\n      };\n\n      return Sequence;\n    })();\n\n    TypeProto.Map = (function () {\n      /**\n       * Properties of a Map.\n       * @memberof onnx.TypeProto\n       * @interface IMap\n       * @property {number|null} [keyType] Map keyType\n       * @property {onnx.ITypeProto|null} [valueType] Map valueType\n       */\n\n      /**\n       * Constructs a new Map.\n       * @memberof onnx.TypeProto\n       * @classdesc Represents a Map.\n       * @implements IMap\n       * @constructor\n       * @param {onnx.TypeProto.IMap=} [properties] Properties to set\n       */\n      function Map(properties) {\n        if (properties)\n          for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n      }\n\n      /**\n       * Map keyType.\n       * @member {number} keyType\n       * @memberof onnx.TypeProto.Map\n       * @instance\n       */\n      Map.prototype.keyType = 0;\n\n      /**\n       * Map valueType.\n       * @member {onnx.ITypeProto|null|undefined} valueType\n       * @memberof onnx.TypeProto.Map\n       * @instance\n       */\n      Map.prototype.valueType = null;\n\n      /**\n       * Creates a new Map instance using the specified properties.\n       * @function create\n       * @memberof onnx.TypeProto.Map\n       * @static\n       * @param {onnx.TypeProto.IMap=} [properties] Properties to set\n       * @returns {onnx.TypeProto.Map} Map instance\n       */\n      Map.create = function create(properties) {\n        return new Map(properties);\n      };\n\n      /**\n       * Encodes the specified Map message. Does not implicitly {@link onnx.TypeProto.Map.verify|verify} messages.\n       * @function encode\n       * @memberof onnx.TypeProto.Map\n       * @static\n       * @param {onnx.TypeProto.IMap} message Map message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Map.encode = function encode(message, writer) {\n        if (!writer) writer = $Writer.create();\n        if (message.keyType != null && Object.hasOwnProperty.call(message, 'keyType'))\n          writer.uint32(/* id 1, wireType 0 =*/ 8).int32(message.keyType);\n        if (message.valueType != null && Object.hasOwnProperty.call(message, 'valueType'))\n          $root.onnx.TypeProto.encode(message.valueType, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();\n        return writer;\n      };\n\n      /**\n       * Encodes the specified Map message, length delimited. Does not implicitly {@link onnx.TypeProto.Map.verify|verify} messages.\n       * @function encodeDelimited\n       * @memberof onnx.TypeProto.Map\n       * @static\n       * @param {onnx.TypeProto.IMap} message Map message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Map.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n      };\n\n      /**\n       * Decodes a Map message from the specified reader or buffer.\n       * @function decode\n       * @memberof onnx.TypeProto.Map\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @param {number} [length] Message length if known beforehand\n       * @returns {onnx.TypeProto.Map} Map\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Map.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length,\n          message = new $root.onnx.TypeProto.Map();\n        while (reader.pos < end) {\n          var tag = reader.uint32();\n          switch (tag >>> 3) {\n            case 1: {\n              message.keyType = reader.int32();\n              break;\n            }\n            case 2: {\n              message.valueType = $root.onnx.TypeProto.decode(reader, reader.uint32());\n              break;\n            }\n            default:\n              reader.skipType(tag & 7);\n              break;\n          }\n        }\n        return message;\n      };\n\n      /**\n       * Decodes a Map message from the specified reader or buffer, length delimited.\n       * @function decodeDelimited\n       * @memberof onnx.TypeProto.Map\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @returns {onnx.TypeProto.Map} Map\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Map.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n      };\n\n      /**\n       * Verifies a Map message.\n       * @function verify\n       * @memberof onnx.TypeProto.Map\n       * @static\n       * @param {Object.<string,*>} message Plain object to verify\n       * @returns {string|null} `null` if valid, otherwise the reason why it is not\n       */\n      Map.verify = function verify(message) {\n        if (typeof message !== 'object' || message === null) return 'object expected';\n        if (message.keyType != null && message.hasOwnProperty('keyType'))\n          if (!$util.isInteger(message.keyType)) return 'keyType: integer expected';\n        if (message.valueType != null && message.hasOwnProperty('valueType')) {\n          var error = $root.onnx.TypeProto.verify(message.valueType);\n          if (error) return 'valueType.' + error;\n        }\n        return null;\n      };\n\n      /**\n       * Creates a Map message from a plain object. Also converts values to their respective internal types.\n       * @function fromObject\n       * @memberof onnx.TypeProto.Map\n       * @static\n       * @param {Object.<string,*>} object Plain object\n       * @returns {onnx.TypeProto.Map} Map\n       */\n      Map.fromObject = function fromObject(object) {\n        if (object instanceof $root.onnx.TypeProto.Map) return object;\n        var message = new $root.onnx.TypeProto.Map();\n        if (object.keyType != null) message.keyType = object.keyType | 0;\n        if (object.valueType != null) {\n          if (typeof object.valueType !== 'object') throw TypeError('.onnx.TypeProto.Map.valueType: object expected');\n          message.valueType = $root.onnx.TypeProto.fromObject(object.valueType);\n        }\n        return message;\n      };\n\n      /**\n       * Creates a plain object from a Map message. Also converts values to other types if specified.\n       * @function toObject\n       * @memberof onnx.TypeProto.Map\n       * @static\n       * @param {onnx.TypeProto.Map} message Map\n       * @param {$protobuf.IConversionOptions} [options] Conversion options\n       * @returns {Object.<string,*>} Plain object\n       */\n      Map.toObject = function toObject(message, options) {\n        if (!options) options = {};\n        var object = {};\n        if (options.defaults) {\n          object.keyType = 0;\n          object.valueType = null;\n        }\n        if (message.keyType != null && message.hasOwnProperty('keyType')) object.keyType = message.keyType;\n        if (message.valueType != null && message.hasOwnProperty('valueType'))\n          object.valueType = $root.onnx.TypeProto.toObject(message.valueType, options);\n        return object;\n      };\n\n      /**\n       * Converts this Map to JSON.\n       * @function toJSON\n       * @memberof onnx.TypeProto.Map\n       * @instance\n       * @returns {Object.<string,*>} JSON object\n       */\n      Map.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n      };\n\n      /**\n       * Gets the default type url for Map\n       * @function getTypeUrl\n       * @memberof onnx.TypeProto.Map\n       * @static\n       * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n       * @returns {string} The default type url\n       */\n      Map.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n        if (typeUrlPrefix === undefined) {\n          typeUrlPrefix = 'type.googleapis.com';\n        }\n        return typeUrlPrefix + '/onnx.TypeProto.Map';\n      };\n\n      return Map;\n    })();\n\n    TypeProto.Optional = (function () {\n      /**\n       * Properties of an Optional.\n       * @memberof onnx.TypeProto\n       * @interface IOptional\n       * @property {onnx.ITypeProto|null} [elemType] Optional elemType\n       */\n\n      /**\n       * Constructs a new Optional.\n       * @memberof onnx.TypeProto\n       * @classdesc Represents an Optional.\n       * @implements IOptional\n       * @constructor\n       * @param {onnx.TypeProto.IOptional=} [properties] Properties to set\n       */\n      function Optional(properties) {\n        if (properties)\n          for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n      }\n\n      /**\n       * Optional elemType.\n       * @member {onnx.ITypeProto|null|undefined} elemType\n       * @memberof onnx.TypeProto.Optional\n       * @instance\n       */\n      Optional.prototype.elemType = null;\n\n      /**\n       * Creates a new Optional instance using the specified properties.\n       * @function create\n       * @memberof onnx.TypeProto.Optional\n       * @static\n       * @param {onnx.TypeProto.IOptional=} [properties] Properties to set\n       * @returns {onnx.TypeProto.Optional} Optional instance\n       */\n      Optional.create = function create(properties) {\n        return new Optional(properties);\n      };\n\n      /**\n       * Encodes the specified Optional message. Does not implicitly {@link onnx.TypeProto.Optional.verify|verify} messages.\n       * @function encode\n       * @memberof onnx.TypeProto.Optional\n       * @static\n       * @param {onnx.TypeProto.IOptional} message Optional message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Optional.encode = function encode(message, writer) {\n        if (!writer) writer = $Writer.create();\n        if (message.elemType != null && Object.hasOwnProperty.call(message, 'elemType'))\n          $root.onnx.TypeProto.encode(message.elemType, writer.uint32(/* id 1, wireType 2 =*/ 10).fork()).ldelim();\n        return writer;\n      };\n\n      /**\n       * Encodes the specified Optional message, length delimited. Does not implicitly {@link onnx.TypeProto.Optional.verify|verify} messages.\n       * @function encodeDelimited\n       * @memberof onnx.TypeProto.Optional\n       * @static\n       * @param {onnx.TypeProto.IOptional} message Optional message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      Optional.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n      };\n\n      /**\n       * Decodes an Optional message from the specified reader or buffer.\n       * @function decode\n       * @memberof onnx.TypeProto.Optional\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @param {number} [length] Message length if known beforehand\n       * @returns {onnx.TypeProto.Optional} Optional\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Optional.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length,\n          message = new $root.onnx.TypeProto.Optional();\n        while (reader.pos < end) {\n          var tag = reader.uint32();\n          switch (tag >>> 3) {\n            case 1: {\n              message.elemType = $root.onnx.TypeProto.decode(reader, reader.uint32());\n              break;\n            }\n            default:\n              reader.skipType(tag & 7);\n              break;\n          }\n        }\n        return message;\n      };\n\n      /**\n       * Decodes an Optional message from the specified reader or buffer, length delimited.\n       * @function decodeDelimited\n       * @memberof onnx.TypeProto.Optional\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @returns {onnx.TypeProto.Optional} Optional\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      Optional.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n      };\n\n      /**\n       * Verifies an Optional message.\n       * @function verify\n       * @memberof onnx.TypeProto.Optional\n       * @static\n       * @param {Object.<string,*>} message Plain object to verify\n       * @returns {string|null} `null` if valid, otherwise the reason why it is not\n       */\n      Optional.verify = function verify(message) {\n        if (typeof message !== 'object' || message === null) return 'object expected';\n        if (message.elemType != null && message.hasOwnProperty('elemType')) {\n          var error = $root.onnx.TypeProto.verify(message.elemType);\n          if (error) return 'elemType.' + error;\n        }\n        return null;\n      };\n\n      /**\n       * Creates an Optional message from a plain object. Also converts values to their respective internal types.\n       * @function fromObject\n       * @memberof onnx.TypeProto.Optional\n       * @static\n       * @param {Object.<string,*>} object Plain object\n       * @returns {onnx.TypeProto.Optional} Optional\n       */\n      Optional.fromObject = function fromObject(object) {\n        if (object instanceof $root.onnx.TypeProto.Optional) return object;\n        var message = new $root.onnx.TypeProto.Optional();\n        if (object.elemType != null) {\n          if (typeof object.elemType !== 'object')\n            throw TypeError('.onnx.TypeProto.Optional.elemType: object expected');\n          message.elemType = $root.onnx.TypeProto.fromObject(object.elemType);\n        }\n        return message;\n      };\n\n      /**\n       * Creates a plain object from an Optional message. Also converts values to other types if specified.\n       * @function toObject\n       * @memberof onnx.TypeProto.Optional\n       * @static\n       * @param {onnx.TypeProto.Optional} message Optional\n       * @param {$protobuf.IConversionOptions} [options] Conversion options\n       * @returns {Object.<string,*>} Plain object\n       */\n      Optional.toObject = function toObject(message, options) {\n        if (!options) options = {};\n        var object = {};\n        if (options.defaults) object.elemType = null;\n        if (message.elemType != null && message.hasOwnProperty('elemType'))\n          object.elemType = $root.onnx.TypeProto.toObject(message.elemType, options);\n        return object;\n      };\n\n      /**\n       * Converts this Optional to JSON.\n       * @function toJSON\n       * @memberof onnx.TypeProto.Optional\n       * @instance\n       * @returns {Object.<string,*>} JSON object\n       */\n      Optional.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n      };\n\n      /**\n       * Gets the default type url for Optional\n       * @function getTypeUrl\n       * @memberof onnx.TypeProto.Optional\n       * @static\n       * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n       * @returns {string} The default type url\n       */\n      Optional.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n        if (typeUrlPrefix === undefined) {\n          typeUrlPrefix = 'type.googleapis.com';\n        }\n        return typeUrlPrefix + '/onnx.TypeProto.Optional';\n      };\n\n      return Optional;\n    })();\n\n    TypeProto.SparseTensor = (function () {\n      /**\n       * Properties of a SparseTensor.\n       * @memberof onnx.TypeProto\n       * @interface ISparseTensor\n       * @property {number|null} [elemType] SparseTensor elemType\n       * @property {onnx.ITensorShapeProto|null} [shape] SparseTensor shape\n       */\n\n      /**\n       * Constructs a new SparseTensor.\n       * @memberof onnx.TypeProto\n       * @classdesc Represents a SparseTensor.\n       * @implements ISparseTensor\n       * @constructor\n       * @param {onnx.TypeProto.ISparseTensor=} [properties] Properties to set\n       */\n      function SparseTensor(properties) {\n        if (properties)\n          for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n      }\n\n      /**\n       * SparseTensor elemType.\n       * @member {number} elemType\n       * @memberof onnx.TypeProto.SparseTensor\n       * @instance\n       */\n      SparseTensor.prototype.elemType = 0;\n\n      /**\n       * SparseTensor shape.\n       * @member {onnx.ITensorShapeProto|null|undefined} shape\n       * @memberof onnx.TypeProto.SparseTensor\n       * @instance\n       */\n      SparseTensor.prototype.shape = null;\n\n      /**\n       * Creates a new SparseTensor instance using the specified properties.\n       * @function create\n       * @memberof onnx.TypeProto.SparseTensor\n       * @static\n       * @param {onnx.TypeProto.ISparseTensor=} [properties] Properties to set\n       * @returns {onnx.TypeProto.SparseTensor} SparseTensor instance\n       */\n      SparseTensor.create = function create(properties) {\n        return new SparseTensor(properties);\n      };\n\n      /**\n       * Encodes the specified SparseTensor message. Does not implicitly {@link onnx.TypeProto.SparseTensor.verify|verify} messages.\n       * @function encode\n       * @memberof onnx.TypeProto.SparseTensor\n       * @static\n       * @param {onnx.TypeProto.ISparseTensor} message SparseTensor message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      SparseTensor.encode = function encode(message, writer) {\n        if (!writer) writer = $Writer.create();\n        if (message.elemType != null && Object.hasOwnProperty.call(message, 'elemType'))\n          writer.uint32(/* id 1, wireType 0 =*/ 8).int32(message.elemType);\n        if (message.shape != null && Object.hasOwnProperty.call(message, 'shape'))\n          $root.onnx.TensorShapeProto.encode(message.shape, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();\n        return writer;\n      };\n\n      /**\n       * Encodes the specified SparseTensor message, length delimited. Does not implicitly {@link onnx.TypeProto.SparseTensor.verify|verify} messages.\n       * @function encodeDelimited\n       * @memberof onnx.TypeProto.SparseTensor\n       * @static\n       * @param {onnx.TypeProto.ISparseTensor} message SparseTensor message or plain object to encode\n       * @param {$protobuf.Writer} [writer] Writer to encode to\n       * @returns {$protobuf.Writer} Writer\n       */\n      SparseTensor.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n      };\n\n      /**\n       * Decodes a SparseTensor message from the specified reader or buffer.\n       * @function decode\n       * @memberof onnx.TypeProto.SparseTensor\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @param {number} [length] Message length if known beforehand\n       * @returns {onnx.TypeProto.SparseTensor} SparseTensor\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      SparseTensor.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length,\n          message = new $root.onnx.TypeProto.SparseTensor();\n        while (reader.pos < end) {\n          var tag = reader.uint32();\n          switch (tag >>> 3) {\n            case 1: {\n              message.elemType = reader.int32();\n              break;\n            }\n            case 2: {\n              message.shape = $root.onnx.TensorShapeProto.decode(reader, reader.uint32());\n              break;\n            }\n            default:\n              reader.skipType(tag & 7);\n              break;\n          }\n        }\n        return message;\n      };\n\n      /**\n       * Decodes a SparseTensor message from the specified reader or buffer, length delimited.\n       * @function decodeDelimited\n       * @memberof onnx.TypeProto.SparseTensor\n       * @static\n       * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n       * @returns {onnx.TypeProto.SparseTensor} SparseTensor\n       * @throws {Error} If the payload is not a reader or valid buffer\n       * @throws {$protobuf.util.ProtocolError} If required fields are missing\n       */\n      SparseTensor.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n      };\n\n      /**\n       * Verifies a SparseTensor message.\n       * @function verify\n       * @memberof onnx.TypeProto.SparseTensor\n       * @static\n       * @param {Object.<string,*>} message Plain object to verify\n       * @returns {string|null} `null` if valid, otherwise the reason why it is not\n       */\n      SparseTensor.verify = function verify(message) {\n        if (typeof message !== 'object' || message === null) return 'object expected';\n        if (message.elemType != null && message.hasOwnProperty('elemType'))\n          if (!$util.isInteger(message.elemType)) return 'elemType: integer expected';\n        if (message.shape != null && message.hasOwnProperty('shape')) {\n          var error = $root.onnx.TensorShapeProto.verify(message.shape);\n          if (error) return 'shape.' + error;\n        }\n        return null;\n      };\n\n      /**\n       * Creates a SparseTensor message from a plain object. Also converts values to their respective internal types.\n       * @function fromObject\n       * @memberof onnx.TypeProto.SparseTensor\n       * @static\n       * @param {Object.<string,*>} object Plain object\n       * @returns {onnx.TypeProto.SparseTensor} SparseTensor\n       */\n      SparseTensor.fromObject = function fromObject(object) {\n        if (object instanceof $root.onnx.TypeProto.SparseTensor) return object;\n        var message = new $root.onnx.TypeProto.SparseTensor();\n        if (object.elemType != null) message.elemType = object.elemType | 0;\n        if (object.shape != null) {\n          if (typeof object.shape !== 'object') throw TypeError('.onnx.TypeProto.SparseTensor.shape: object expected');\n          message.shape = $root.onnx.TensorShapeProto.fromObject(object.shape);\n        }\n        return message;\n      };\n\n      /**\n       * Creates a plain object from a SparseTensor message. Also converts values to other types if specified.\n       * @function toObject\n       * @memberof onnx.TypeProto.SparseTensor\n       * @static\n       * @param {onnx.TypeProto.SparseTensor} message SparseTensor\n       * @param {$protobuf.IConversionOptions} [options] Conversion options\n       * @returns {Object.<string,*>} Plain object\n       */\n      SparseTensor.toObject = function toObject(message, options) {\n        if (!options) options = {};\n        var object = {};\n        if (options.defaults) {\n          object.elemType = 0;\n          object.shape = null;\n        }\n        if (message.elemType != null && message.hasOwnProperty('elemType')) object.elemType = message.elemType;\n        if (message.shape != null && message.hasOwnProperty('shape'))\n          object.shape = $root.onnx.TensorShapeProto.toObject(message.shape, options);\n        return object;\n      };\n\n      /**\n       * Converts this SparseTensor to JSON.\n       * @function toJSON\n       * @memberof onnx.TypeProto.SparseTensor\n       * @instance\n       * @returns {Object.<string,*>} JSON object\n       */\n      SparseTensor.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n      };\n\n      /**\n       * Gets the default type url for SparseTensor\n       * @function getTypeUrl\n       * @memberof onnx.TypeProto.SparseTensor\n       * @static\n       * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n       * @returns {string} The default type url\n       */\n      SparseTensor.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n        if (typeUrlPrefix === undefined) {\n          typeUrlPrefix = 'type.googleapis.com';\n        }\n        return typeUrlPrefix + '/onnx.TypeProto.SparseTensor';\n      };\n\n      return SparseTensor;\n    })();\n\n    return TypeProto;\n  })();\n\n  onnx.OperatorSetIdProto = (function () {\n    /**\n     * Properties of an OperatorSetIdProto.\n     * @memberof onnx\n     * @interface IOperatorSetIdProto\n     * @property {string|null} [domain] OperatorSetIdProto domain\n     * @property {number|Long|null} [version] OperatorSetIdProto version\n     */\n\n    /**\n     * Constructs a new OperatorSetIdProto.\n     * @memberof onnx\n     * @classdesc Represents an OperatorSetIdProto.\n     * @implements IOperatorSetIdProto\n     * @constructor\n     * @param {onnx.IOperatorSetIdProto=} [properties] Properties to set\n     */\n    function OperatorSetIdProto(properties) {\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * OperatorSetIdProto domain.\n     * @member {string} domain\n     * @memberof onnx.OperatorSetIdProto\n     * @instance\n     */\n    OperatorSetIdProto.prototype.domain = '';\n\n    /**\n     * OperatorSetIdProto version.\n     * @member {number|Long} version\n     * @memberof onnx.OperatorSetIdProto\n     * @instance\n     */\n    OperatorSetIdProto.prototype.version = $util.Long ? $util.Long.fromBits(0, 0, false) : 0;\n\n    /**\n     * Creates a new OperatorSetIdProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.OperatorSetIdProto\n     * @static\n     * @param {onnx.IOperatorSetIdProto=} [properties] Properties to set\n     * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto instance\n     */\n    OperatorSetIdProto.create = function create(properties) {\n      return new OperatorSetIdProto(properties);\n    };\n\n    /**\n     * Encodes the specified OperatorSetIdProto message. Does not implicitly {@link onnx.OperatorSetIdProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.OperatorSetIdProto\n     * @static\n     * @param {onnx.IOperatorSetIdProto} message OperatorSetIdProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    OperatorSetIdProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.domain != null && Object.hasOwnProperty.call(message, 'domain'))\n        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.domain);\n      if (message.version != null && Object.hasOwnProperty.call(message, 'version'))\n        writer.uint32(/* id 2, wireType 0 =*/ 16).int64(message.version);\n      return writer;\n    };\n\n    /**\n     * Encodes the specified OperatorSetIdProto message, length delimited. Does not implicitly {@link onnx.OperatorSetIdProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.OperatorSetIdProto\n     * @static\n     * @param {onnx.IOperatorSetIdProto} message OperatorSetIdProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    OperatorSetIdProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an OperatorSetIdProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.OperatorSetIdProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    OperatorSetIdProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.OperatorSetIdProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.domain = reader.string();\n            break;\n          }\n          case 2: {\n            message.version = reader.int64();\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes an OperatorSetIdProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.OperatorSetIdProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    OperatorSetIdProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an OperatorSetIdProto message.\n     * @function verify\n     * @memberof onnx.OperatorSetIdProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    OperatorSetIdProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.domain != null && message.hasOwnProperty('domain'))\n        if (!$util.isString(message.domain)) return 'domain: string expected';\n      if (message.version != null && message.hasOwnProperty('version'))\n        if (\n          !$util.isInteger(message.version) &&\n          !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high))\n        )\n          return 'version: integer|Long expected';\n      return null;\n    };\n\n    /**\n     * Creates an OperatorSetIdProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.OperatorSetIdProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto\n     */\n    OperatorSetIdProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.OperatorSetIdProto) return object;\n      var message = new $root.onnx.OperatorSetIdProto();\n      if (object.domain != null) message.domain = String(object.domain);\n      if (object.version != null)\n        if ($util.Long) (message.version = $util.Long.fromValue(object.version)).unsigned = false;\n        else if (typeof object.version === 'string') message.version = parseInt(object.version, 10);\n        else if (typeof object.version === 'number') message.version = object.version;\n        else if (typeof object.version === 'object')\n          message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber();\n      return message;\n    };\n\n    /**\n     * Creates a plain object from an OperatorSetIdProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.OperatorSetIdProto\n     * @static\n     * @param {onnx.OperatorSetIdProto} message OperatorSetIdProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    OperatorSetIdProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.defaults) {\n        object.domain = '';\n        if ($util.Long) {\n          var long = new $util.Long(0, 0, false);\n          object.version =\n            options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n        } else object.version = options.longs === String ? '0' : 0;\n      }\n      if (message.domain != null && message.hasOwnProperty('domain')) object.domain = message.domain;\n      if (message.version != null && message.hasOwnProperty('version'))\n        if (typeof message.version === 'number')\n          object.version = options.longs === String ? String(message.version) : message.version;\n        else\n          object.version =\n            options.longs === String\n              ? $util.Long.prototype.toString.call(message.version)\n              : options.longs === Number\n                ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber()\n                : message.version;\n      return object;\n    };\n\n    /**\n     * Converts this OperatorSetIdProto to JSON.\n     * @function toJSON\n     * @memberof onnx.OperatorSetIdProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    OperatorSetIdProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for OperatorSetIdProto\n     * @function getTypeUrl\n     * @memberof onnx.OperatorSetIdProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    OperatorSetIdProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.OperatorSetIdProto';\n    };\n\n    return OperatorSetIdProto;\n  })();\n\n  /**\n   * OperatorStatus enum.\n   * @name onnx.OperatorStatus\n   * @enum {number}\n   * @property {number} EXPERIMENTAL=0 EXPERIMENTAL value\n   * @property {number} STABLE=1 STABLE value\n   */\n  onnx.OperatorStatus = (function () {\n    var valuesById = {},\n      values = Object.create(valuesById);\n    values[(valuesById[0] = 'EXPERIMENTAL')] = 0;\n    values[(valuesById[1] = 'STABLE')] = 1;\n    return values;\n  })();\n\n  onnx.FunctionProto = (function () {\n    /**\n     * Properties of a FunctionProto.\n     * @memberof onnx\n     * @interface IFunctionProto\n     * @property {string|null} [name] FunctionProto name\n     * @property {Array.<string>|null} [input] FunctionProto input\n     * @property {Array.<string>|null} [output] FunctionProto output\n     * @property {Array.<string>|null} [attribute] FunctionProto attribute\n     * @property {Array.<onnx.IAttributeProto>|null} [attributeProto] FunctionProto attributeProto\n     * @property {Array.<onnx.INodeProto>|null} [node] FunctionProto node\n     * @property {string|null} [docString] FunctionProto docString\n     * @property {Array.<onnx.IOperatorSetIdProto>|null} [opsetImport] FunctionProto opsetImport\n     * @property {string|null} [domain] FunctionProto domain\n     */\n\n    /**\n     * Constructs a new FunctionProto.\n     * @memberof onnx\n     * @classdesc Represents a FunctionProto.\n     * @implements IFunctionProto\n     * @constructor\n     * @param {onnx.IFunctionProto=} [properties] Properties to set\n     */\n    function FunctionProto(properties) {\n      this.input = [];\n      this.output = [];\n      this.attribute = [];\n      this.attributeProto = [];\n      this.node = [];\n      this.opsetImport = [];\n      if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n          if (properties[keys[i]] != null) this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * FunctionProto name.\n     * @member {string} name\n     * @memberof onnx.FunctionProto\n     * @instance\n     */\n    FunctionProto.prototype.name = '';\n\n    /**\n     * FunctionProto input.\n     * @member {Array.<string>} input\n     * @memberof onnx.FunctionProto\n     * @instance\n     */\n    FunctionProto.prototype.input = $util.emptyArray;\n\n    /**\n     * FunctionProto output.\n     * @member {Array.<string>} output\n     * @memberof onnx.FunctionProto\n     * @instance\n     */\n    FunctionProto.prototype.output = $util.emptyArray;\n\n    /**\n     * FunctionProto attribute.\n     * @member {Array.<string>} attribute\n     * @memberof onnx.FunctionProto\n     * @instance\n     */\n    FunctionProto.prototype.attribute = $util.emptyArray;\n\n    /**\n     * FunctionProto attributeProto.\n     * @member {Array.<onnx.IAttributeProto>} attributeProto\n     * @memberof onnx.FunctionProto\n     * @instance\n     */\n    FunctionProto.prototype.attributeProto = $util.emptyArray;\n\n    /**\n     * FunctionProto node.\n     * @member {Array.<onnx.INodeProto>} node\n     * @memberof onnx.FunctionProto\n     * @instance\n     */\n    FunctionProto.prototype.node = $util.emptyArray;\n\n    /**\n     * FunctionProto docString.\n     * @member {string} docString\n     * @memberof onnx.FunctionProto\n     * @instance\n     */\n    FunctionProto.prototype.docString = '';\n\n    /**\n     * FunctionProto opsetImport.\n     * @member {Array.<onnx.IOperatorSetIdProto>} opsetImport\n     * @memberof onnx.FunctionProto\n     * @instance\n     */\n    FunctionProto.prototype.opsetImport = $util.emptyArray;\n\n    /**\n     * FunctionProto domain.\n     * @member {string} domain\n     * @memberof onnx.FunctionProto\n     * @instance\n     */\n    FunctionProto.prototype.domain = '';\n\n    /**\n     * Creates a new FunctionProto instance using the specified properties.\n     * @function create\n     * @memberof onnx.FunctionProto\n     * @static\n     * @param {onnx.IFunctionProto=} [properties] Properties to set\n     * @returns {onnx.FunctionProto} FunctionProto instance\n     */\n    FunctionProto.create = function create(properties) {\n      return new FunctionProto(properties);\n    };\n\n    /**\n     * Encodes the specified FunctionProto message. Does not implicitly {@link onnx.FunctionProto.verify|verify} messages.\n     * @function encode\n     * @memberof onnx.FunctionProto\n     * @static\n     * @param {onnx.IFunctionProto} message FunctionProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    FunctionProto.encode = function encode(message, writer) {\n      if (!writer) writer = $Writer.create();\n      if (message.name != null && Object.hasOwnProperty.call(message, 'name'))\n        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.name);\n      if (message.input != null && message.input.length)\n        for (var i = 0; i < message.input.length; ++i)\n          writer.uint32(/* id 4, wireType 2 =*/ 34).string(message.input[i]);\n      if (message.output != null && message.output.length)\n        for (var i = 0; i < message.output.length; ++i)\n          writer.uint32(/* id 5, wireType 2 =*/ 42).string(message.output[i]);\n      if (message.attribute != null && message.attribute.length)\n        for (var i = 0; i < message.attribute.length; ++i)\n          writer.uint32(/* id 6, wireType 2 =*/ 50).string(message.attribute[i]);\n      if (message.node != null && message.node.length)\n        for (var i = 0; i < message.node.length; ++i)\n          $root.onnx.NodeProto.encode(message.node[i], writer.uint32(/* id 7, wireType 2 =*/ 58).fork()).ldelim();\n      if (message.docString != null && Object.hasOwnProperty.call(message, 'docString'))\n        writer.uint32(/* id 8, wireType 2 =*/ 66).string(message.docString);\n      if (message.opsetImport != null && message.opsetImport.length)\n        for (var i = 0; i < message.opsetImport.length; ++i)\n          $root.onnx.OperatorSetIdProto.encode(\n            message.opsetImport[i],\n            writer.uint32(/* id 9, wireType 2 =*/ 74).fork(),\n          ).ldelim();\n      if (message.domain != null && Object.hasOwnProperty.call(message, 'domain'))\n        writer.uint32(/* id 10, wireType 2 =*/ 82).string(message.domain);\n      if (message.attributeProto != null && message.attributeProto.length)\n        for (var i = 0; i < message.attributeProto.length; ++i)\n          $root.onnx.AttributeProto.encode(\n            message.attributeProto[i],\n            writer.uint32(/* id 11, wireType 2 =*/ 90).fork(),\n          ).ldelim();\n      return writer;\n    };\n\n    /**\n     * Encodes the specified FunctionProto message, length delimited. Does not implicitly {@link onnx.FunctionProto.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof onnx.FunctionProto\n     * @static\n     * @param {onnx.IFunctionProto} message FunctionProto message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    FunctionProto.encodeDelimited = function encodeDelimited(message, writer) {\n      return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a FunctionProto message from the specified reader or buffer.\n     * @function decode\n     * @memberof onnx.FunctionProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {onnx.FunctionProto} FunctionProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    FunctionProto.decode = function decode(reader, length) {\n      if (!(reader instanceof $Reader)) reader = $Reader.create(reader);\n      var end = length === undefined ? reader.len : reader.pos + length,\n        message = new $root.onnx.FunctionProto();\n      while (reader.pos < end) {\n        var tag = reader.uint32();\n        switch (tag >>> 3) {\n          case 1: {\n            message.name = reader.string();\n            break;\n          }\n          case 4: {\n            if (!(message.input && message.input.length)) message.input = [];\n            message.input.push(reader.string());\n            break;\n          }\n          case 5: {\n            if (!(message.output && message.output.length)) message.output = [];\n            message.output.push(reader.string());\n            break;\n          }\n          case 6: {\n            if (!(message.attribute && message.attribute.length)) message.attribute = [];\n            message.attribute.push(reader.string());\n            break;\n          }\n          case 11: {\n            if (!(message.attributeProto && message.attributeProto.length)) message.attributeProto = [];\n            message.attributeProto.push($root.onnx.AttributeProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 7: {\n            if (!(message.node && message.node.length)) message.node = [];\n            message.node.push($root.onnx.NodeProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 8: {\n            message.docString = reader.string();\n            break;\n          }\n          case 9: {\n            if (!(message.opsetImport && message.opsetImport.length)) message.opsetImport = [];\n            message.opsetImport.push($root.onnx.OperatorSetIdProto.decode(reader, reader.uint32()));\n            break;\n          }\n          case 10: {\n            message.domain = reader.string();\n            break;\n          }\n          default:\n            reader.skipType(tag & 7);\n            break;\n        }\n      }\n      return message;\n    };\n\n    /**\n     * Decodes a FunctionProto message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof onnx.FunctionProto\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {onnx.FunctionProto} FunctionProto\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    FunctionProto.decodeDelimited = function decodeDelimited(reader) {\n      if (!(reader instanceof $Reader)) reader = new $Reader(reader);\n      return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a FunctionProto message.\n     * @function verify\n     * @memberof onnx.FunctionProto\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    FunctionProto.verify = function verify(message) {\n      if (typeof message !== 'object' || message === null) return 'object expected';\n      if (message.name != null && message.hasOwnProperty('name'))\n        if (!$util.isString(message.name)) return 'name: string expected';\n      if (message.input != null && message.hasOwnProperty('input')) {\n        if (!Array.isArray(message.input)) return 'input: array expected';\n        for (var i = 0; i < message.input.length; ++i)\n          if (!$util.isString(message.input[i])) return 'input: string[] expected';\n      }\n      if (message.output != null && message.hasOwnProperty('output')) {\n        if (!Array.isArray(message.output)) return 'output: array expected';\n        for (var i = 0; i < message.output.length; ++i)\n          if (!$util.isString(message.output[i])) return 'output: string[] expected';\n      }\n      if (message.attribute != null && message.hasOwnProperty('attribute')) {\n        if (!Array.isArray(message.attribute)) return 'attribute: array expected';\n        for (var i = 0; i < message.attribute.length; ++i)\n          if (!$util.isString(message.attribute[i])) return 'attribute: string[] expected';\n      }\n      if (message.attributeProto != null && message.hasOwnProperty('attributeProto')) {\n        if (!Array.isArray(message.attributeProto)) return 'attributeProto: array expected';\n        for (var i = 0; i < message.attributeProto.length; ++i) {\n          var error = $root.onnx.AttributeProto.verify(message.attributeProto[i]);\n          if (error) return 'attributeProto.' + error;\n        }\n      }\n      if (message.node != null && message.hasOwnProperty('node')) {\n        if (!Array.isArray(message.node)) return 'node: array expected';\n        for (var i = 0; i < message.node.length; ++i) {\n          var error = $root.onnx.NodeProto.verify(message.node[i]);\n          if (error) return 'node.' + error;\n        }\n      }\n      if (message.docString != null && message.hasOwnProperty('docString'))\n        if (!$util.isString(message.docString)) return 'docString: string expected';\n      if (message.opsetImport != null && message.hasOwnProperty('opsetImport')) {\n        if (!Array.isArray(message.opsetImport)) return 'opsetImport: array expected';\n        for (var i = 0; i < message.opsetImport.length; ++i) {\n          var error = $root.onnx.OperatorSetIdProto.verify(message.opsetImport[i]);\n          if (error) return 'opsetImport.' + error;\n        }\n      }\n      if (message.domain != null && message.hasOwnProperty('domain'))\n        if (!$util.isString(message.domain)) return 'domain: string expected';\n      return null;\n    };\n\n    /**\n     * Creates a FunctionProto message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof onnx.FunctionProto\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {onnx.FunctionProto} FunctionProto\n     */\n    FunctionProto.fromObject = function fromObject(object) {\n      if (object instanceof $root.onnx.FunctionProto) return object;\n      var message = new $root.onnx.FunctionProto();\n      if (object.name != null) message.name = String(object.name);\n      if (object.input) {\n        if (!Array.isArray(object.input)) throw TypeError('.onnx.FunctionProto.input: array expected');\n        message.input = [];\n        for (var i = 0; i < object.input.length; ++i) message.input[i] = String(object.input[i]);\n      }\n      if (object.output) {\n        if (!Array.isArray(object.output)) throw TypeError('.onnx.FunctionProto.output: array expected');\n        message.output = [];\n        for (var i = 0; i < object.output.length; ++i) message.output[i] = String(object.output[i]);\n      }\n      if (object.attribute) {\n        if (!Array.isArray(object.attribute)) throw TypeError('.onnx.FunctionProto.attribute: array expected');\n        message.attribute = [];\n        for (var i = 0; i < object.attribute.length; ++i) message.attribute[i] = String(object.attribute[i]);\n      }\n      if (object.attributeProto) {\n        if (!Array.isArray(object.attributeProto))\n          throw TypeError('.onnx.FunctionProto.attributeProto: array expected');\n        message.attributeProto = [];\n        for (var i = 0; i < object.attributeProto.length; ++i) {\n          if (typeof object.attributeProto[i] !== 'object')\n            throw TypeError('.onnx.FunctionProto.attributeProto: object expected');\n          message.attributeProto[i] = $root.onnx.AttributeProto.fromObject(object.attributeProto[i]);\n        }\n      }\n      if (object.node) {\n        if (!Array.isArray(object.node)) throw TypeError('.onnx.FunctionProto.node: array expected');\n        message.node = [];\n        for (var i = 0; i < object.node.length; ++i) {\n          if (typeof object.node[i] !== 'object') throw TypeError('.onnx.FunctionProto.node: object expected');\n          message.node[i] = $root.onnx.NodeProto.fromObject(object.node[i]);\n        }\n      }\n      if (object.docString != null) message.docString = String(object.docString);\n      if (object.opsetImport) {\n        if (!Array.isArray(object.opsetImport)) throw TypeError('.onnx.FunctionProto.opsetImport: array expected');\n        message.opsetImport = [];\n        for (var i = 0; i < object.opsetImport.length; ++i) {\n          if (typeof object.opsetImport[i] !== 'object')\n            throw TypeError('.onnx.FunctionProto.opsetImport: object expected');\n          message.opsetImport[i] = $root.onnx.OperatorSetIdProto.fromObject(object.opsetImport[i]);\n        }\n      }\n      if (object.domain != null) message.domain = String(object.domain);\n      return message;\n    };\n\n    /**\n     * Creates a plain object from a FunctionProto message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof onnx.FunctionProto\n     * @static\n     * @param {onnx.FunctionProto} message FunctionProto\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    FunctionProto.toObject = function toObject(message, options) {\n      if (!options) options = {};\n      var object = {};\n      if (options.arrays || options.defaults) {\n        object.input = [];\n        object.output = [];\n        object.attribute = [];\n        object.node = [];\n        object.opsetImport = [];\n        object.attributeProto = [];\n      }\n      if (options.defaults) {\n        object.name = '';\n        object.docString = '';\n        object.domain = '';\n      }\n      if (message.name != null && message.hasOwnProperty('name')) object.name = message.name;\n      if (message.input && message.input.length) {\n        object.input = [];\n        for (var j = 0; j < message.input.length; ++j) object.input[j] = message.input[j];\n      }\n      if (message.output && message.output.length) {\n        object.output = [];\n        for (var j = 0; j < message.output.length; ++j) object.output[j] = message.output[j];\n      }\n      if (message.attribute && message.attribute.length) {\n        object.attribute = [];\n        for (var j = 0; j < message.attribute.length; ++j) object.attribute[j] = message.attribute[j];\n      }\n      if (message.node && message.node.length) {\n        object.node = [];\n        for (var j = 0; j < message.node.length; ++j)\n          object.node[j] = $root.onnx.NodeProto.toObject(message.node[j], options);\n      }\n      if (message.docString != null && message.hasOwnProperty('docString')) object.docString = message.docString;\n      if (message.opsetImport && message.opsetImport.length) {\n        object.opsetImport = [];\n        for (var j = 0; j < message.opsetImport.length; ++j)\n          object.opsetImport[j] = $root.onnx.OperatorSetIdProto.toObject(message.opsetImport[j], options);\n      }\n      if (message.domain != null && message.hasOwnProperty('domain')) object.domain = message.domain;\n      if (message.attributeProto && message.attributeProto.length) {\n        object.attributeProto = [];\n        for (var j = 0; j < message.attributeProto.length; ++j)\n          object.attributeProto[j] = $root.onnx.AttributeProto.toObject(message.attributeProto[j], options);\n      }\n      return object;\n    };\n\n    /**\n     * Converts this FunctionProto to JSON.\n     * @function toJSON\n     * @memberof onnx.FunctionProto\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    FunctionProto.prototype.toJSON = function toJSON() {\n      return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * Gets the default type url for FunctionProto\n     * @function getTypeUrl\n     * @memberof onnx.FunctionProto\n     * @static\n     * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n     * @returns {string} The default type url\n     */\n    FunctionProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n      if (typeUrlPrefix === undefined) {\n        typeUrlPrefix = 'type.googleapis.com';\n      }\n      return typeUrlPrefix + '/onnx.FunctionProto';\n    };\n\n    return FunctionProto;\n  })();\n\n  return onnx;\n})();\n\nmodule.exports = $root;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { flatbuffers } from 'flatbuffers';\nimport Long from 'long';\n\nimport { Graph } from './graph';\nimport { onnxruntime } from './ort-schema/flatbuffers/ort-generated';\nimport { onnx } from './ort-schema/protobuf/onnx';\nimport { Tensor } from './tensor';\n\n// check the inputs shape before running an OP.\n// return true when the inputs pass the check\n// return false when the inputs do not fit the requirement\n// throw exception when fatal error or not implemented\nexport function checkInputsShape(inputs: Tensor[], ...expectedDimensions: number[]): boolean {\n  if (!inputs || inputs.length !== expectedDimensions.length) {\n    return false;\n  }\n  for (let i = 0; i < inputs.length; i++) {\n    if (!inputs[i].dims || inputs[i].dims.length !== expectedDimensions[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\n// Evaluates the given expression and asserts error message if condition is unmet.\nexport function assert(expr: boolean, msg: () => string) {\n  if (!expr) {\n    throw new Error(typeof msg === 'string' ? msg : msg());\n  }\n}\n\nexport class ArrayUtil {\n  /**\n   * Verifies if 2 input arrays contain the same elements.\n   * @param n1 Array 1\n   * @param n2 Array 2\n   * @returns Whether these 2 are equal\n   */\n  static arraysEqual(\n    n1:\n      | readonly number[]\n      | Int8Array\n      | Uint8Array\n      | Int16Array\n      | Uint16Array\n      | Int32Array\n      | Uint32Array\n      | Uint8ClampedArray\n      | Float32Array\n      | Float64Array,\n    n2:\n      | readonly number[]\n      | Int8Array\n      | Uint8Array\n      | Int16Array\n      | Uint16Array\n      | Int32Array\n      | Uint32Array\n      | Uint8ClampedArray\n      | Float32Array\n      | Float64Array,\n  ) {\n    if (n1.length !== n2.length) {\n      return false;\n    }\n    for (let i = 0; i < n1.length; i++) {\n      if (n1[i] !== n2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\nexport class MatMulUtil {\n  /**\n   * Fix the input shapes for MatMul operation if they need fixing\n   * @param dimsA The shape of tensor A. Should be an array of positive integers\n   * @param dimsB The shape of tensor B. Should be an array of positive integers\n   * @returns A tuple containing the preprocessed input shapes as required by ONNX specifications\n   */\n  static preprocessInputShapes(\n    dimsA: readonly number[],\n    dimsB: readonly number[],\n  ): [readonly number[], readonly number[]] {\n    // If the first argument is 1-D, it is promoted to a matrix by prepending\n    // a 1 to its dimensions. After matrix multiplication the prepended 1 is\n    // removed.\n    const a = dimsA.length === 1 ? [1, dimsA[0]] : dimsA;\n\n    // If the second argument is 1-D, it is promoted to a matrix by appending\n    // a 1 to its dimensions. After matrix multiplication the appended 1 is\n    // removed.\n    const b = dimsB.length === 1 ? [dimsB[0], 1] : dimsB;\n\n    return [a, b];\n  }\n\n  /**\n   * Fix the output shape computed for MatMul operation if it needs fixing\n   * @param outputShape The computed outputShape. Should be an array (atleast of length 2) of positive integers.\n   * This will be mutated.\n   * @param aRank The rank of tensor A.\n   * @param bRank The rank of tensor B.\n   */\n  static postprocessOutputShape(outputShape: number[], aRank: number, bRank: number) {\n    // Remove prepended dimension if first input is 1d\n    if (aRank === 1) {\n      // outputShape = outputShape.slice(0, outputShape.length - 2).concat(outputShape.slice(outputShape.length - 1));\n      outputShape.splice(outputShape.length - 2, 1);\n    }\n    // Remove appended dimension if second input is 1d\n    if (bRank === 1) {\n      outputShape.pop();\n    }\n  }\n\n  /**\n   * Calculate the expected shape when matrix multiplication\n   * @param a The shape of tensor A. Should be a tuple of 2 positive integers\n   * @param b The shape of tensor B. Should be a tuple of 2 positive integers\n   * @returns The expected shape of the result, or undefined if N/A\n   */\n  static calcMatMulShape(a: [number, number], b: [number, number]): [number, number] | undefined {\n    return a[1] !== b[0] ? undefined : [a[0], b[1]];\n  }\n}\n\nexport class BroadcastUtil {\n  /**\n   * Calculate the expected shape when broadcasting 2 tensors\n   * @param a The shape of tensor A. Should be an array of positive integers\n   * @param b The shape of tensor B. Should be an array of positive integers\n   * @param isMatMul Whether the operation is MatMul\n   * @returns The expected shape of the result, or undefined if N/A\n   */\n  static calcShape(\n    adims: readonly number[],\n    bdims: readonly number[],\n    isMatMul = false,\n  ): readonly number[] | undefined {\n    const arank = adims.length;\n    const brank = bdims.length;\n    if (arank === 0) {\n      return bdims;\n    }\n    if (brank === 0) {\n      return adims;\n    }\n    const crank = Math.max(adims.length, bdims.length);\n    const cdims = new Array<number>(crank);\n\n    // calculate the last 2 dimension if it is MatMul\n    if (isMatMul) {\n      if (arank < 2 || brank < 2) {\n        return undefined;\n      }\n      const cShapeMatMul = MatMulUtil.calcMatMulShape(\n        [adims[arank - 2], adims[arank - 1]],\n        [bdims[brank - 2], bdims[brank - 1]],\n      );\n      if (cShapeMatMul === undefined) {\n        return undefined;\n      }\n      [cdims[crank - 2], cdims[crank - 1]] = cShapeMatMul;\n    }\n\n    for (let i = isMatMul ? 3 : 1; i <= crank; i++) {\n      const aLen = arank - i < 0 ? 1 : adims[arank - i];\n      const bLen = brank - i < 0 ? 1 : bdims[brank - i];\n\n      if (aLen !== bLen && aLen > 1 && bLen > 1) {\n        return undefined;\n      }\n      cdims[crank - i] = Math.max(aLen, bLen);\n    }\n\n    return cdims;\n  }\n\n  /**\n   * Given the indices of a broadcasted tensor, calculate the original indices\n   * @param broadcastedIndices The given indices of the broadcasted tensor.\n   * @param originalShape The original shape of the tensor before broadcas\n   * @returns The calculated indices that maps to the original tensor.\n   */\n  static index(broadcastedIndices: readonly number[], originalShape: readonly number[]): number[] {\n    // NOTE 1: we assume the parameter broadcastedIndices is valid. ie. it should have the same\n    // length as the broadcasted shape, and for each dimension the index should\n    // not be out of range.\n    const originalIndices = new Array(originalShape.length);\n    BroadcastUtil.fillIndex(broadcastedIndices, originalShape, originalIndices);\n    return originalIndices;\n  }\n\n  /**\n   * Given the indices of a broadcasted tensor, calculate the original indices\n   * @param broadcastedIndices The given indices of the broadcasted tensor.\n   * @param originalShape The original shape of the tensor before broadcast\n   * @param originalIndices The mapping of broadcastedIndices to the originalIndices (output parameter - will be\n   *     mutated).\n   */\n  static fillIndex(broadcastedIndices: readonly number[], originalShape: readonly number[], originalIndices: number[]) {\n    // NOTE 1: we assume the parameter broadcastedIndices is valid. ie. it should have the same length as the\n    // broadcasted shape, and for each dimension the index should not be out of range.\n    // NOTE 2: we assume the parameter originalIndices has the same length as the originalShape\n    const dimOffset = broadcastedIndices.length - originalShape.length;\n    for (let i = 0; i < originalShape.length; i++) {\n      originalIndices[i] = broadcastedIndices[dimOffset + i] % originalShape[i];\n    }\n  }\n\n  /**\n   * Perform the broadcasting operation on the specific operator\n   * @param a The input tensor A\n   * @param b The input tensor B\n   * @param op The operator lambda function\n   * @param inplace Whether to write the result back to A.\n   * @returns The result tensor, or undefined if input not broadcastable.\n   */\n  static calc(\n    a: Tensor,\n    b: Tensor,\n    op: (a: string | number, b: string | number) => string | number,\n    inplace: boolean,\n    resultType?: Tensor.DataType,\n  ): Tensor | undefined {\n    const outputShape = BroadcastUtil.calcShape(a.dims, b.dims);\n\n    if (outputShape) {\n      if (inplace && !ShapeUtil.areEqual(outputShape, a.dims)) {\n        // B is not broadcastable to A, failed to calculate inplace.\n        return undefined;\n      }\n\n      const size = ShapeUtil.size(outputShape);\n      const c = inplace ? a : new Tensor(outputShape, resultType || a.type);\n\n      // both inputs are scalars\n      if (outputShape.length === 0) {\n        c.set([], op(a.get([]) as number, b.get([]) as number));\n      }\n\n      // atleast one input is a non-scalar\n      else {\n        const outputIndices = new Array<number>(outputShape.length);\n        const originalIndicesA = new Array(a.dims.length);\n        const originalIndicesB = new Array(b.dims.length);\n        let valA: string | number = 0;\n        let valB: string | number = 0;\n        let isAScalar = false;\n        let isBScalar = false;\n        if (a.dims.length === 0) {\n          valA = a.get([]) as number;\n          isAScalar = true;\n        }\n        if (b.dims.length === 0) {\n          valB = b.get([]) as number;\n          isBScalar = true;\n        }\n        let rest: number;\n        for (let i = 0; i < size; i++) {\n          // traversal indices\n          rest = i;\n          for (let j = outputShape.length - 1; j >= 0; j--) {\n            outputIndices[j] = rest % outputShape[j];\n            rest = Math.floor(rest / outputShape[j]);\n          }\n\n          if (!isAScalar) {\n            // map outputIndices (which is actually broadcasted) to the originalIndices\n            BroadcastUtil.fillIndex(outputIndices, a.dims, originalIndicesA);\n            valA = a.get(originalIndicesA) as number;\n          }\n          if (!isBScalar) {\n            BroadcastUtil.fillIndex(outputIndices, b.dims, originalIndicesB);\n            valB = b.get(originalIndicesB) as number;\n          }\n\n          c.set(outputIndices, op(valA, valB));\n        }\n      }\n\n      return c;\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Determine if a shape is unidirectional broadcastable to another shape\n   * @param shape The input shape\n   * @param finalShape The desired shape after broadcasting\n   */\n  static isValidBroadcast(shape: readonly number[], finalShape: readonly number[]): boolean {\n    // align shape to the right\n    const inputRank = shape.length;\n    const finalRank = finalShape.length;\n    if (inputRank > finalRank) {\n      return false;\n    }\n    for (let i = 1; i <= inputRank; i++) {\n      if (shape[inputRank - i] !== 1 && shape[inputRank - i] !== finalShape[finalRank - i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Determine the broadcasted dims in input shape based on the given output shape.\n   * Note that this function only returns the broadcasted dims.\n   * @param inputShape The input shape\n   * @param outputShape The output shape\n   * @returns The broadcasted dims in input shape.\n   */\n  static getBroadcastDims(inputShape: readonly number[], outputShape: readonly number[]): number[] {\n    const inRank = inputShape.length;\n    const dims: number[] = [];\n    for (let i = 0; i < inRank; i++) {\n      const dim = inRank - 1 - i;\n      const a = inputShape[dim] || 1;\n      const b = outputShape[outputShape.length - 1 - i] || 1;\n      if (b > 1 && a === 1) {\n        dims.unshift(dim);\n      }\n    }\n    return dims;\n  }\n}\n\n// copy array helper\n// mimics memcpy as much as possible\nexport function arrayCopyHelper(\n  target: number[] | Tensor.NumberType,\n  source: number[] | Tensor.NumberType,\n  targetIndex: number,\n  sourceIndex: number,\n  blockSize: number,\n) {\n  if (sourceIndex < 0 || sourceIndex >= source.length) {\n    throw new Error('sourceIndex out of bounds');\n  }\n  if (targetIndex < 0 || targetIndex >= target.length) {\n    throw new Error('targetIndex out of bounds');\n  }\n  if (sourceIndex + blockSize > source.length) {\n    throw new Error('source indices to be copied are outside bounds');\n  }\n  if (targetIndex + blockSize > target.length) {\n    throw new Error('target array is too small to hold result');\n  }\n\n  for (let offset = 0; offset < blockSize; offset++) {\n    target[targetIndex + offset] = source[sourceIndex + offset];\n  }\n}\n\nexport class GemmUtil {\n  // will make sure input shapes are compatible for this op\n  // and return back the shape of the output in the form of a tuple\n  // will throw exception if the input shapes are not compatible\n  static getShapeOfGemmResult(\n    leftShape: readonly number[],\n    transLeft: boolean,\n    rightShape: readonly number[],\n    transRight: boolean,\n    biasShape?: readonly number[],\n  ): readonly number[] {\n    if (leftShape.length !== 2 || rightShape.length !== 2) {\n      throw new Error('shape need to be of size 2');\n    }\n\n    let M: number;\n    let K: number;\n    let N: number;\n\n    if (transLeft) {\n      M = leftShape[1];\n      K = leftShape[0];\n    } else {\n      M = leftShape[0];\n      K = leftShape[1];\n    }\n\n    let kDim = -1;\n\n    if (transRight) {\n      N = rightShape[0];\n      kDim = 1;\n    } else {\n      N = rightShape[1];\n      kDim = 0;\n    }\n\n    if (rightShape[kDim] !== K) {\n      throw new Error('dimension mismatch');\n    }\n\n    if (M <= 0 || N <= 0 || K <= 0) {\n      throw new Error('invalid shape specified');\n    }\n\n    if (biasShape && !BroadcastUtil.isValidBroadcast(biasShape, [M, N])) {\n      throw new Error('gemm: invalid bias shape for broadcast');\n    }\n\n    return [M, N, K];\n  }\n}\n\nexport class ProtoUtil {\n  static tensorDataTypeFromProto(\n    typeProto: onnx.TensorProto.DataType | onnxruntime.experimental.fbs.TensorDataType,\n  ): Tensor.DataType {\n    switch (typeProto) {\n      case onnx.TensorProto.DataType.INT8:\n        return 'int8';\n      case onnx.TensorProto.DataType.UINT8:\n        return 'uint8';\n      case onnx.TensorProto.DataType.BOOL:\n        return 'bool';\n      case onnx.TensorProto.DataType.INT16:\n        return 'int16';\n      case onnx.TensorProto.DataType.UINT16:\n        return 'uint16';\n      case onnx.TensorProto.DataType.INT32:\n        return 'int32';\n      case onnx.TensorProto.DataType.UINT32:\n        return 'uint32';\n      case onnx.TensorProto.DataType.FLOAT:\n        return 'float32';\n      case onnx.TensorProto.DataType.DOUBLE:\n        return 'float64';\n      case onnx.TensorProto.DataType.STRING:\n        return 'string';\n\n      // For INT64/UINT64, reduce their value to 32-bits.\n      // Should throw exception when overflow\n      case onnx.TensorProto.DataType.INT64:\n        return 'int32';\n      case onnx.TensorProto.DataType.UINT64:\n        return 'uint32';\n\n      default:\n        throw new Error(`unsupported data type: ${onnx.TensorProto.DataType[typeProto]}`);\n    }\n  }\n\n  static tensorDataTypeStringToEnum(type: string): onnx.TensorProto.DataType {\n    switch (type) {\n      case 'int8':\n        return onnx.TensorProto.DataType.INT8;\n      case 'uint8':\n        return onnx.TensorProto.DataType.UINT8;\n      case 'bool':\n        return onnx.TensorProto.DataType.BOOL;\n      case 'int16':\n        return onnx.TensorProto.DataType.INT16;\n      case 'uint16':\n        return onnx.TensorProto.DataType.UINT16;\n      case 'int32':\n        return onnx.TensorProto.DataType.INT32;\n      case 'uint32':\n        return onnx.TensorProto.DataType.UINT32;\n      case 'float32':\n        return onnx.TensorProto.DataType.FLOAT;\n      case 'float64':\n        return onnx.TensorProto.DataType.DOUBLE;\n      case 'string':\n        return onnx.TensorProto.DataType.STRING;\n      case 'int64':\n        return onnx.TensorProto.DataType.INT64;\n      case 'uint64':\n        return onnx.TensorProto.DataType.UINT64;\n\n      default:\n        throw new Error(`unsupported data type: ${type}`);\n    }\n  }\n\n  static tensorDimsFromProto(dims: Array<number | Long>): number[] {\n    // get rid of Long type for dims\n    return dims.map((d) => (Long.isLong(d) ? d.toNumber() : d));\n  }\n\n  static tensorValueTypeFromProto(valueType: onnx.TypeProto.ITensor): Graph.ValueType {\n    return {\n      tensorType: ProtoUtil.tensorDataTypeFromProto(valueType.elemType!),\n      shape: { dims: ProtoUtil.tensorDimsFromProto(valueType.shape!.dim!.map((d) => d.dimValue!)) },\n    };\n  }\n\n  static tensorDimsFromORTFormat(tensor: onnxruntime.experimental.fbs.Tensor) {\n    const dims = [];\n    for (let i = 0; i < tensor.dimsLength(); i++) {\n      dims.push(LongUtil.longToNumber(tensor.dims(i)!));\n    }\n    return dims;\n  }\n\n  static tensorAttributesFromORTFormat(node: onnxruntime.experimental.fbs.Node) {\n    const attributes = [];\n    for (let i = 0; i < node.attributesLength(); i++) {\n      attributes.push(node.attributes(i)!);\n    }\n    return attributes;\n  }\n}\n\nexport class LongUtil {\n  // This function is called to get a number from long type of data for attribute, dim, and ir version,\n  // which values are signed integers.\n  // To make it more generic, add an optional parameter to convert to a unsigned number.\n  static longToNumber(n: Long | flatbuffers.Long | number, unsigned?: boolean) {\n    if (Long.isLong(n)) {\n      return n.toNumber();\n    } else if (n instanceof flatbuffers.Long) {\n      return Long.fromValue({ low: n.low, high: n.high, unsigned: unsigned ?? false }).toNumber();\n    }\n    return n;\n  }\n  static isLong(n: unknown) {\n    return Long.isLong(n) || n instanceof flatbuffers.Long;\n  }\n}\n\nexport class ShapeUtil {\n  static size(dims: readonly number[]): number {\n    return ShapeUtil.getSizeFromDimensionRange(dims, 0, dims.length);\n  }\n\n  // `axis` inclusive\n  static sizeFromDimension(dims: readonly number[], axis: number): number {\n    if (axis < 0 || axis > dims.length) {\n      throw new Error(`invalid dimension of ${axis} for sizeFromDimension as Tensor has ${dims.length} dimensions.`);\n    }\n    return ShapeUtil.getSizeFromDimensionRange(dims, axis, dims.length);\n  }\n\n  // `axis` exclusive\n  static sizeToDimension(dims: readonly number[], axis: number): number {\n    if (axis < 0 || axis > dims.length) {\n      throw new Error(`invalid dimension of ${axis} for sizeToDimension as Tensor has ${dims.length} dimensions.`);\n    }\n    return ShapeUtil.getSizeFromDimensionRange(dims, 0, axis);\n  }\n\n  static getSizeFromDimensionRange(dims: readonly number[], start: number, end: number): number {\n    let size = 1;\n    for (let i = start; i < end; i++) {\n      // safety check as this method is called by multiple other methods requiring size.\n      // size cannot be 0 or negative.\n      if (dims[i] <= 0) {\n        throw new Error(\n          // eslint-disable-next-line max-len\n          'cannot get valid size from specified dimension range. Most likely the range contains 0 or negative values in them.',\n        );\n      }\n      size *= dims[i];\n    }\n    return size;\n  }\n\n  static computeStrides(dims: readonly number[]): readonly number[] {\n    const rank = dims.length;\n    if (rank === 0) {\n      return [];\n    } else if (rank === 1) {\n      return [1];\n    }\n    const strides = new Array(rank);\n    strides[rank - 1] = 1;\n    strides[rank - 2] = dims[rank - 1];\n    for (let i = rank - 3; i >= 0; --i) {\n      strides[i] = strides[i + 1] * dims[i + 1];\n    }\n    return strides;\n  }\n\n  static transpose(dims: readonly number[]): readonly number[] {\n    const copy = dims.slice();\n    return copy.reverse();\n  }\n\n  static indicesToOffset(indices: readonly number[], strides: readonly number[], axis?: number): number {\n    if (axis === undefined) {\n      axis = indices.length;\n    }\n    let offset = 0;\n    for (let i = 0; i < axis; ++i) {\n      offset += strides[i] * indices[i];\n    }\n    return offset;\n  }\n\n  static offsetToIndices(offset: number, strides: readonly number[]): readonly number[] {\n    const rank = strides.length;\n    if (rank === 0) {\n      return [];\n    } else if (rank === 1) {\n      return [offset * strides[0]];\n    }\n    const indices: number[] = new Array(strides.length);\n    for (let i = 0; i < indices.length - 1; ++i) {\n      indices[i] = Math.floor(offset / strides[i]);\n      offset -= indices[i] * strides[i];\n    }\n    indices[indices.length - 1] = offset;\n    return indices;\n  }\n\n  /**\n   * normailze axis of range [-r, r) into [0, r).\n   */\n  static normalizeAxis(axis: number, tensorRank: number): number {\n    if (axis < -tensorRank && axis >= tensorRank) {\n      throw new Error('unsupported axis for this operation.');\n    }\n    return axis < 0 ? axis + tensorRank : axis;\n  }\n\n  static normalizeAxes(axes: readonly number[], tensorRank: number): number[] {\n    return axes.map((x) => this.normalizeAxis(x, tensorRank));\n  }\n\n  // Increment an index into a tensor (in lexicographic\n  // ordering), wrapping around the specified upper_bound.\n  /**\n   * Increment an index into a tensor (in lexicographic ordering), wrapping around the specified upper_bound.\n   * @param index Given index to increment (Will be mutated)\n   * @param dims The dimensions of the tensor for which the given index corresponds to\n   * @param axisToIncrementOn The 1-indexed axis to increment on. If undefined, axisToIncrementOn == rank\n   */\n  static incrementIndex(index: number[], dims: readonly number[], axisToIncrementOn?: number) {\n    if (dims.length === 0 || index.length === 0) {\n      throw new Error('Index incrementing unsupported for scalar Tensor');\n    }\n    if (axisToIncrementOn === undefined) {\n      axisToIncrementOn = dims.length;\n    } else {\n      if (axisToIncrementOn <= 0 || axisToIncrementOn > dims.length) {\n        throw new Error('Incorrect axis to increment on');\n      }\n    }\n\n    for (let k = axisToIncrementOn - 1; k >= 0; --k) {\n      index[k]++;\n      if (index[k] < dims[k]) {\n        break;\n      }\n      index[k] = 0;\n    }\n  }\n\n  /**\n   * Produces a new dimensions array based on the values in the 'originalDimensions' and 'shape' array\n   * Used in Reshape\n   * @param originalDims Original Shape array\n   * @param shapeHints array containing values to compute the new dimensions\n   * For example:\n   * originalDims = [2,2] and shapeHints = [0,-1] will return [2,2]\n   * originalDims = [2,2] and shapeHints = [4] will return [4]\n   * originalDims = [2,2] and shapeHints = [5] will throw an exception\n   * https://github.com/onnx/onnx/blob/main/docs/Operators.md#Reshape\n   */\n\n  static calculateReshapedDims(originalDims: readonly number[], shapeHints: ArrayLike<number>): number[] {\n    // reshape to a Scalar Tensor\n    if (shapeHints.length === 0) {\n      if (originalDims.length === 0 || ShapeUtil.size(originalDims) === 1) {\n        return [];\n      } else {\n        throw new Error('cannot reshape to a scalar Tensor');\n      }\n    }\n\n    const nDims = shapeHints.length;\n    const reshapedDims = new Array<number>(nDims);\n    let unknownDimension = -1;\n    let newTensorSize = 1;\n    for (let i = 0; i < nDims; i++) {\n      if (shapeHints[i] < -1) {\n        throw new Error('a dimension in shape hints cannot be less than -1');\n      }\n      if (shapeHints[i] === -1) {\n        if (unknownDimension !== -1) {\n          throw new Error('at most one dimension in shape hints can be -1');\n        }\n        unknownDimension = i;\n      } else {\n        if (shapeHints[i] === 0) {\n          if (i >= originalDims.length) {\n            throw new Error('the dimension with value zero exceeds the dimension size of the input tensor');\n          }\n          reshapedDims[i] = originalDims[i];\n        } else {\n          reshapedDims[i] = shapeHints[i];\n        }\n        newTensorSize *= reshapedDims[i];\n      }\n    }\n\n    const oldTensorSize = ShapeUtil.size(originalDims);\n    if (unknownDimension !== -1) {\n      if (oldTensorSize % newTensorSize !== 0) {\n        throw new Error(\n          `the input tensor cannot be reshaped to the requested shape. Input shape: [${\n            originalDims\n          }] Output shape: [${shapeHints}]`,\n        );\n      }\n      reshapedDims[unknownDimension] = oldTensorSize / newTensorSize;\n    }\n    // validate sizes from originalDims and reshapedDims match\n    else {\n      if (newTensorSize !== oldTensorSize) {\n        throw new Error(\"reshapedDims and originalDims don't have matching sizes\");\n      }\n    }\n    return reshapedDims;\n  }\n\n  /**\n   * Sorts a given array based on the indices in the Perm array\n   * Used in Transpose\n   * @param a Array to be sorted such as dims or strides\n   * @param perm Perm given; if null a will be reversed\n   */\n  static sortBasedOnPerm(a: readonly number[], perm?: readonly number[]): readonly number[] {\n    if (perm) {\n      return perm.map((v) => a[v]);\n    } else {\n      return a.slice().reverse();\n    }\n  }\n\n  /**\n   * Pads a given shape according to the padding values\n   * @param dims shape of the Tensor to be padded\n   * @param pad pad values\n   */\n  static padShape(dims: readonly number[], pad: readonly number[]): readonly number[] {\n    const rank = dims.length;\n    return dims.map((v, i) => v + pad[i] + pad[i + rank]);\n  }\n\n  /**\n   * Determines if the two shapes are identical\n   * @param shape1\n   * @param shape2\n   */\n  static areEqual(shape1: readonly number[], shape2: readonly number[]): boolean {\n    if (shape1.length !== shape2.length) {\n      return false;\n    }\n    return shape1.every((v, i) => v === shape2[i]);\n  }\n\n  /**\n   * Validates if the given `dims` or `shape` is valid in ONNX.js context and returns data size\n   * @param dims - input `dims` that needs to be checked\n   */\n  static validateDimsAndCalcSize(dims: readonly number[]): number {\n    if (dims.length > 6) {\n      throw new TypeError('Only rank 0 to 6 is supported for tensor shape.');\n    }\n    let size = 1;\n    for (const n of dims) {\n      if (!Number.isInteger(n)) {\n        throw new TypeError(`Invalid shape: ${n} is not an integer`);\n      }\n      if (n < 0 || n > 2147483647) {\n        throw new TypeError(`Invalid shape: length ${n} is not allowed`);\n      }\n      size *= n;\n    }\n    return size;\n  }\n\n  /**\n   * Determines the shape of output tensor y = flatten(x, axis)\n   * @param dims - shape of input tensor\n   * @param axis - flatten axis, in the range [-r, r]\n   */\n  static flattenShape(dims: readonly number[], axis: number): readonly number[] {\n    if (axis < 0) {\n      axis += dims.length;\n    }\n    const total = dims.reduce((x, y) => x * y, 1);\n    const right = dims.slice(axis).reduce((x, y) => x * y, 1);\n    const outputDims = [total / right, right];\n\n    return outputDims;\n  }\n\n  /**\n   * Determines the shape of output tensor y = squeeze(x, axes)\n   * @param dims - shape of input tensor\n   * @param axes - squeeze axes\n   */\n  static squeezeShape(dims: readonly number[], axes: readonly number[]): readonly number[] {\n    const outputDims = new Array<number>();\n\n    // sanity check\n    axes = ShapeUtil.normalizeAxes(axes, dims.length);\n\n    for (let i = 0; i < dims.length; i++) {\n      const inSqueezeList = axes.indexOf(i) >= 0;\n      if (inSqueezeList && dims[i] !== 1) {\n        throw new Error('squeeze an axis of size different than 1');\n      }\n\n      if ((axes.length === 0 && dims[i] > 1) || (axes.length > 0 && !inSqueezeList)) {\n        outputDims.push(dims[i]);\n      }\n    }\n\n    return outputDims;\n  }\n\n  /**\n   * Determines the shape of output tensor y = unsqueeze(x, axes)\n   * @param dims - shape of input tensor\n   * @param axes - unsqueeze axes\n   */\n  static unsqueezeShape(dims: readonly number[], axes: readonly number[]): readonly number[] {\n    const outputDims = new Array<number>(dims.length + axes.length);\n\n    // initialize the array elements to 0\n    outputDims.fill(0);\n\n    // set all axes indices to 1 in outputDims and check for duplicates\n    for (let i = 0; i < axes.length; i++) {\n      const axis = ShapeUtil.normalizeAxis(axes[i], outputDims.length);\n      if (axis >= outputDims.length) {\n        throw new Error(\"'axes' has an out of range axis\");\n      }\n      if (outputDims[axis] !== 0) {\n        throw new Error(\"'axes' has a duplicate axis\");\n      }\n\n      outputDims[axis] = 1;\n    }\n\n    // fill in the zero entries of outputDims with the input tensor's shape\n    let inputDimsIterator = 0;\n    for (let i = 0; i < outputDims.length; i++) {\n      if (outputDims[i] === 0) {\n        outputDims[i] = dims[inputDimsIterator++];\n      }\n    }\n\n    // sanity check assertion. 'inputDimsIterator'\n    // should be equal to the length of 'dims'\n    if (inputDimsIterator !== dims.length) {\n      throw new Error('the unsqueezed dimension could not be established');\n    }\n\n    return outputDims;\n  }\n}\n\n// bunch of helper methods that do a variety of math operations\nexport class MathUtil {\n  // y = (x*x) + y\n  static sqr(\n    target: number[] | Tensor.NumberType,\n    source: number[] | Tensor.NumberType,\n    targetIndex: number,\n    sourceIndex: number,\n    blockSize: number,\n  ) {\n    if (sourceIndex < 0 || sourceIndex >= source.length) {\n      throw new Error('sourceIndex out of bounds');\n    }\n    if (targetIndex < 0 || targetIndex >= target.length) {\n      throw new Error('targetIndex out of bounds');\n    }\n    if (sourceIndex + blockSize > source.length) {\n      throw new Error('source indices to be copied are outside bounds');\n    }\n    if (targetIndex + blockSize > target.length) {\n      throw new Error('target array is too small to hold result');\n    }\n\n    for (let offset = 0; offset < blockSize; offset++) {\n      target[targetIndex + offset] += Math.pow(source[sourceIndex + offset], 2);\n    }\n  }\n\n  // y = ax + y\n  static axpy(\n    target: number[] | Tensor.NumberType,\n    source: number[] | Tensor.NumberType,\n    targetIndex: number,\n    sourceIndex: number,\n    blockSize: number,\n    alpha: number,\n  ) {\n    if (sourceIndex < 0 || sourceIndex >= source.length) {\n      throw new Error('sourceIndex out of bounds');\n    }\n    if (targetIndex < 0 || targetIndex >= target.length) {\n      throw new Error('targetIndex out of bounds');\n    }\n    if (sourceIndex + blockSize > source.length) {\n      throw new Error('source indices to be copied are outside bounds');\n    }\n    if (targetIndex + blockSize > target.length) {\n      throw new Error('target array is too small to hold result');\n    }\n\n    for (let offset = 0; offset < blockSize; offset++) {\n      target[targetIndex + offset] += alpha * source[sourceIndex + offset];\n    }\n  }\n\n  // y = pow(x, b)\n  static powx(\n    target: number[] | Tensor.NumberType,\n    source: number[] | Tensor.NumberType,\n    targetIndex: number,\n    sourceIndex: number,\n    blockSize: number,\n    b: number,\n  ) {\n    if (sourceIndex < 0 || sourceIndex >= source.length) {\n      throw new Error('sourceIndex out of bounds');\n    }\n    if (targetIndex < 0 || targetIndex >= target.length) {\n      throw new Error('targetIndex out of bounds');\n    }\n    if (sourceIndex + blockSize > source.length) {\n      throw new Error('source indices to be copied are outside bounds');\n    }\n    if (targetIndex + blockSize > target.length) {\n      throw new Error('target array is too small to hold result');\n    }\n\n    for (let offset = 0; offset < blockSize; offset++) {\n      target[targetIndex + offset] = Math.pow(source[sourceIndex + offset], b);\n    }\n  }\n\n  // y = x * y\n  static mul(\n    target: number[] | Tensor.NumberType,\n    source: number[] | Tensor.NumberType,\n    targetIndex: number,\n    sourceIndex: number,\n    blockSize: number,\n  ) {\n    if (sourceIndex < 0 || sourceIndex >= source.length) {\n      throw new Error('sourceIndex out of bounds');\n    }\n    if (targetIndex < 0 || targetIndex >= target.length) {\n      throw new Error('targetIndex out of bounds');\n    }\n    if (sourceIndex + blockSize > source.length) {\n      throw new Error('source indices to be copied are outside bounds');\n    }\n    if (targetIndex + blockSize > target.length) {\n      throw new Error('target array is too small to hold result');\n    }\n\n    for (let offset = 0; offset < blockSize; offset++) {\n      target[targetIndex + offset] = source[sourceIndex + offset] * target[targetIndex + offset];\n    }\n  }\n}\n\nexport class SplitUtil {\n  /**\n   * Calculates new Shapes from existing one and the splits given along the axis provides\n   * @param dims Shape of the Tensor to be splitted into two or more Shapes\n   * @param axis The dimension along which the Tensor will be split\n   * @param splits Offsets for the start of each split\n   */\n  static splitShape(\n    dims: readonly number[],\n    axis: number,\n    split: number[],\n    numOutputs?: number,\n  ): [number[][], number[]] {\n    if (split.length === 0) {\n      if (!numOutputs) {\n        throw new Error(\"need to know number of outputs when the 'split' attribute is not specified\");\n      }\n      SplitUtil.determineSplit(dims[axis], numOutputs, split);\n    }\n\n    const shapes: number[][] = [];\n    const offsets = [0];\n    for (let i = 0; i < split.length; ++i) {\n      if (i !== 0) {\n        offsets.push(offsets[i - 1] + split[i - 1]);\n      }\n      const shape = dims.slice();\n      shape[axis] = split[i];\n      shapes.push(shape);\n    }\n    return [shapes, offsets];\n  }\n\n  static determineSplit(numElementsAlongAxis: number, numOutputs: number, split: number[]) {\n    // If 'split' is not specified by the user, we need to partition the number of elements equally among the outputs\n    if (numElementsAlongAxis % numOutputs !== 0) {\n      throw new Error('cannot split tensor to equal sized parts');\n    }\n    for (let i = 0; i < numOutputs; ++i) {\n      split.push(numElementsAlongAxis / numOutputs);\n    }\n  }\n}\n\nexport class ReduceUtil {\n  /**\n   * Perform reduce operations on the specific operator\n   * @param a Input tensor data\n   * @param axes The dimensions along which the Tensor will be reduced\n   * @param keepdims If set to true, the axes which are reduced are left in the\n   *    result as dimensions with size one.\n   * @param op1 The operation to be performed on each element in the tensor\n   * @param op2 The operation to be performed between elements in the tensor\n   */\n  static calcReduce(\n    a: Tensor,\n    axes: number[],\n    keepdims: boolean,\n    op1: (b: number) => number,\n    op2: (a: number, b: number) => number,\n  ): Tensor {\n    const dims = a.dims.slice(0);\n    // if axes is not set, perform reduce on all axes\n    if (axes.length === 0) {\n      dims.forEach((_d, ind) => axes.push(ind));\n    }\n    // get a temporary broadcastable output shape\n    const outputDims = ReduceUtil.calcReduceShape(dims, axes, true);\n\n    // loop through the output and calculate result one by one\n    const size = ShapeUtil.size(outputDims);\n    const y = new Tensor(outputDims, a.type);\n    const strides = ShapeUtil.computeStrides(outputDims);\n    const inputStrides = ShapeUtil.computeStrides(dims);\n    const indicesY = new Array(dims.length);\n    for (let i = 0; i < size; i++) {\n      const indices = ShapeUtil.offsetToIndices(i, strides);\n      // map index\n      BroadcastUtil.fillIndex(indices, dims, indicesY);\n      y.set(\n        indices,\n        ReduceUtil.calcReduceByAxis(\n          a.numberData,\n          axes,\n          dims,\n          0,\n          ShapeUtil.indicesToOffset(indicesY, inputStrides),\n          op1,\n          op2,\n        ),\n      );\n    }\n\n    if (keepdims) {\n      return y;\n    } else {\n      // keepdims == 0, calculate the expected shape\n      return new Tensor(\n        ReduceUtil.calcReduceShape(dims, axes, keepdims),\n        y.type,\n        undefined,\n        undefined,\n        y.data,\n        y.dataId,\n      );\n    }\n  }\n\n  /**\n   * Perform reduce operations on the specific operator on specific axes\n   * @param a Input tensor data\n   * @param axes The dimensions along which the Tensor will be reduced\n   * @param dims The input dimension.\n   * @param curAxisInd Index in axes specifying the current dimension along\n   *      which the tensor will be reduced\n   * @param pos The current index of element to perform operation\n   * @param op1 The operation to be performed on each element in the tensor\n   * @param op2 The operation to be performed between elements in the tensor\n   */\n  static calcReduceByAxis(\n    input: Tensor.NumberType,\n    axes: number[],\n    dims: number[],\n    curAxisInd: number,\n    pos: number,\n    op1: (b: number) => number,\n    op2: (a: number, b: number) => number,\n  ): number {\n    let res = 0;\n    if (curAxisInd >= axes.length) {\n      return op1(input[pos]);\n    }\n    const axis = axes[curAxisInd];\n    const step = axis >= dims.length ? 1 : ShapeUtil.size(dims.slice(axis + 1));\n    for (let i = 0; i < dims[axis]; i++) {\n      res =\n        i === 0\n          ? ReduceUtil.calcReduceByAxis(input, axes, dims, curAxisInd + 1, pos, op1, op2)\n          : op2(res, ReduceUtil.calcReduceByAxis(input, axes, dims, curAxisInd + 1, pos, op1, op2));\n      pos += step;\n    }\n    return res;\n  }\n\n  /**\n   * Calculate the expected shape of a reduce operation\n   * @param dims The input tensor dimension\n   * @param axes The dimensions along which the Tensor will be reduced\n   * @param keepdims If set to true, the axes which are reduced are left in the\n   *    result as dimensions with size one.\n   */\n  static calcReduceShape(dims: readonly number[], axes: readonly number[], keepDims: boolean): number[] {\n    const outputDims = dims.slice();\n    for (let i = 0; i < axes.length; i++) {\n      if (keepDims) {\n        outputDims[axes[i]] = 1;\n      } else {\n        outputDims[axes[i]] = 0;\n      }\n    }\n    return outputDims.filter((dim) => dim !== 0);\n  }\n}\n\nexport class PoolConvUtil {\n  /**\n   * Adjust the kernel, strides, pads to correct rank. Set to default value if not present\n   * @param isGlobalOperator If true, perform global pooling.\n   * @param inputDims The input tensor dimension.\n   * @param kernelShape The size of the kernel along each axis.\n   * @param strides Stride along each axis.\n   * @param dilations Dilation along each axis.\n   * @param pads Padding for the beginning and ending along each axis.\n   */\n  static adjustPoolAttributes(\n    isGlobalOperator: boolean,\n    inputDims: readonly number[],\n    kernelShape: number[],\n    strides: number[],\n    dilations: number[],\n    pads: number[],\n  ) {\n    if (!isGlobalOperator && kernelShape.length !== inputDims.length - 2) {\n      throw new Error('length of specified kernel shapes should be 2 less than length of input dimensions');\n    }\n\n    if (isGlobalOperator) {\n      // adjust kernel shape to cover the input dims\n      for (let dim = 0; dim < inputDims.length - 2; dim++) {\n        if (dim >= kernelShape.length) {\n          kernelShape.push(inputDims[dim + 2]);\n        } else {\n          kernelShape[dim] = inputDims[dim + 2];\n        }\n      }\n    }\n\n    // adjust strides length to match kernel shape length\n    for (let dim = 0; dim < kernelShape.length; dim++) {\n      if (dim < strides.length) {\n        if (strides[dim] < 0) {\n          throw new Error('strides should be greater than or equal to 1');\n        }\n      } else {\n        strides.push(1);\n      }\n    }\n\n    // adjust dilation value\n    for (let dim = 0; dim < kernelShape.length; dim++) {\n      if (dim < dilations.length) {\n        if (dilations[dim] < 0) {\n          throw new Error('dilations should be greater than or equal to 1');\n        }\n      } else {\n        dilations.push(1);\n      }\n    }\n\n    // adjust pads length to match 2 * kernel shape length\n    for (let dim = 0; dim < kernelShape.length * 2; dim++) {\n      if (dim < pads.length) {\n        if (pads[dim] < 0) {\n          throw new Error('pad should be greater than or equal to 1');\n        }\n      } else {\n        pads.push(0);\n      }\n    }\n\n    // sanity checks for values in kernel shapes and pads\n    for (let dim = 0; dim < kernelShape.length; dim++) {\n      if (kernelShape[dim] <= 0) {\n        throw new Error('kernel shapes need to be greater than 0');\n      }\n\n      if (pads[dim] >= kernelShape[dim] || pads[dim + kernelShape.length] >= kernelShape[dim]) {\n        throw new Error('pads should be smaller than kernel');\n      }\n    }\n  }\n\n  // adjust pad values based on 'autoPad' attribute\n  static adjustPadsBasedOnAutoPad(\n    inputDims: readonly number[],\n    strides: readonly number[],\n    dilations: readonly number[],\n    kernelShape: readonly number[],\n    pads: number[],\n    autoPad?: string,\n  ) {\n    if (!autoPad) {\n      return;\n    }\n\n    if (pads.length !== 2 * (inputDims.length - 2)) {\n      throw new Error('length of pads should be twice the length of data dimensions');\n    }\n\n    if (strides.length !== inputDims.length - 2) {\n      throw new Error('length of strides should be the length of data dimensions');\n    }\n\n    if (kernelShape.length !== inputDims.length - 2) {\n      throw new Error('length of kernel shapes should be the length of data dimensions');\n    }\n\n    for (let dim = 0; dim < inputDims.length - 2; dim++) {\n      PoolConvUtil.adjustPadAndReturnShape(\n        inputDims[dim + 2],\n        strides[dim],\n        dilations[dim],\n        kernelShape[dim],\n        pads,\n        dim,\n        dim + inputDims.length - 2,\n        autoPad,\n      );\n    }\n  }\n\n  /**\n   * Calculate the output shape for Pool ops based on input attributes. (Should be used only for Pool ops)\n   * @param isGlobalOperator If true, perform global pooling.\n   * @param inputDims The input tensor dimension. (inputs[0].dims)\n   * @param strides Stride along each axis.\n   * @param dilations Dilation along each axis.\n   * @param kernelShape The size of the kernel along each axis.\n   * @param pads Padding for the beginning and ending along each axis.\n   * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n   *     dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n   */\n  static computePoolOutputShape(\n    isGlobalOperator: boolean,\n    inputDims: readonly number[],\n    strides: number[],\n    dilations: number[],\n    kernelShape: number[],\n    pads: number[],\n    autoPad?: string,\n  ): number[] {\n    if (inputDims.length <= 0) {\n      throw new Error('input shape must be of size greater than 0');\n    }\n\n    // Add batch size and number of channels of output\n    const outputDims = [inputDims[0], inputDims[1]];\n\n    PoolConvUtil.computeShapeHelper(\n      isGlobalOperator,\n      inputDims,\n      outputDims,\n      strides,\n      dilations,\n      kernelShape,\n      pads,\n      autoPad,\n    );\n    return outputDims;\n  }\n\n  /**\n   * Calculate the output shape for Conv op based on input attributes. (Should be used only for Conv op)\n   * @param inputDims The input tensor dimension. (inputs[0].dims)\n   * @param filterDims The filter tensor dimension. (inputs[1].dims)\n   * @param strides Stride along each axis.\n   * @param kernelShape The size of the kernel along each axis.\n   * @param pads Padding for the beginning and ending along each axis.\n   * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n   *     dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n   */\n  static computeConvOutputShape(\n    inputDims: readonly number[],\n    filterDims: readonly number[],\n    strides: number[],\n    dilations: number[],\n    kernelShape: number[],\n    pads: number[],\n    autoPad?: string,\n  ): number[] {\n    if (inputDims.length <= 0 || filterDims.length <= 0) {\n      throw new Error('invalid input tensor dims or invalid filter tensor dims');\n    }\n\n    // Add batch size and number of channels of output\n    const outputDims = [inputDims[0], filterDims[0]];\n\n    PoolConvUtil.computeShapeHelper(false, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n    return outputDims;\n  }\n\n  // will compute output shapes for data dimensions ONLY (i.e.) no batch size and channels\n  // called by computePoolOutputShape() and computeConvOutputShape()\n  // adjust pads based on 'autoPad' attribute prior to shape computation\n  private static computeShapeHelper(\n    isGlobalOperator: boolean,\n    inputDims: readonly number[],\n    outputDims: number[],\n    strides: readonly number[],\n    dilations: readonly number[],\n    kernelShape: readonly number[],\n    pads: number[],\n    autoPad?: string,\n  ) {\n    if (isGlobalOperator) {\n      for (let dim = 0; dim < inputDims.length - 2; dim++) {\n        outputDims.push(1);\n      }\n    } else {\n      for (let dim = 0; dim < inputDims.length - 2; dim++) {\n        outputDims.push(\n          PoolConvUtil.adjustPadAndReturnShape(\n            inputDims[dim + 2],\n            strides[dim],\n            dilations[dim],\n            kernelShape[dim],\n            pads,\n            dim,\n            dim + inputDims.length - 2,\n            autoPad,\n          ),\n        );\n      }\n    }\n  }\n\n  // helper for computeShapeHelper() and adjustPadsBasedOnAutoPad()\n  // adjusts pad value for given 'autoPad' string and computes output shape along a particular dimension\n  private static adjustPadAndReturnShape(\n    inSize: number,\n    stride: number,\n    dilation: number,\n    kernel: number,\n    pads: number[],\n    padHeadIndex: number,\n    padTailIndex: number,\n    autoPad?: string,\n  ): number {\n    const dkernel = dilation * (kernel - 1) + 1;\n    if (autoPad && autoPad !== 'NOTSET') {\n      switch (autoPad) {\n        case 'VALID':\n          pads[padHeadIndex] = 0;\n          pads[padTailIndex] = 0;\n          return Math.floor((inSize - dkernel) / stride + 1);\n        case 'SAME_LOWER':\n        case 'SAME_UPPER':\n          if (dilation !== 1) {\n            throw new Error('Dilation not supported for SAME_UPPER or SAME_LOWER');\n          } else {\n            const legacyTargetSize = (inSize + stride - 1) / stride;\n            const padNeeded = (legacyTargetSize - 1) * stride + kernel - inSize;\n            pads[padHeadIndex] = autoPad === 'SAME_LOWER' ? Math.floor((padNeeded + 1) / 2) : Math.floor(padNeeded / 2);\n            pads[padTailIndex] = padNeeded - pads[padHeadIndex];\n            return Math.floor((inSize + padNeeded - kernel) / stride + 1);\n          }\n        default:\n          throw new Error('Unsupported AutoPad type');\n      }\n    } else {\n      return Math.floor((inSize + pads[padHeadIndex] + pads[padTailIndex] - dkernel) / stride + 1);\n    }\n  }\n}\n\nexport const MIN_CLIP = -3.4028234663852886e38;\nexport const MAX_CLIP = 3.4028234663852886e38;\n\nexport function decodeUtf8String(buffer: Uint8Array): string {\n  return new TextDecoder().decode(buffer);\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Guid } from 'guid-typescript';\nimport Long from 'long';\n\nimport { onnxruntime } from './ort-schema/flatbuffers/ort-generated';\nimport { onnx } from './ort-schema/protobuf/onnx';\nimport { decodeUtf8String, ProtoUtil, ShapeUtil } from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport declare namespace Tensor {\n  export interface DataTypeMap {\n    bool: Uint8Array;\n    float32: Float32Array;\n    float64: Float64Array;\n    string: string[];\n    int8: Int8Array;\n    uint8: Uint8Array;\n    int16: Int16Array;\n    uint16: Uint16Array;\n    int32: Int32Array;\n    uint32: Uint32Array;\n    int64: BigInt64Array;\n  }\n\n  export type DataType = keyof DataTypeMap;\n\n  export type StringType = Tensor.DataTypeMap['string'];\n  export type BooleanType = Tensor.DataTypeMap['bool'];\n  export type IntegerType =\n    | Tensor.DataTypeMap['int8']\n    | Tensor.DataTypeMap['uint8']\n    | Tensor.DataTypeMap['int16']\n    | Tensor.DataTypeMap['uint16']\n    | Tensor.DataTypeMap['int32']\n    | Tensor.DataTypeMap['uint32'];\n  export type FloatType = Tensor.DataTypeMap['float32'] | Tensor.DataTypeMap['float64'];\n  export type NumberType = BooleanType | IntegerType | FloatType;\n\n  export type Id = Guid;\n}\n\ntype TensorData = Tensor.DataTypeMap[Tensor.DataType];\n\ntype DataProvider = (id: Tensor.Id) => TensorData;\ntype AsyncDataProvider = (id: Tensor.Id) => Promise<TensorData>;\n\nexport class Tensor {\n  /**\n   * get the underlying tensor data\n   */\n  get data(): TensorData {\n    if (this.cache === undefined) {\n      const data = this.dataProvider!(this.dataId);\n      if (data.length !== this.size) {\n        throw new Error('Length of data provided by the Data Provider is inconsistent with the dims of this Tensor.');\n      }\n      this.cache = data;\n    }\n    return this.cache;\n  }\n\n  /**\n   * get the underlying string tensor data. Should only use when type is STRING\n   */\n  get stringData() {\n    if (this.type !== 'string') {\n      throw new TypeError('data type is not string');\n    }\n\n    return this.data as Tensor.StringType;\n  }\n\n  /**\n   * get the underlying integer tensor data. Should only use when type is one of the following: (UINT8, INT8, UINT16,\n   * INT16, INT32, UINT32, BOOL)\n   */\n  get integerData() {\n    switch (this.type) {\n      case 'uint8':\n      case 'int8':\n      case 'uint16':\n      case 'int16':\n      case 'int32':\n      case 'uint32':\n      case 'bool':\n        return this.data as Tensor.IntegerType;\n\n      default:\n        throw new TypeError('data type is not integer (uint8, int8, uint16, int16, int32, uint32, bool)');\n    }\n  }\n\n  /**\n   * get the underlying float tensor data. Should only use when type is one of the following: (FLOAT, DOUBLE)\n   */\n  get floatData() {\n    switch (this.type) {\n      case 'float32':\n      case 'float64':\n        return this.data as Tensor.FloatType;\n\n      default:\n        throw new TypeError('data type is not float (float32, float64)');\n    }\n  }\n\n  /**\n   * get the underlying number tensor data. Should only use when type is one of the following: (UINT8, INT8, UINT16,\n   * INT16, INT32, UINT32, BOOL, FLOAT, DOUBLE)\n   */\n  get numberData() {\n    if (this.type !== 'string') {\n      return this.data as Tensor.NumberType;\n    }\n    throw new TypeError('type cannot be non-number (string)');\n  }\n\n  /**\n   * get value of an element at the given indices\n   */\n  get(indices: readonly number[]): Tensor.DataTypeMap[Tensor.DataType][number] {\n    return this.data[ShapeUtil.indicesToOffset(indices, this.strides)];\n  }\n\n  /**\n   * set value of an element at the given indices\n   */\n  set(indices: readonly number[], value: Tensor.DataTypeMap[Tensor.DataType][number]) {\n    this.data[ShapeUtil.indicesToOffset(indices, this.strides)] = value;\n  }\n\n  /**\n   * get the underlying tensor data asynchronously\n   */\n  async getData(): Promise<TensorData> {\n    if (this.cache === undefined) {\n      this.cache = await this.asyncDataProvider!(this.dataId);\n    }\n    return this.cache;\n  }\n\n  /**\n   * get the number of elements in the tensor\n   */\n  public readonly size: number;\n\n  private _strides: readonly number[];\n  /**\n   * get the strides for each dimension\n   */\n  get strides(): readonly number[] {\n    if (!this._strides) {\n      this._strides = ShapeUtil.computeStrides(this.dims);\n    }\n    return this._strides;\n  }\n\n  constructor(\n    /**\n     * get the dimensions of the tensor\n     */\n    public readonly dims: readonly number[],\n    /**\n     * get the type of the tensor\n     */\n    public readonly type: Tensor.DataType,\n    private dataProvider?: DataProvider,\n    private asyncDataProvider?: AsyncDataProvider,\n    private cache?: TensorData,\n    /**\n     * get the data ID that used to map to a tensor data\n     */\n    public readonly dataId: Guid = Guid.create(),\n  ) {\n    this.size = ShapeUtil.validateDimsAndCalcSize(dims);\n    const size = this.size;\n    const empty = dataProvider === undefined && asyncDataProvider === undefined && cache === undefined;\n\n    if (cache !== undefined) {\n      if (cache.length !== size) {\n        throw new RangeError(\"Input dims doesn't match data length.\");\n      }\n    }\n\n    if (type === 'string') {\n      if (cache !== undefined && (!Array.isArray(cache) || !cache.every((i) => typeof i === 'string'))) {\n        throw new TypeError('cache should be a string array');\n      }\n\n      if (empty) {\n        this.cache = new Array<string>(size);\n      }\n    } else {\n      if (cache !== undefined) {\n        const constructor = dataviewConstructor(type);\n        if (!(cache instanceof constructor)) {\n          throw new TypeError(`cache should be type ${constructor.name}`);\n        }\n      }\n\n      if (empty) {\n        const buf = new ArrayBuffer(size * sizeof(type));\n        this.cache = createView(buf, type);\n      }\n    }\n  }\n\n  /**\n   * Construct new Tensor from a ONNX Tensor object\n   * @param tensorProto the ONNX Tensor\n   */\n  static fromProto(tensorProto: onnx.ITensorProto): Tensor {\n    if (!tensorProto) {\n      throw new Error('cannot construct Value from an empty tensor');\n    }\n    const type = ProtoUtil.tensorDataTypeFromProto(tensorProto.dataType!);\n    const dims = ProtoUtil.tensorDimsFromProto(tensorProto.dims!);\n\n    const value = new Tensor(dims, type);\n\n    if (type === 'string') {\n      // When it's STRING type, the value should always be stored in field\n      // 'stringData'\n      tensorProto.stringData!.forEach((str, i) => {\n        value.data[i] = decodeUtf8String(str);\n      });\n    } else if (\n      tensorProto.rawData &&\n      typeof tensorProto.rawData.byteLength === 'number' &&\n      tensorProto.rawData.byteLength > 0\n    ) {\n      // NOT considering segment for now (IMPORTANT)\n\n      // populate value from rawData\n      const dataDest = value.data;\n      const dataSource = new DataView(\n        tensorProto.rawData.buffer,\n        tensorProto.rawData.byteOffset,\n        tensorProto.rawData.byteLength,\n      );\n      const elementSize = sizeofProto(tensorProto.dataType!);\n      const length = tensorProto.rawData.byteLength / elementSize;\n\n      if (tensorProto.rawData.byteLength % elementSize !== 0) {\n        throw new Error('invalid buffer length');\n      }\n      if (dataDest.length !== length) {\n        throw new Error('buffer length mismatch');\n      }\n\n      for (let i = 0; i < length; i++) {\n        const n = readProto(dataSource, tensorProto.dataType!, i * elementSize);\n        dataDest[i] = n;\n      }\n    } else {\n      // populate value from array\n      let array: Array<number | Long>;\n      switch (tensorProto.dataType) {\n        case onnx.TensorProto.DataType.FLOAT:\n          array = tensorProto.floatData!;\n          break;\n        case onnx.TensorProto.DataType.INT32:\n        case onnx.TensorProto.DataType.INT16:\n        case onnx.TensorProto.DataType.UINT16:\n        case onnx.TensorProto.DataType.INT8:\n        case onnx.TensorProto.DataType.UINT8:\n        case onnx.TensorProto.DataType.BOOL:\n          array = tensorProto.int32Data!;\n          break;\n        case onnx.TensorProto.DataType.INT64:\n          array = tensorProto.int64Data!;\n          break;\n        case onnx.TensorProto.DataType.DOUBLE:\n          array = tensorProto.doubleData!;\n          break;\n        case onnx.TensorProto.DataType.UINT32:\n        case onnx.TensorProto.DataType.UINT64:\n          array = tensorProto.uint64Data!;\n          break;\n        default:\n          // should never run here\n          throw new Error('unspecific error');\n      }\n\n      if (array === null || array === undefined) {\n        throw new Error('failed to populate data from a tensorproto value');\n      }\n\n      const data = value.data;\n      if (data.length !== array.length) {\n        throw new Error('array length mismatch');\n      }\n\n      for (let i = 0; i < array.length; i++) {\n        const element = array[i];\n        if (Long.isLong(element)) {\n          data[i] = longToNumber(element, tensorProto.dataType);\n        } else {\n          data[i] = element;\n        }\n      }\n    }\n\n    return value;\n  }\n\n  /**\n   * Construct new Tensor from raw data\n   * @param data the raw data object. Should be a string array for 'string' tensor, and the corresponding typed array\n   * for other types of tensor.\n   * @param dims the dimensions of the tensor\n   * @param type the type of the tensor\n   */\n  static fromData(data: Tensor.DataTypeMap[Tensor.DataType], dims: readonly number[], type: Tensor.DataType) {\n    return new Tensor(dims, type, undefined, undefined, data);\n  }\n\n  static fromOrtTensor(ortTensor: ortFbs.Tensor) {\n    if (!ortTensor) {\n      throw new Error('cannot construct Value from an empty tensor');\n    }\n    const dims = ProtoUtil.tensorDimsFromORTFormat(ortTensor);\n    const type = ProtoUtil.tensorDataTypeFromProto(ortTensor.dataType());\n\n    const value = new Tensor(dims, type);\n\n    if (type === 'string') {\n      // When it's STRING type, the value should always be stored in field\n      // 'stringData'\n      for (let i = 0; i < ortTensor.stringDataLength(); i++) {\n        value.data[i] = ortTensor.stringData(i);\n      }\n    } else if (\n      ortTensor.rawDataArray() &&\n      typeof ortTensor.rawDataLength() === 'number' &&\n      ortTensor.rawDataLength() > 0\n    ) {\n      // NOT considering segment for now (IMPORTANT)\n\n      // populate value from rawData\n      const dataDest = value.data;\n      const dataSource = new DataView(\n        ortTensor.rawDataArray()!.buffer,\n        ortTensor.rawDataArray()!.byteOffset,\n        ortTensor.rawDataLength(),\n      );\n      const elementSize = sizeofProto(ortTensor.dataType());\n      const length = ortTensor.rawDataLength() / elementSize;\n\n      if (ortTensor.rawDataLength() % elementSize !== 0) {\n        throw new Error('invalid buffer length');\n      }\n      if (dataDest.length !== length) {\n        throw new Error('buffer length mismatch');\n      }\n\n      for (let i = 0; i < length; i++) {\n        const n = readProto(dataSource, ortTensor.dataType(), i * elementSize);\n        dataDest[i] = n;\n      }\n    }\n    return value;\n  }\n}\n\nfunction sizeof(type: Tensor.DataType): number {\n  switch (type) {\n    case 'bool':\n    case 'int8':\n    case 'uint8':\n      return 1;\n    case 'int16':\n    case 'uint16':\n      return 2;\n    case 'int32':\n    case 'uint32':\n    case 'float32':\n      return 4;\n    case 'float64':\n      return 8;\n    default:\n      throw new Error(`cannot calculate sizeof() on type ${type}`);\n  }\n}\n\nfunction sizeofProto(type: onnx.TensorProto.DataType | ortFbs.TensorDataType): number {\n  switch (type) {\n    case onnx.TensorProto.DataType.UINT8:\n    case onnx.TensorProto.DataType.INT8:\n    case onnx.TensorProto.DataType.BOOL:\n      return 1;\n    case onnx.TensorProto.DataType.UINT16:\n    case onnx.TensorProto.DataType.INT16:\n      return 2;\n    case onnx.TensorProto.DataType.FLOAT:\n    case onnx.TensorProto.DataType.INT32:\n    case onnx.TensorProto.DataType.UINT32:\n      return 4;\n    case onnx.TensorProto.DataType.INT64:\n    case onnx.TensorProto.DataType.DOUBLE:\n    case onnx.TensorProto.DataType.UINT64:\n      return 8;\n    default:\n      throw new Error(`cannot calculate sizeof() on type ${onnx.TensorProto.DataType[type]}`);\n  }\n}\n\nfunction createView(dataBuffer: ArrayBuffer, type: Tensor.DataType) {\n  return new (dataviewConstructor(type))(dataBuffer);\n}\n\nfunction dataviewConstructor(type: Tensor.DataType) {\n  switch (type) {\n    case 'bool':\n    case 'uint8':\n      return Uint8Array;\n    case 'int8':\n      return Int8Array;\n    case 'int16':\n      return Int16Array;\n    case 'uint16':\n      return Uint16Array;\n    case 'int32':\n      return Int32Array;\n    case 'uint32':\n      return Uint32Array;\n    case 'int64':\n      return BigInt64Array;\n    case 'float32':\n      return Float32Array;\n    case 'float64':\n      return Float64Array;\n    default:\n      // should never run to here\n      throw new Error('unspecified error');\n  }\n}\n\n// convert a long number to a 32-bit integer (cast-down)\nfunction longToNumber(i: Long, type: onnx.TensorProto.DataType | ortFbs.TensorDataType): number {\n  // INT64, UINT32, UINT64\n  if (type === onnx.TensorProto.DataType.INT64 || type === ortFbs.TensorDataType.INT64) {\n    if (i.greaterThanOrEqual(2147483648) || i.lessThan(-2147483648)) {\n      throw new TypeError('int64 is not supported');\n    }\n  } else if (\n    type === onnx.TensorProto.DataType.UINT32 ||\n    type === ortFbs.TensorDataType.UINT32 ||\n    type === onnx.TensorProto.DataType.UINT64 ||\n    type === ortFbs.TensorDataType.UINT64\n  ) {\n    if (i.greaterThanOrEqual(4294967296) || i.lessThan(0)) {\n      throw new TypeError('uint64 is not supported');\n    }\n  } else {\n    throw new TypeError(`not a LONG type: ${onnx.TensorProto.DataType[type]}`);\n  }\n\n  return i.toNumber();\n}\n\n// read one value from TensorProto\nfunction readProto(\n  view: DataView,\n  type: onnx.TensorProto.DataType | ortFbs.TensorDataType,\n  byteOffset: number,\n): number {\n  switch (type) {\n    case onnx.TensorProto.DataType.BOOL:\n    case onnx.TensorProto.DataType.UINT8:\n      return view.getUint8(byteOffset);\n    case onnx.TensorProto.DataType.INT8:\n      return view.getInt8(byteOffset);\n    case onnx.TensorProto.DataType.UINT16:\n      return view.getUint16(byteOffset, true);\n    case onnx.TensorProto.DataType.INT16:\n      return view.getInt16(byteOffset, true);\n    case onnx.TensorProto.DataType.FLOAT:\n      return view.getFloat32(byteOffset, true);\n    case onnx.TensorProto.DataType.INT32:\n      return view.getInt32(byteOffset, true);\n    case onnx.TensorProto.DataType.UINT32:\n      return view.getUint32(byteOffset, true);\n    case onnx.TensorProto.DataType.INT64:\n      return longToNumber(\n        Long.fromBits(view.getUint32(byteOffset, true), view.getUint32(byteOffset + 4, true), false),\n        type,\n      );\n    case onnx.TensorProto.DataType.DOUBLE:\n      return view.getFloat64(byteOffset, true);\n    case onnx.TensorProto.DataType.UINT64:\n      return longToNumber(\n        Long.fromBits(view.getUint32(byteOffset, true), view.getUint32(byteOffset + 4, true), true),\n        type,\n      );\n    default:\n      throw new Error(`cannot read from DataView for type ${onnx.TensorProto.DataType[type]}`);\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * represent a version irrelevant abstraction of for GLSL source code\n */\nexport interface Glsl {\n  readonly version: string;\n  readonly attribute: string;\n  readonly varyingVertex: string;\n  readonly varyingFrag: string;\n  readonly texture2D: string;\n  readonly output: string;\n  readonly outputDeclaration: string;\n}\n\nconst GLSL_ES_2_0: Glsl = {\n  version: '',\n  attribute: 'attribute',\n  varyingVertex: 'varying',\n  varyingFrag: 'varying',\n  texture2D: 'texture2D',\n  output: 'gl_FragColor',\n  outputDeclaration: '',\n};\nconst GLSL_ES_3_0: Glsl = {\n  version: '#version 300 es',\n  attribute: 'in',\n  varyingVertex: 'out',\n  varyingFrag: 'in',\n  texture2D: 'texture',\n  output: 'outputColor',\n  outputDeclaration: 'out vec4 outputColor;',\n};\n\nexport function getGlsl(version: 1 | 2) {\n  return version === 1 ? GLSL_ES_2_0 : GLSL_ES_3_0;\n}\n\nexport function getVertexShaderSource(version: 1 | 2): string {\n  const glsl = getGlsl(version);\n  return `${glsl.version}\n      precision highp float;\n      ${glsl.attribute} vec3 position;\n      ${glsl.attribute} vec2 textureCoord;\n\n      ${glsl.varyingVertex} vec2 TexCoords;\n\n      void main()\n      {\n          gl_Position = vec4(position, 1.0);\n          TexCoords = textureCoord;\n      }`;\n}\n\nexport function getFragShaderPreamble(version: 1 | 2): string {\n  const glsl = getGlsl(version);\n  return `${glsl.version}\n    precision highp float;\n    precision highp int;\n    precision highp sampler2D;\n    ${glsl.varyingFrag} vec2 TexCoords;\n    ${glsl.outputDeclaration}\n    const vec2 halfCR = vec2(0.5, 0.5);\n\n    // Custom vector types to handle higher dimenalities.\n    struct ivec5\n    {\n      int x;\n      int y;\n      int z;\n      int w;\n      int u;\n    };\n\n    struct ivec6\n    {\n      int x;\n      int y;\n      int z;\n      int w;\n      int u;\n      int v;\n    };\n\n    int imod(int x, int y) {\n      return x - y * (x / y);\n    }\n\n    `;\n}\n\nexport function getDefaultFragShaderMain(version: 1 | 2, outputShapeLength: number): string {\n  const glsl = getGlsl(version);\n  return `\n  void main() {\n    int indices[${outputShapeLength}];\n    toVec(TexCoords, indices);\n    vec4 result = vec4(process(indices));\n    ${glsl.output} = result;\n  }\n  `;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../tensor';\n\n/**\n * Layout info is used for mapping n-dimensional array to 2D textures\n * The layout is created by the TextureLayoutStrategy based on\n * the Tensor's dimensions and strides\n */\nexport interface TextureLayout {\n  width: number;\n  height: number;\n  /**\n   * specify the number of value that encoded in a single pixel\n   */\n  channels: 1 | 2 | 3 | 4;\n  /**\n   * whether in packed mode or not\n   */\n  isPacked?: boolean;\n  /**\n   * the normalized shape\n   */\n  shape: readonly number[];\n  /**\n   * the stride of each dimensions, calculated according to shape\n   */\n  strides: readonly number[];\n  /**\n   * the original shape(dims) of the corresponding tensor\n   */\n  unpackedShape: readonly number[];\n\n  reversedWH?: boolean;\n}\nexport interface TextureData extends TextureLayout {\n  tensor: Tensor;\n  texture: WebGLTexture;\n}\n\nexport enum TextureType {\n  unpacked, // <-- normal unpacked texture\n  unpackedReversed, // <-- unpacked texture used in old ONNX.js implementation (deprecated)\n  packed, // <-- normal packed texture\n  downloadUint8AsFloat, // <-- ONLY used in texture downloading for iOS devices\n  packedLastDimension, // <-- ONLY used in old ONNX.js Conv implementation for input W (deprecated)\n}\n\nexport interface TensorInfo {\n  id?: Tensor.Id;\n  dims: readonly number[];\n  type: Tensor.DataType;\n  textureType: TextureType;\n}\n\nexport interface ProgramVariable {\n  type: 'float' | 'int';\n  name: string;\n  arrayLength?: number;\n  data: number | number[];\n}\n\n/**\n * A set of metadata of a shader program.\n */\nexport interface ProgramMetadata {\n  /**\n   * the name of the program. used for debugging and profiling\n   */\n  name: string;\n  /**\n   * texture types for each input\n   */\n  inputTypes: TextureType[];\n  /**\n   * names of each input\n   */\n  inputNames: string[];\n  /**\n   * an optional string as a cache hint in the artifact cache\n   */\n  cacheHint?: string;\n}\n\n/**\n * A ProgramInfoLoader allows\n */\nexport interface ProgramInfoLoader extends ProgramMetadata {\n  /**\n   * a function to get the program info\n   */\n  get(): ProgramInfo;\n}\n\n/**\n * A set of data that represent a shader program\n */\nexport interface ProgramInfo extends ProgramMetadata {\n  /**\n   * information of uniform variables\n   */\n  variables?: ProgramVariable[];\n  /**\n   * tensor info for output\n   */\n  output: TensorInfo;\n  /**\n   * the shader's processing source code\n   */\n  shaderSource: string;\n  /**\n   * whether the shader source contains a customized main function implementation\n   */\n  hasMain?: boolean;\n}\n\nexport interface VariableInfo {\n  type: 'float' | 'int';\n  name: string;\n  arrayLength?: number;\n}\n\nexport interface ProgramVariable {\n  type: 'float' | 'int';\n  name: string;\n  arrayLength?: number;\n  data: number | number[];\n}\n\n/**\n * Information of uniforms that shader uses\n */\nexport interface UniformInfo {\n  type: 'sampler2D' | VariableInfo['type'];\n  name: string;\n  arrayLength?: number;\n}\n\nexport interface UniformLocation extends UniformInfo {\n  location: WebGLUniformLocation;\n}\n\n/**\n * Artifact is the result of compilation\n * It does not contain input of output data\n * However anything that could be run as a \"program\"\n */\nexport interface Artifact {\n  programInfo: ProgramInfo;\n  program: WebGLProgram;\n  uniformLocations: UniformLocation[];\n  attribLocations: { position: number; textureCoord: number };\n}\nexport declare namespace Artifact {\n  type UniformLocations = Artifact['uniformLocations'];\n  type AttribLocations = Artifact['attribLocations'];\n}\n\nexport interface UniformData {\n  [name: string]: number | number[];\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { assert } from '../../util';\n/**\n * Given a non RGBA shape calculate the R version\n * It is assumed that the dimensions are multiples of given channels\n * NOTE: it is always the last dim that gets packed.\n * @param unpackedShape original shape to create a packed version from\n */\nexport function getPackedShape(unpackedShape: readonly number[]): readonly number[] {\n  const len = unpackedShape.length;\n  return unpackedShape.slice(0, len - 1).concat(unpackedShape[len - 1] / 4);\n}\n\nexport async function repeatedTry(\n  checkFn: () => boolean,\n  delayFn = (_counter: number) => 0,\n  maxCounter?: number,\n): Promise<void> {\n  return new Promise<void>((resolve, reject) => {\n    let tryCount = 0;\n\n    const tryFn = () => {\n      if (checkFn()) {\n        resolve();\n        return;\n      }\n\n      tryCount++;\n\n      const nextBackoff = delayFn(tryCount);\n\n      if (maxCounter != null && tryCount >= maxCounter) {\n        reject();\n        return;\n      }\n      setTimeout(tryFn, nextBackoff);\n    };\n\n    tryFn();\n  });\n}\n\n/**\n * Generates the function name from an input sampler name.\n * @param samplerName Name of the sampler.\n */\nexport function generateShaderFuncNameFromInputSamplerName(samplerName: string): string {\n  assert(typeof samplerName !== 'undefined' && samplerName.length !== 0, () => 'empty string found for sampler name');\n  return 'get' + samplerName.charAt(0).toUpperCase() + samplerName.slice(1);\n}\n\n/**\n * Generates the function name from an input sampler name at output coordinates.\n * @param samplerName Name of the sampler.\n */\nexport function generateShaderFuncNameFromInputSamplerNameAtOutCoords(samplerName: string): string {\n  assert(typeof samplerName !== 'undefined' && samplerName.length !== 0, () => 'empty string found for sampler name');\n  return 'get' + samplerName.charAt(0).toUpperCase() + samplerName.slice(1) + 'AtOutCoords';\n}\n\n/** Returns a new input shape (a copy) that has a squeezed logical shape. */\nexport function squeezeInputShape(inputShape: readonly number[], squeezedShape: number[]): number[] {\n  // Deep copy.\n  let newInputShape: number[] = JSON.parse(JSON.stringify(inputShape));\n  newInputShape = squeezedShape;\n  return newInputShape;\n}\n\n/** Returns a list of squeezed parameters for shader functions */\nexport function getSqueezedParams(params: string[], keptDims: number[]): string {\n  return keptDims.map((d) => params[d]).join(', ');\n}\n\n/** Returns the data type for different ranks. */\nexport function getCoordsDataType(rank: number): string {\n  if (rank <= 1) {\n    return 'int';\n  } else if (rank === 2) {\n    return 'ivec2';\n  } else if (rank === 3) {\n    return 'ivec3';\n  } else if (rank === 4) {\n    return 'ivec4';\n  } else if (rank === 5) {\n    return 'ivec5';\n  } else if (rank === 6) {\n    return 'ivec6';\n  } else {\n    throw Error(`GPU for rank ${rank} is not yet supported`);\n  }\n}\n\nexport function getGlChannels(rank = 6): string[] {\n  return ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank);\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { getGlChannels } from '../utils';\n\nexport function getVecChannels(name: string, rank: number): string[] {\n  return getGlChannels(rank).map((d) => `${name}.${d}`);\n}\n\nexport function getChannels(name: string, rank: number): string[] {\n  if (rank === 1) {\n    return [name];\n  }\n  return getVecChannels(name, rank);\n}\n\nexport function unpackFromChannel(): string {\n  return `\n    float getChannel(vec4 frag, int dim) {\n      int modCoord = imod(dim, 2);\n      return modCoord == 0 ? frag.r : frag.g;\n    }\n\n    float getChannel(vec4 frag, vec2 innerDims) {\n      vec2 modCoord = mod(innerDims, 2.);\n      return modCoord.x == 0. ?\n        (modCoord.y == 0. ? frag.r : frag.g) :\n        (modCoord.y == 0. ? frag.b : frag.a);\n    }\n  `;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, TextureType } from '../types';\nimport { getCoordsDataType } from '../utils';\n\nimport { getChannels } from './packing-utils';\n\nconst packProgramMetadata = {\n  name: 'pack',\n  inputNames: ['A'],\n  inputTypes: [TextureType.unpackedReversed],\n};\n\nconst createPackProgramInfo = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfo => {\n  const glsl = getGlsl(handler.session.backend.glContext.version);\n  const inputShape = input.dims;\n\n  const inputRank = inputShape.length;\n  // createTextureLayoutFromShape won't change output rank. Need to verify by running tests\n  const outputRank = input.dims.length;\n\n  const coordsDataType = getCoordsDataType(outputRank);\n  const channels = getChannels('rc', outputRank);\n  const setup = getSetup(outputRank, channels, inputShape[inputShape.length - 2], inputShape[inputShape.length - 1]);\n\n  let reversedInputWH;\n  if (inputRank === 0) {\n    reversedInputWH = [1, 1];\n  } else if (inputRank === 1) {\n    reversedInputWH = [inputShape[0], 1];\n  } else {\n    reversedInputWH = [inputShape[outputRank - 1], inputShape[outputRank - 2]];\n  }\n  const outOfBoundsCondition = getOutOfBoundsCondition(outputRank, reversedInputWH, channels);\n  const output = getOutput(inputShape, channels);\n\n  const shaderSource = `\n        void main() {\n          ${coordsDataType} rc = getOutputCoords();\n\n          if(${outOfBoundsCondition}) {\n            ${glsl.output} = vec4(0);\n          } else {\n            ${setup}\n\n            ${glsl.output} = vec4(${output});\n          }\n        }\n      `;\n  return {\n    ...packProgramMetadata,\n    hasMain: true,\n    output: { dims: input.dims, type: input.type, textureType: TextureType.packed },\n    shaderSource,\n  };\n};\n\nexport const createPackProgramInfoLoader = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfoLoader => ({\n  ...packProgramMetadata,\n  get: () => createPackProgramInfo(handler, input),\n});\n\n/**\n * check output coordinate location and return false if it is outside input's width/height boundary\n */\nfunction getOutOfBoundsCondition(rank: number, shape: readonly number[], dims: string[]): string {\n  if (rank === 0) {\n    return 'false';\n  }\n  if (rank === 1) {\n    return `rc > ${shape[0]}`;\n  }\n\n  let cond = '';\n  for (let i = rank - 2; i < rank; i++) {\n    cond += `${dims[i]} >= ${shape[i - rank + 2]}`;\n    if (i < rank - 1) {\n      cond += '||';\n    }\n  }\n\n  return cond;\n}\n\n/**\n * code snippet to sample input texture with output coordinates\n */\nfunction getOutput(shape: readonly number[], dims: string[]): string {\n  const rank = shape.length;\n\n  if (rank === 0) {\n    return 'getA(), 0, 0, 0';\n  }\n\n  if (rank === 1) {\n    return `getA(rc),\n            rc + 1 >= ${shape[0]} ? 0. : getA(rc + 1),\n            0, 0`;\n  }\n\n  const coord00 = 'r, c';\n  const coord01 = 'r, cp1';\n  const coord10 = 'rp1, c';\n  const coord11 = 'rp1, cp1';\n  let D = '';\n  if (rank > 2) {\n    for (let i = 0; i < rank - 2; ++i) {\n      D = D + `${dims[i]},`;\n    }\n  }\n  return `getA(${D}${coord00}),\n          rEdge ? 0. : getA(${D}${coord10}),\n          cEdge ? 0. : getA(${D}${coord01}),\n          rEdge || cEdge ? 0. : getA(${D}${coord11})`;\n}\n\n/**\n * code snippet to setup 4 coordinates and edge conditions\n */\nfunction getSetup(rank: number, dims: string[], rows: number, cols: number): string {\n  if (rank === 0 || rank === 1) {\n    return '';\n  }\n  // rank >= 2 for width+height pack.\n  else {\n    const setup = `\n    int r = ${dims[rank - 2]};\n    int c = ${dims[rank - 1]};\n    int rp1 = ${dims[rank - 2]} + 1;\n    int cp1 = ${dims[rank - 1]} + 1;\n    bool rEdge = rp1 >= ${cols};\n    bool cEdge = cp1 >= ${rows};\n    `;\n    return setup;\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nimport { unpackFromChannel } from './packing-utils';\n\nconst createPackedReshape3DProgramMetadata = (outputShape3D: readonly number[]) => ({\n  name: 'Reshape (packed)',\n  inputTypes: [TextureType.packed],\n  inputNames: ['A'],\n  cacheHint: `${outputShape3D}`,\n});\n\nconst createPackedReshape3DProgramInfo = (\n  handler: WebGLInferenceHandler,\n  input3D: Tensor,\n  metadata: ProgramMetadata,\n  outputShape3D: readonly number[],\n): ProgramInfo => {\n  const inputShape3D = input3D.dims as [number, number, number];\n  const squeezedOutputShape = outputShape3D as [number, number, number];\n\n  let mainLoop = '';\n  for (let i = 0; i < 4; i++) {\n    let outputCoords = '';\n    switch (i) {\n      case 0:\n        outputCoords = 'outputCoords = rc;';\n        break;\n      case 1:\n        outputCoords = 'outputCoords = ivec3(rc.x, rc.y+1, rc.z);';\n        break;\n      case 2:\n        outputCoords = 'outputCoords = ivec3(rc.x, rc.y, rc.z+1);';\n        break;\n      case 3:\n        outputCoords = 'outputCoords = ivec3(rc.x, rc.y+1, rc.z+1);';\n        break;\n      default:\n        throw new Error();\n    }\n\n    mainLoop += `\n        ${outputCoords}\n        ${i > 0 ? 'if(outputCoords.y < rows && outputCoords.z < cols){' : ''}\n          int flattenedIndex = getFlattenedIndex(outputCoords);\n\n          ivec3 inputRC = inputCoordsFromReshapedOutCoords(flattenedIndex);\n          vec2 innerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n          result[${i}] = getChannel(getA(inputRC.x, inputRC.y, inputRC.z), innerDims);\n\n        ${i > 0 ? '}' : ''}\n      `;\n  }\n  const glsl = getGlsl(handler.session.backend.glContext.version);\n\n  const shaderSource = `\n      ${getReshapedInputCoords(inputShape3D)}\n      ${getFlattenedIndexFrom3D(squeezedOutputShape)}\n      ${unpackFromChannel()}\n\n      void main() {\n        ivec3 rc = getOutputCoords();\n\n        vec4 result = vec4(0.0);\n\n        ivec3 outputCoords;\n        int rows = ${squeezedOutputShape[2]};\n        int cols = ${squeezedOutputShape[1]};\n\n        ${mainLoop}\n        ${glsl.output} = result;\n      }\n    `;\n\n  return {\n    ...metadata,\n    output: { dims: squeezedOutputShape, type: input3D.type, textureType: TextureType.packed },\n    shaderSource,\n    hasMain: true,\n  };\n};\n\nexport const createPackedReshape3DProgramInfoLoader = (\n  handler: WebGLInferenceHandler,\n  input3D: Tensor,\n  outputShape3D: readonly number[],\n): ProgramInfoLoader => {\n  const metadata = createPackedReshape3DProgramMetadata(outputShape3D);\n  return { ...metadata, get: () => createPackedReshape3DProgramInfo(handler, input3D, metadata, outputShape3D) };\n};\n\nexport function processDims3D(shape: ArrayLike<number>): [number, number, number] {\n  if (shape.length === 0) {\n    return [1, 1, 1];\n  }\n  // TODO: squeeze other shapes to 2D case\n  let batch = 1;\n  for (let i = 0; i < shape.length - 2; ++i) {\n    batch *= shape[i];\n  }\n  return [batch, shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1]];\n}\n\n// For packed reshape, we need to re-arrange texel data for output shape.\n// Our pack is designed to pack a 2x2 tile in last h and w dimension, so\n// for the reshaped new tensor, we just need to re-arrange the last h and\n// w dimension. For any shape that is not in 3D, i.e. [batch, W, H], we\n// first convert it to 3D by collapsing other dimension to batch dim, then\n// process with the last two dimensions.\n// Note: we only need the shape tensor to calculate output shape, so the\n// content in shape tensor is never uploaded to GPU. It is always kept in CPU.\n// TODO: optimize the algorithm -- in some cases, if the last two dims are\n// the same between input shape and output shape, the packed reshape can be\n// treated as no-op.\nexport function isReshapeCheap(dims: readonly number[], reshapedDims: readonly number[]) {\n  let isCheapReshape = false;\n  if (dims.length === 0 || reshapedDims.length === 0) {\n    // scalar\n    isCheapReshape = true;\n  } else if (dims.length < 2 || reshapedDims.length < 2) {\n    // 1D\n    isCheapReshape = dims[dims.length - 1] === reshapedDims[reshapedDims.length - 1];\n  } else {\n    // 2D +\n    isCheapReshape =\n      dims[dims.length - 1] === reshapedDims[reshapedDims.length - 1] &&\n      dims[dims.length - 2] === reshapedDims[reshapedDims.length - 2];\n  }\n\n  return isCheapReshape;\n}\n\nfunction getReshapedInputCoords(shape: [number, number, number]): string {\n  const strides = ShapeUtil.computeStrides(shape);\n  const coords = ['b', 'r', 'c'];\n  const index = 'index';\n  const coordsFromIndexSnippet = strides\n    .map((stride, i) => {\n      const line1 = `int ${coords[i]} = ${index} / ${stride}`;\n      const line2 =\n        i === strides.length - 1\n          ? `int ${coords[i + 1]} = ${index} - ${coords[i]} * ${stride}`\n          : `index -= ${coords[i]} * ${stride}`;\n      return `${line1}; ${line2};`;\n    })\n    .join('');\n\n  return `\n    ivec3 inputCoordsFromReshapedOutCoords(int index) {\n      ${coordsFromIndexSnippet}\n      return ivec3(b, r, c);\n    }\n  `;\n}\n\nfunction getFlattenedIndexFrom3D(shape: [number, number, number]): string {\n  const strides = ShapeUtil.computeStrides(shape);\n\n  return `\n  int getFlattenedIndex(ivec3 coords) {\n    // reverse y, z order\n    return coords.x * ${strides[0]} + coords.z * ${strides[1]} + coords.y;\n  }\n`;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { TextureData, TextureType } from '../types';\n\nexport const encodeAsUint8 = (inferenceHandler: WebGLInferenceHandler, input: TextureData): TextureData => {\n  const outputShape = input.shape;\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  /**\n   * https://github.com/tensorflow/tfjs-core/blob/master/src/kernels/webgl/encode_float_gpu.ts\n   */\n  const shaderSource = `\n    const float FLOAT_MAX = 1.70141184e38;\n    const float FLOAT_MIN = 1.17549435e-38;\n\n    bool isNaN(float val) {\n      return (val < 1.0 || 0.0 < val || val == 0.0) ? false : true;\n    }\n\n    highp vec4 encodeAsUint8(highp float v) {\n      if (isNaN(v)) {\n        return vec4(255, 255, 255, 255);\n      }\n\n      highp float av = abs(v);\n\n      if(av < FLOAT_MIN) {\n        return vec4(0.0, 0.0, 0.0, 0.0);\n      } else if(v > FLOAT_MAX) {\n        return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n      } else if(v < -FLOAT_MAX) {\n        return vec4(0.0, 0.0,  128.0, 255.0) / 255.0;\n      }\n\n      highp vec4 c = vec4(0,0,0,0);\n\n      highp float e = floor(log2(av));\n      highp float m = exp2(fract(log2(av))) - 1.0;\n\n      c[2] = floor(128.0 * m);\n      m -= c[2] / 128.0;\n      c[1] = floor(32768.0 * m);\n      m -= c[1] / 32768.0;\n      c[0] = floor(8388608.0 * m);\n\n      highp float ebias = e + 127.0;\n      c[3] = floor(ebias / 2.0);\n      ebias -= c[3] * 2.0;\n      c[2] += floor(ebias) * 128.0;\n\n      c[3] += 128.0 * step(0.0, -v);\n\n      return c / 255.0;\n    }\n\n    void main() {\n      float value = ${glsl.texture2D}(X,TexCoords).r;\n      ${glsl.output} = encodeAsUint8(value);\n    }`;\n  const programInfo = {\n    name: 'Uint8Encode',\n    inputTypes: [TextureType.unpacked],\n    inputNames: ['X'],\n    output: { dims: outputShape, type: input.tensor.type, textureType: TextureType.downloadUint8AsFloat },\n    shaderSource,\n    hasMain: true,\n  };\n  return inferenceHandler.executeProgram(programInfo, [input.tensor]);\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, TextureType } from '../types';\nimport { getCoordsDataType } from '../utils';\n\nimport { getChannels, unpackFromChannel } from './packing-utils';\n\nconst unpackProgramMetadata = {\n  name: 'unpack',\n  inputNames: ['A'],\n  inputTypes: [TextureType.packed],\n};\n\nexport const createUnpackProgramInfo = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfo => {\n  const rank = input.dims.length;\n\n  const channels = getChannels('rc', rank);\n  const innerDims = channels.slice(-2);\n  const coordsDataType = getCoordsDataType(rank);\n  const unpackChannel = unpackFromChannel();\n  const isScalar = input.dims.length === 0;\n  const sourceCoords = isScalar ? '' : getSourceCoords(rank, channels);\n  const coords = rank <= 1 ? 'rc' : `vec2(${innerDims.join(',')})`;\n  const glsl = getGlsl(handler.session.backend.glContext.version);\n  const shaderSource = `\n    ${unpackChannel}\n    void main() {\n      ${coordsDataType} rc = getOutputCoords();\n\n       // Sample the texture with the coords to get the rgba channel value.\n       vec4 packedInput = getA(${sourceCoords});\n\n       ${glsl.output} = vec4(getChannel(packedInput, ${coords}), 0, 0, 0);\n     }\n   `;\n\n  return {\n    ...unpackProgramMetadata,\n    hasMain: true,\n    output: { dims: input.dims, type: input.type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nexport const createUnpackProgramInfoLoader = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfoLoader => ({\n  ...unpackProgramMetadata,\n  get: () => createUnpackProgramInfo(handler, input),\n});\n\nfunction getSourceCoords(rank: number, dims: string[]): string {\n  if (rank === 1) {\n    return 'rc';\n  }\n\n  let coords = '';\n  for (let i = 0; i < rank; i++) {\n    coords += dims[i];\n    if (i < rank - 1) {\n      coords += ',';\n    }\n  }\n  return coords;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Logger } from '../../instrument';\n\nexport declare namespace Encoder {\n  export interface DataTypeMap {\n    float: Float32Array;\n    byte: Uint8Array;\n    int: Uint32Array;\n  }\n  export type DataType = keyof DataTypeMap;\n  type DataArrayType = DataTypeMap[DataType];\n}\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport const enum EncoderUsage {\n  Default = 0,\n  UploadOnly,\n  Download4BytesAsFloat32,\n}\n/* eslint-enable @typescript-eslint/naming-convention */\n\n/**\n * Abstraction for mapping data types to texture texlets\n * Encoding means how a Float32 is mapped to 1 or 4 channels for each texlet\n * Decoding means how a texlet's channels are mapped to a resulting Float32\n */\nexport interface DataEncoder {\n  internalFormat: number;\n  format: number;\n  textureType: number;\n  channelSize: number;\n  encode(src: Encoder.DataArrayType, textureSize: number): Encoder.DataArrayType;\n  allocate(size: number): Encoder.DataArrayType;\n  decode(buffer: Encoder.DataArrayType, dataSize: number): Encoder.DataArrayType;\n}\n/**\n * WebGL2 data encoder\n * Uses R32F as the format for texlet\n */\nexport class RedFloat32DataEncoder implements DataEncoder {\n  internalFormat: number;\n  format: number;\n  textureType: number;\n  channelSize: number;\n  constructor(gl: WebGL2RenderingContext, channels = 1) {\n    if (channels === 1) {\n      this.internalFormat = gl.R32F;\n      this.format = gl.RED;\n      this.textureType = gl.FLOAT;\n      this.channelSize = channels;\n    } else if (channels === 4) {\n      this.internalFormat = gl.RGBA32F;\n      this.format = gl.RGBA;\n      this.textureType = gl.FLOAT;\n      this.channelSize = channels;\n    } else {\n      throw new Error(`Invalid number of channels: ${channels}`);\n    }\n  }\n  encode(src: Encoder.DataArrayType, textureSize: number): Encoder.DataArrayType {\n    let result: Float32Array;\n    let source: Float32Array;\n    if (src.constructor !== Float32Array) {\n      Logger.warning('Encoder', 'data was not of type Float32; creating new Float32Array');\n      source = new Float32Array(src);\n    }\n    if (textureSize * this.channelSize > src.length) {\n      Logger.warning('Encoder', 'Source data too small. Allocating larger array');\n      source = src as Float32Array;\n      result = this.allocate(textureSize * this.channelSize) as Float32Array;\n      source.forEach((v, i) => (result[i] = v));\n    } else {\n      source = src as Float32Array;\n      result = source;\n    }\n    return result;\n  }\n  allocate(size: number): Encoder.DataArrayType {\n    return new Float32Array(size * 4);\n  }\n  decode(buffer: Encoder.DataArrayType, dataSize: number): Float32Array {\n    if (this.channelSize === 1) {\n      const filteredData = (buffer as Float32Array).filter((_value, index) => index % 4 === 0).subarray(0, dataSize);\n      return filteredData;\n    }\n    return buffer.subarray(0, dataSize) as Float32Array;\n  }\n}\n/**\n * Data encoder for WebGL 1 with support for floating point texture\n */\nexport class RGBAFloatDataEncoder implements DataEncoder {\n  internalFormat: number;\n  format: number;\n  textureType: number;\n  channelSize: number;\n  constructor(gl: WebGLRenderingContext, channels = 1, textureType?: number) {\n    if (channels !== 1 && channels !== 4) {\n      throw new Error(`Invalid number of channels: ${channels}`);\n    }\n    this.internalFormat = gl.RGBA;\n    this.format = gl.RGBA;\n    this.channelSize = channels;\n    this.textureType = textureType || gl.FLOAT;\n  }\n  encode(src: Float32Array, textureSize: number): Encoder.DataArrayType {\n    let dest = src;\n    if (this.channelSize === 1) {\n      Logger.verbose('Encoder', 'Exploding into a larger array');\n      dest = this.allocate(textureSize) as Float32Array;\n      src.forEach((v, i) => (dest[i * 4] = v));\n    }\n    return dest;\n  }\n  allocate(size: number): Encoder.DataArrayType {\n    return new Float32Array(size * 4);\n  }\n  decode(buffer: Encoder.DataArrayType, dataSize: number): Float32Array {\n    if (this.channelSize === 1) {\n      const filteredData = (buffer as Float32Array).filter((_value, index) => index % 4 === 0).subarray(0, dataSize);\n      return filteredData;\n    }\n    return buffer.subarray(0, dataSize) as Float32Array;\n  }\n}\n\nexport class Uint8DataEncoder implements DataEncoder {\n  internalFormat: number;\n  format: number;\n  textureType: number;\n  channelSize = 4;\n  constructor(gl: WebGLRenderingContext, channels = 1) {\n    if (channels === 1) {\n      this.internalFormat = gl.ALPHA;\n      this.format = gl.ALPHA; // not tested\n      this.textureType = gl.UNSIGNED_BYTE;\n      this.channelSize = channels;\n    } else if (channels === 4) {\n      this.internalFormat = gl.RGBA;\n      this.format = gl.RGBA;\n      this.textureType = gl.UNSIGNED_BYTE;\n      this.channelSize = channels;\n    } else {\n      throw new Error(`Invalid number of channels: ${channels}`);\n    }\n  }\n  encode(src: Uint8Array, _textureSize: number): Encoder.DataArrayType {\n    return new Uint8Array(src.buffer, src.byteOffset, src.byteLength);\n  }\n  allocate(size: number): Encoder.DataArrayType {\n    return new Uint8Array(size * this.channelSize);\n  }\n  decode(buffer: Encoder.DataArrayType, dataSize: number): Uint8Array {\n    if (buffer instanceof Uint8Array) {\n      return buffer.subarray(0, dataSize);\n    }\n    throw new Error(`Invalid array type: ${buffer.constructor}`);\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ShapeUtil } from '../../util';\n\nimport { TextureLayoutStrategy, WidthHeightPrefs } from './texture-layout-strategy';\nimport { TextureLayout, TextureType } from './types';\n\nexport const createTextureLayoutFromTextureType = (\n  textureLayoutStrategy: TextureLayoutStrategy,\n  shape: readonly number[],\n  textureType: TextureType,\n): TextureLayout => {\n  const channel = textureType === TextureType.unpacked || textureType === TextureType.unpackedReversed ? 1 : 4;\n  const isPacked = textureType === TextureType.packed;\n  const reverseWH = textureType === TextureType.unpackedReversed || textureType === TextureType.packed;\n  const breakAxis = textureType === TextureType.packedLastDimension ? shape.length - 1 : undefined;\n  const unpackedShape =\n    textureType === TextureType.packedLastDimension\n      ? shape.map((d, i) => (i === shape.length - 1 ? d * 4 : d))\n      : undefined;\n  return createTextureLayoutFromShape(textureLayoutStrategy, shape, channel, unpackedShape, {\n    isPacked,\n    reverseWH,\n    breakAxis,\n  });\n};\n\nexport const calculateTextureWidthAndHeight = (\n  textureLayoutStrategy: TextureLayoutStrategy,\n  shape: readonly number[],\n  textureType: TextureType,\n): [number, number] => {\n  const layout = createTextureLayoutFromTextureType(textureLayoutStrategy, shape, textureType);\n  return [layout.width, layout.height];\n};\n\n/**\n * Create a TextureLayout object from shape.\n */\nexport const createTextureLayoutFromShape = (\n  textureLayoutStrategy: TextureLayoutStrategy,\n  shape: readonly number[],\n  channels: 1 | 4 = 1,\n  unpackedShape?: readonly number[],\n  prefs?: WidthHeightPrefs,\n): TextureLayout => {\n  const isPacked = !!(prefs && prefs.isPacked);\n  const [width, height] = textureLayoutStrategy.computeTextureWH(isPacked ? unpackedShape || shape : shape, prefs);\n  const rank = shape.length;\n  let inferredDims = shape.slice(0);\n  if (rank === 0) {\n    inferredDims = [1];\n  }\n  if (channels === 1) {\n    // unpackedShape will take `shape` and not `inferredDims` so as to create a scalar Tensor if need be\n    unpackedShape = shape;\n  } else if (isPacked) {\n    if (channels !== 4) {\n      throw new Error('a packed texture must be 4-channel');\n    }\n    unpackedShape = shape;\n    if (rank > 0) {\n      inferredDims[rank - 1] = Math.ceil(inferredDims[rank - 1] / 2);\n    }\n    if (rank > 1) {\n      inferredDims[rank - 2] = Math.ceil(inferredDims[rank - 2] / 2);\n    }\n  } else if (!unpackedShape) {\n    throw new Error('Unpacked shape is needed when using channels > 1');\n  }\n  return {\n    width,\n    height,\n    channels,\n    isPacked,\n    shape: inferredDims,\n    strides: ShapeUtil.computeStrides(inferredDims),\n    unpackedShape,\n    reversedWH: prefs && prefs.reverseWH,\n  };\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { InferenceHandler } from '../../backend';\nimport { Logger } from '../../instrument';\nimport { Tensor } from '../../tensor';\nimport { ShapeUtil } from '../../util';\n\nimport { createPackProgramInfoLoader } from './ops/pack';\nimport { createPackedReshape3DProgramInfoLoader, isReshapeCheap, processDims3D } from './ops/reshape-packed';\nimport { encodeAsUint8 } from './ops/uint8-encode';\nimport { createUnpackProgramInfoLoader } from './ops/unpack';\nimport { WebGLSessionHandler } from './session-handler';\nimport { EncoderUsage } from './texture-data-encoder';\nimport {\n  calculateTextureWidthAndHeight,\n  createTextureLayoutFromShape,\n  createTextureLayoutFromTextureType,\n} from './texture-layout';\nimport { Artifact, ProgramInfo, ProgramInfoLoader, TextureData, TextureLayout, TextureType } from './types';\n\nconst getProgramInfoUniqueKey = (\n  programInfo: ProgramInfo | ProgramInfoLoader,\n  inputTextureDatas: TextureData[],\n): string => {\n  const inputs = inputTextureDatas\n    .map((texture) => `${texture.unpackedShape.join(',')};${texture.width}x${texture.height}`)\n    .join('_');\n  let key = programInfo.name;\n  if (programInfo.cacheHint) {\n    key += '[' + programInfo.cacheHint + ']';\n  }\n  key += ':' + inputs;\n  return key;\n};\n\nexport class WebGLInferenceHandler implements InferenceHandler {\n  private packedTextureDataCache: Map<Tensor.Id, TextureData>;\n  private unpackedTextureDataCache: Map<Tensor.Id, TextureData>;\n  constructor(public session: WebGLSessionHandler) {\n    this.packedTextureDataCache = new Map();\n    this.unpackedTextureDataCache = new Map();\n  }\n\n  /**\n   * @returns [width, height]\n   */\n  calculateTextureWidthAndHeight(shape: readonly number[], textureType: TextureType): [number, number] {\n    return calculateTextureWidthAndHeight(this.session.layoutStrategy, shape, textureType);\n  }\n\n  executeProgram(program: ProgramInfo | ProgramInfoLoader, inputs: readonly Tensor[]): TextureData {\n    if (inputs.length < program.inputNames.length) {\n      throw new Error(`Input size mustn't be less than ${program.inputNames.length}.`);\n    }\n    if (program.inputNames.length !== program.inputTypes.length) {\n      throw new Error('input names size does not match input types');\n    }\n\n    // create texture info for input\n    const inputTextureDatas: TextureData[] = [];\n    for (let i = 0; i < program.inputNames.length; ++i) {\n      inputTextureDatas[i] = this.getOrCreateTextureData(inputs[i], program.inputTypes[i]);\n    }\n\n    const key = getProgramInfoUniqueKey(program, inputTextureDatas);\n    let artifact = this.session.programManager.getArtifact(key);\n    const programInfo = artifact\n      ? artifact.programInfo\n      : typeof (program as ProgramInfoLoader).get === 'function'\n        ? (program as ProgramInfoLoader).get()\n        : (program as ProgramInfo);\n\n    // create texture info for output\n    const outputTextureLayout = createTextureLayoutFromTextureType(\n      this.session.layoutStrategy,\n      programInfo.output.dims,\n      programInfo.output.textureType,\n    );\n    const outputTextureData = this.createTextureData(outputTextureLayout, programInfo.output.type);\n\n    if (!artifact) {\n      artifact = this.session.programManager.build(programInfo, inputTextureDatas, outputTextureData);\n      this.session.programManager.setArtifact(key, artifact);\n    }\n\n    this.runProgram(artifact, inputTextureDatas, outputTextureData);\n    return outputTextureData;\n  }\n\n  run(program: ProgramInfoLoader, inputs: readonly Tensor[]): Tensor {\n    const outputTextureData = this.executeProgram(program, inputs);\n    return outputTextureData.tensor;\n  }\n\n  private runProgram(artifact: Artifact, inputs: TextureData[], output: TextureData): void {\n    // input should match\n    for (let i = 0; i < inputs.length; ++i) {\n      if (!!inputs[i].isPacked !== (artifact.programInfo.inputTypes[i] === TextureType.packed)) {\n        throw new Error(`input[${i}] property packed inconsistent`);\n      }\n    }\n\n    // output should match\n    if (!!output.isPacked !== (artifact.programInfo.output.textureType === TextureType.packed)) {\n      throw new Error('output property packed inconsistent');\n    }\n\n    this.session.programManager.run(artifact, inputs, output);\n  }\n\n  /**\n   * Create a TextureData object from a tensor.\n   * Usage = EncoderUsage.UploadOnly.\n   * If a related texture data is found in cache, returns it;\n   * Otherwise:\n   *   Creates a new texture layout if not provided;\n   *   Creates WebGLTexture with the layout;\n   *   Upload tensor data to the texture;\n   *   Creates a texture data object associated with the given tensor.\n   * @param tensor the tensor with data to upload\n   */\n  private getOrCreateTextureData(tensor: Tensor, textureType: TextureType) {\n    let td = this.getTextureData(tensor.dataId, textureType === TextureType.packed);\n\n    if (!td) {\n      // check if we have texture data in different type\n      td = this.getTextureData(tensor.dataId, textureType !== TextureType.packed);\n      if (td) {\n        if (textureType === TextureType.packed) {\n          return this.pack(td);\n        } else {\n          return this.unpack(td);\n        }\n      }\n    }\n\n    if (!td) {\n      const layout = createTextureLayoutFromTextureType(this.session.layoutStrategy, tensor.dims, textureType);\n\n      if (textureType === TextureType.packedLastDimension) {\n        const group = 1;\n        const channels = 4;\n        const shape = tensor.dims;\n        if (shape.length === 4) {\n          // pre-processing for kernel data of Conv.\n          //\n          // TODO: currently this is a hacking to overwrite Conv's weight. The correct way to do this should be:\n          // 1. implement texture based const-folding\n          // 2. create a WebGL program \"preprocessConvWeight\" to do the same work as below\n          // 3. run the program before dotProduct.\n          //\n          const adjustedKernelShape = [shape[0], Math.ceil((shape[1] * shape[2] * shape[3]) / channels)];\n          const adjustedLayout = createTextureLayoutFromTextureType(\n            this.session.layoutStrategy,\n            adjustedKernelShape,\n            textureType,\n          );\n          let buffer = tensor.numberData;\n          if ((shape[1] * shape[2] * shape[3]) % channels !== 0) {\n            const numFeatureMaps = shape[0];\n            const oldRowSize = shape[1] * shape[2] * shape[3];\n            const newRowSize = Math.ceil((oldRowSize * group) / channels) * channels;\n            const newSize = numFeatureMaps * newRowSize;\n            buffer = new Float32Array(newSize);\n            for (let f = 0; f < numFeatureMaps; ++f) {\n              const oldOffset = f * oldRowSize;\n              const newOffset = f * newRowSize + (f % group) * oldRowSize;\n              buffer.set(tensor.numberData.subarray(oldOffset, oldOffset + oldRowSize), newOffset);\n            }\n          }\n          return this.createTextureData(adjustedLayout, tensor.type, buffer, tensor, EncoderUsage.UploadOnly);\n        }\n      }\n\n      if (textureType === TextureType.packed) {\n        const unpackedTextureLayout = createTextureLayoutFromShape(this.session.layoutStrategy, tensor.dims, 1, [], {\n          reverseWH: true,\n        });\n        const unpackedTextureData = this.createTextureData(\n          unpackedTextureLayout,\n          tensor.type,\n          tensor.numberData,\n          tensor,\n          EncoderUsage.UploadOnly,\n        );\n        td = this.pack(unpackedTextureData);\n      } else {\n        td = this.createTextureData(layout, tensor.type, tensor.numberData, tensor, EncoderUsage.UploadOnly);\n      }\n    }\n    return td;\n  }\n\n  /**\n   * Create a TextureData object using the given data and bind to the given tensor.\n   * Usage = EncoderUsage.UploadOnly.\n   * NOTE: this function is a hack for Conv implementation. should remove this function, after rewriting Conv\n   * implementation by Graph.Transformer\n   * @param dataType the tensor data type\n   * @param data the actual data to upload\n   * @param tensor the tensor to bind. tensor's data is ignored.\n   */\n  createTextureDataFromLayoutBindTensor(\n    layout: TextureLayout,\n    dataType: Tensor.DataType,\n    data: Tensor.NumberType,\n    tensor: Tensor,\n  ): TextureData {\n    return this.createTextureData(layout, dataType, data, tensor, EncoderUsage.UploadOnly);\n  }\n\n  private createTextureData(\n    layout: TextureLayout,\n    dataType: Tensor.DataType,\n    data?: Tensor.NumberType,\n    tensor?: Tensor,\n    usage?: EncoderUsage,\n  ): TextureData {\n    Logger.verbose('InferenceHandler', `Creating TextureData: layout:[${JSON.stringify(layout)}]`);\n    const texture = this.session.textureManager.createTextureFromLayout(dataType, layout, data, usage);\n    return this.createTextureDataFromTexture(layout, dataType, texture, tensor);\n  }\n\n  reshapeUnpacked(input: Tensor, reshapedDims: readonly number[]): Tensor {\n    const inputTD = this.getOrCreateTextureData(input, TextureType.unpacked);\n    const newTextureLayout: TextureLayout = {\n      channels: inputTD.channels,\n      height: inputTD.height,\n      width: inputTD.width,\n      // handle reshaping into scalar Tensors\n      shape: reshapedDims.length !== 0 ? reshapedDims : [1],\n      strides: ShapeUtil.computeStrides(reshapedDims),\n      unpackedShape: reshapedDims,\n    };\n    const newTextureData = this.createTextureDataFromTexture(newTextureLayout, input.type, inputTD.texture);\n    return newTextureData.tensor;\n  }\n\n  reshapePacked(input: Tensor, reshapedDims: readonly number[]): Tensor {\n    const inputTD = this.getOrCreateTextureData(input, TextureType.packed);\n\n    // check if the reshape is 'cheap'\n    if (isReshapeCheap(input.dims, reshapedDims)) {\n      const newTextureLayout: TextureLayout = {\n        channels: inputTD.channels,\n        height: inputTD.height,\n        width: inputTD.width,\n        // handle reshaping into scalar Tensors\n        shape: reshapedDims.length !== 0 ? reshapedDims : [1],\n        strides: ShapeUtil.computeStrides(reshapedDims),\n        unpackedShape: reshapedDims,\n        isPacked: true,\n      };\n      const newTextureData = this.createTextureDataFromTexture(newTextureLayout, input.type, inputTD.texture);\n      return newTextureData.tensor;\n    }\n\n    const squeezedInputShape = processDims3D(input.dims);\n    const squeezedOutputShape = processDims3D(reshapedDims);\n\n    const squeezedInputTensor = this.reshapePacked(input, squeezedInputShape);\n    const squeezedOutputTensor = this.run(\n      createPackedReshape3DProgramInfoLoader(this, squeezedInputTensor, squeezedOutputShape),\n      [squeezedInputTensor],\n    );\n    const outputTensor = this.reshapePacked(squeezedOutputTensor, reshapedDims);\n    return outputTensor;\n  }\n\n  cast(input: Tensor, type: Tensor.DataType): Tensor {\n    const inputTD = this.getOrCreateTextureData(input, TextureType.unpacked);\n    const newTextureData = this.createTextureDataFromTexture(inputTD as TextureLayout, type, inputTD.texture);\n    return newTextureData.tensor;\n  }\n\n  private createTextureDataFromTexture(\n    layout: TextureLayout,\n    dataType: Tensor.DataType,\n    texture: WebGLTexture,\n    tensor?: Tensor,\n    tensorId?: Tensor.Id,\n  ) {\n    const textureData: TextureData = {\n      ...layout,\n      tensor:\n        tensor ||\n        new Tensor(\n          layout.unpackedShape,\n          dataType,\n          (_id: Tensor.Id) => this.readTexture(textureData),\n          async (_id: Tensor.Id) => this.readTextureAsync(textureData),\n          undefined,\n          tensorId,\n        ),\n      texture,\n    };\n    this.setTextureData(textureData.tensor.dataId, textureData, layout.isPacked);\n    return textureData;\n  }\n\n  private getTextureData(tensorId: Tensor.Id, isPacked = false): TextureData | undefined {\n    return this.session.isInitializer(tensorId)\n      ? this.session.getTextureData(tensorId, isPacked)\n      : isPacked\n        ? this.packedTextureDataCache.get(tensorId)\n        : this.unpackedTextureDataCache.get(tensorId);\n  }\n  setTextureData(tensorId: Tensor.Id, td: TextureData, isPacked = false): void {\n    if (this.session.isInitializer(tensorId)) {\n      this.session.setTextureData(tensorId, td, isPacked);\n    } else {\n      (isPacked ? this.packedTextureDataCache : this.unpackedTextureDataCache).set(tensorId, td);\n    }\n  }\n  isTextureLayoutCached(tensor: Tensor, isPacked = false): boolean {\n    return !!this.getTextureData(tensor.dataId, isPacked);\n  }\n\n  dispose(): void {\n    this.session.textureManager.clearActiveTextures();\n    this.packedTextureDataCache.forEach((td) => this.session.textureManager.releaseTexture(td));\n    this.packedTextureDataCache = new Map();\n    this.unpackedTextureDataCache.forEach((td) => this.session.textureManager.releaseTexture(td));\n    this.unpackedTextureDataCache = new Map();\n  }\n\n  readTexture(textureData: TextureData): Tensor.NumberType {\n    if (textureData.isPacked) {\n      return this.readTexture(this.unpack(textureData));\n    }\n    if (!this.session.backend.glContext.isFloat32DownloadSupported) {\n      return this.session.textureManager.readUint8TextureAsFloat(encodeAsUint8(this, textureData));\n    }\n    return this.session.textureManager.readTexture(textureData, textureData.tensor.type, textureData.channels);\n  }\n\n  async readTextureAsync(textureData: TextureData): Promise<Tensor.NumberType> {\n    if (textureData.isPacked) {\n      return this.readTextureAsync(this.unpack(textureData));\n    }\n    if (!this.session.backend.glContext.isFloat32DownloadSupported) {\n      return this.session.textureManager.readUint8TextureAsFloat(encodeAsUint8(this, textureData));\n    }\n    return this.session.textureManager.readTextureAsync(textureData, textureData.tensor.type, textureData.channels);\n  }\n\n  pack(input: TextureData): TextureData {\n    const outputTextureData = this.executeProgram(createPackProgramInfoLoader(this, input.tensor), [input.tensor]);\n    return outputTextureData;\n  }\n\n  unpack(input: TextureData): TextureData {\n    const outputTextureData = this.executeProgram(createUnpackProgramInfoLoader(this, input.tensor), [input.tensor]);\n    return outputTextureData;\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nclass AttributeWithCacheKeyImpl {\n  constructor(attribute: Record<string, unknown>) {\n    Object.assign(this, attribute);\n  }\n\n  private key: string;\n  public get cacheKey(): string {\n    if (!this.key) {\n      this.key = Object.getOwnPropertyNames(this)\n        .sort()\n        .map((name) => `${(this as Record<string, unknown>)[name]}`)\n        .join(';');\n    }\n    return this.key;\n  }\n}\n\nexport interface AttributeWithCacheKey {\n  readonly cacheKey: string;\n}\n\nexport const createAttributeWithCacheKey = <T extends Record<string, unknown>>(\n  attribute: T,\n): T & AttributeWithCacheKey => new AttributeWithCacheKeyImpl(attribute) as unknown as T & AttributeWithCacheKey;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, TextureType } from '../types';\n\nexport interface BatchNormalizationAttributes extends AttributeWithCacheKey {\n  epsilon: number;\n  momentum: number;\n  spatial: number;\n}\n\nconst batchNormalizationProgramMetadata = {\n  name: 'BatchNormalization',\n  inputNames: ['A', 'Scale', 'B', 'Mean', 'Variance'],\n  inputTypes: [\n    TextureType.unpacked,\n    TextureType.unpacked,\n    TextureType.unpacked,\n    TextureType.unpacked,\n    TextureType.unpacked,\n  ],\n};\n\nexport const batchNormalization: OperatorImplementation<BatchNormalizationAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: BatchNormalizationAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n  const output = inferenceHandler.run(\n    {\n      ...batchNormalizationProgramMetadata,\n      cacheHint: attributes.cacheKey,\n      get: () => createBatchNormalizationProgramInfo(inferenceHandler, inputs, attributes),\n    },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parseBatchNormalizationAttributes: OperatorInitialization<BatchNormalizationAttributes> = (\n  node: Graph.Node,\n): BatchNormalizationAttributes => {\n  const epsilon = node.attributes.getFloat('epsilon', 1e-5);\n  const momentum = node.attributes.getFloat('momentum', 0.9);\n  const spatial = node.attributes.getInt('spatial', 1);\n  return createAttributeWithCacheKey({ epsilon, momentum, spatial });\n};\n\nconst createBatchNormalizationProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: BatchNormalizationAttributes,\n): ProgramInfo => {\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const rank = inputs[0].dims.length;\n  const [scaleWidth, scaleHeight] = inferenceHandler.calculateTextureWidthAndHeight(\n    inputs[1].dims,\n    TextureType.unpacked,\n  );\n  const shaderSource = `\n  float process(int[${rank}] indices) {\n    vec2 position = offsetToCoords(indices[1], ${scaleWidth}, ${scaleHeight});\n    float scale = getColorAsFloat(${glsl.texture2D}(Scale, position));\n    float mean = getColorAsFloat(${glsl.texture2D}(Mean, position));\n    float variance = getColorAsFloat(${glsl.texture2D}(Variance, position));\n    float b = getColorAsFloat(${glsl.texture2D}(B, position));\n\n    return scale * ( (_A(indices) - mean) / sqrt(variance + float(${attributes.epsilon})) ) + b;\n  }`;\n  return {\n    ...batchNormalizationProgramMetadata,\n    output: { dims: inputs[0].dims, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 5) {\n    throw new Error('BatchNormalization requires 5 inputs.');\n  }\n\n  const X = inputs[0];\n  const scale = inputs[1];\n  const B = inputs[2];\n  const mean = inputs[3];\n  const var_ = inputs[4];\n\n  // input should atleast have three dimensions - N,C,dim1,...,dimn\n  // other inputs can have only one dimensions\n  if (\n    X.dims.length < 3 ||\n    scale.dims.length !== 1 ||\n    B.dims.length !== 1 ||\n    mean.dims.length !== 1 ||\n    var_.dims.length !== 1\n  ) {\n    throw new Error('invalid input shape.');\n  }\n  if (\n    scale.dims[0] !== X.dims[1] ||\n    B.dims[0] !== X.dims[1] ||\n    mean.dims[0] !== X.dims[1] ||\n    var_.dims[0] !== X.dims[1]\n  ) {\n    throw new Error('invalid input shape.');\n  }\n  if (\n    (X.type !== 'float32' && X.type !== 'float64') ||\n    (scale.type !== 'float32' && scale.type !== 'float64') ||\n    (B.type !== 'float32' && B.type !== 'float64') ||\n    (mean.type !== 'float32' && mean.type !== 'float64') ||\n    (var_.type !== 'float32' && var_.type !== 'float64')\n  ) {\n    throw new Error('invalid input tensor types.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ProgramInfo, TextureLayout } from './types';\nimport { WebGLContext } from './webgl-context';\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport enum FunctionType {\n  ValueBased,\n  Positional,\n}\nexport interface GlslFunction<T extends FunctionType> {\n  body: string;\n  name: string;\n  type: T;\n}\nexport type GlslValueFunction = GlslFunction<FunctionType.ValueBased>;\nexport interface GlslPositionalFunction extends GlslFunction<FunctionType.Positional> {\n  inputShape: readonly number[];\n  outputShape: readonly number[];\n}\n\nexport class GlslContext {\n  constructor(\n    public glContext: WebGLContext,\n    public programInfo: ProgramInfo,\n    public inputTextureLayouts: TextureLayout[],\n    public outputTextureLayout: TextureLayout,\n  ) {}\n}\nexport abstract class GlslLib {\n  constructor(public context: GlslContext) {}\n  abstract getFunctions(): { [name: string]: GlslLibRoutine };\n  abstract getCustomTypes(): { [name: string]: string };\n}\n\n// abstraction to represent a GLSL library routine and it's dependencies\nexport class GlslLibRoutine {\n  constructor(\n    public routineBody: string,\n    public dependencies?: string[],\n  ) {}\n}\n\n// abstraction to represent a GLSL library routine and it's dependencies AS GRAPH Nodes\n// this level of abstraction is used to topologically sort routines before fragment shade inclusion\nexport class GlslLibRoutineNode {\n  dependencies: GlslLibRoutineNode[];\n  routineBody: string;\n  constructor(\n    public name: string,\n    routineBody?: string,\n    dependencies?: GlslLibRoutineNode[],\n  ) {\n    if (dependencies) {\n      this.dependencies = dependencies;\n    } else {\n      this.dependencies = [];\n    }\n\n    if (routineBody) {\n      this.routineBody = routineBody;\n    }\n  }\n  addDependency(node: GlslLibRoutineNode) {\n    if (node) {\n      this.dependencies.push(node);\n    }\n  }\n}\n\n// topologically sort GLSL library routines (graph nodes abstraction) before shader script inclusion\nexport class TopologicalSortGlslRoutines {\n  static returnOrderedNodes(nodes: GlslLibRoutineNode[]): GlslLibRoutineNode[] {\n    if (!nodes || nodes.length === 0) {\n      return [];\n    }\n\n    if (nodes.length === 1) {\n      return nodes;\n    }\n\n    const cycleCheck = new Set<string>();\n    const alreadyTraversed = new Set<string>();\n    const result = new Array<GlslLibRoutineNode>();\n\n    this.createOrderedNodes(nodes, cycleCheck, alreadyTraversed, result);\n    return result;\n  }\n\n  private static createOrderedNodes(\n    graphNodes: GlslLibRoutineNode[],\n    cycleCheck: Set<string>,\n    alreadyTraversed: Set<string>,\n    result: GlslLibRoutineNode[],\n  ) {\n    for (let i = 0; i < graphNodes.length; ++i) {\n      this.dfsTraverse(graphNodes[i], cycleCheck, alreadyTraversed, result);\n    }\n  }\n\n  private static dfsTraverse(\n    root: GlslLibRoutineNode,\n    cycleCheck: Set<string>,\n    alreadyTraversed: Set<string>,\n    result: GlslLibRoutineNode[],\n  ) {\n    // if this root has already been traversed return\n    if (!root || alreadyTraversed.has(root.name)) {\n      return;\n    }\n\n    // cyclic dependency has been detected\n    if (cycleCheck.has(root.name)) {\n      throw new Error(\"Cyclic dependency detected. Can't topologically sort routines needed for shader.\");\n    }\n\n    // hold this node to detect cycles if any\n    cycleCheck.add(root.name);\n\n    // traverse children in a dfs fashion\n    const dependencies = root.dependencies;\n    if (dependencies && dependencies.length > 0) {\n      for (let i = 0; i < dependencies.length; ++i) {\n        this.dfsTraverse(dependencies[i], cycleCheck, alreadyTraversed, result);\n      }\n    }\n\n    // add to result holder\n    result.push(root);\n\n    // mark this node as traversed so that we don't traverse from this again\n    alreadyTraversed.add(root.name);\n\n    // release the hold\n    cycleCheck.delete(root.name);\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { BroadcastUtil, ShapeUtil } from '../../../util';\nimport { FunctionType, GlslValueFunction } from '../glsl-definitions';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, TextureType } from '../types';\n\nexport function glslAdd(): GlslValueFunction {\n  const name = 'add_';\n  const body = `\n  float ${name}(float a, float b) {\n    return a + b;\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    return v1 + v2;\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslDiv(): GlslValueFunction {\n  const name = 'div_';\n  const body = `\n  float ${name}(float a, float b) {\n    return a / b;\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    return v1 / v2;\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslMul(): GlslValueFunction {\n  const name = 'mul_';\n  const body = `\n  float ${name}(float a, float b) {\n    return a * b;\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    return v1 * v2;\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslSub(): GlslValueFunction {\n  const name = 'sub_';\n  const body = `\n  float ${name}(float a, float b) {\n    return a - b;\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    return v1 - v2;\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslEqual(): GlslValueFunction {\n  const name = 'equal_';\n  const body = `\n  float ${name}(float a, float b) {\n    return float(a == b);\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    return vec4(equal(v1, v2));\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslGreater(): GlslValueFunction {\n  const name = 'greater_';\n  const body = `\n  float ${name}(float a, float b) {\n    return float(a > b);\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    return vec4( v1.r > v2.r ,\n      v1.g > v2.g,\n      v1.b > v2.b,\n      v1.a > v2.a );\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslLess(): GlslValueFunction {\n  const name = 'less_';\n  const body = `\n  float ${name}(float a, float b) {\n    return float(a < b);\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    return vec4( v1.r < v2.r ,\n                v1.g < v2.g,\n                v1.b < v2.b,\n                v1.a < v2.a );\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslAnd(): GlslValueFunction {\n  const name = 'and_';\n  const body = `\n  float ${name}(float a, float b) {\n    return float( bool(a) && bool(b) );\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    bvec4 b1 = bvec4(v1);\n    bvec4 b2 = bvec4(v2);\n    return vec4( b1.r && b2.r ,\n                b1.g && b2.g,\n                b1.b && b2.b,\n                b1.a && b2.a );\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslOr(): GlslValueFunction {\n  const name = 'or_';\n  const body = `\n  float ${name}(float a, float b) {\n    return float( bool(a) || bool(b) );\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    bvec4 b1 = bvec4(v1);\n    bvec4 b2 = bvec4(v2);\n    return vec4( b1.r || b2.r ,\n                b1.g || b2.g,\n                b1.b || b2.b,\n                b1.a || b2.a );\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslXor(): GlslValueFunction {\n  const name = 'xor_';\n  const body = `\n  float ${name}(float a, float b) {\n    return float( bool(a) ^^ bool(b) );\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    bvec4 b1 = bvec4(v1);\n    bvec4 b2 = bvec4(v2);\n    return vec4( b1.r ^^ b2.r ,\n                b1.g ^^ b2.g,\n                b1.b ^^ b2.b,\n                b1.a ^^ b2.a );\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslPow(): GlslValueFunction {\n  return glslBuiltinBinary('pow');\n}\nexport function glslPRelu(): GlslValueFunction {\n  const name = 'prelu_';\n  const body = `\n  float ${name}(float a, float b) {\n    return a < 0.0 ? a * b: a;\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    return vec4(\n      v1.r < 0.0 ? v1.r * v2.r: v1.r,\n      v1.g < 0.0 ? v1.g * v2.g: v1.g,\n      v1.b < 0.0 ? v1.b * v2.b: v1.b,\n      v1.a < 0.0 ? v1.a * v2.a: v1.a\n      );\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\n\nfunction glslBuiltinBinary(fname: string): GlslValueFunction {\n  const name = `${fname}_`;\n  const body = `\n  float ${name}(float a, float b) {\n    return ${fname}(a, b);\n  }\n  vec4 ${name}(vec4 v1, vec4 v2) {\n    return ${fname}(v1, v2);\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\n\nconst createBinaryProgramInfoLoader = (\n  handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  glslFunc: GlslValueFunction,\n  outputTensorType: Tensor.DataType = inputs[0].type,\n  cacheKey?: string,\n): ProgramInfoLoader => {\n  const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n  return {\n    name: glslFunc.name,\n    inputNames: ['A', 'B'],\n    inputTypes: [textureType, textureType],\n    cacheHint: cacheKey,\n    get: () => createBinaryProgramInfo(handler, inputs, glslFunc, outputTensorType),\n  };\n};\n\nconst createBinaryProgramInfo = (\n  handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  glslFunc: GlslValueFunction,\n  outputTensorType: Tensor.DataType = inputs[0].type,\n): ProgramInfo => {\n  const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n  const isBroadcast = !ShapeUtil.areEqual(inputs[0].dims, inputs[1].dims);\n  let outputShape = inputs[0].dims;\n\n  const usePackedTexture = handler.session.pack;\n\n  if (isBroadcast) {\n    const calculatedShape = BroadcastUtil.calcShape(inputs[0].dims, inputs[1].dims, false);\n    if (!calculatedShape) {\n      throw new Error(\"Can't perform binary op on the given tensors\");\n    }\n    outputShape = calculatedShape;\n    const outputRank = outputShape.length;\n    const aRank = inputs[0].dims.length !== 0 ? inputs[0].dims.length : 1;\n    const bRank = inputs[1].dims.length !== 0 ? inputs[1].dims.length : 1;\n    const aBcast = inputs[0].dims.length !== 0 ? 'bcastIndices_A(indices, aindices);' : 'aindices[0] = 0;';\n    const bBcast = inputs[1].dims.length !== 0 ? 'bcastIndices_B(indices, bindices);' : 'bindices[0] = 0;';\n\n    const glsl = getGlsl(handler.session.backend.glContext.version);\n    const shaderSource = usePackedTexture\n      ? `\n      ${glslFunc.body}\n      void main() {\n        vec4 a = getAAtOutCoords();\n        vec4 b = getBAtOutCoords();\n        vec4 result = ${glslFunc.name}(a, b);\n        ${glsl.output} = result;\n      }`\n      : `\n      ${glslFunc.body}\n      float process(int indices[${outputRank}]) {\n        int aindices[${aRank}];\n        int bindices[${bRank}];\n        ${aBcast}\n        ${bBcast}\n        return ${glslFunc.name}(_A(aindices), _B(bindices));\n      }`;\n\n    return {\n      name: glslFunc.name,\n      inputNames: ['A', 'B'],\n      inputTypes: [textureType, textureType],\n      output: { dims: outputShape, type: outputTensorType, textureType },\n      shaderSource,\n      hasMain: usePackedTexture,\n    };\n  }\n  const glsl = getGlsl(handler.session.backend.glContext.version);\n  const shaderSource = `\n    ${glslFunc.body}\n    void main() {\n      vec4 v1 = ${glsl.texture2D}(A, TexCoords);\n      vec4 v2 = ${glsl.texture2D}(B, TexCoords);\n      vec4 result = ${glslFunc.name}(v1, v2);\n      ${glsl.output} = result;\n    }\n    `;\n\n  return {\n    name: glslFunc.name,\n    inputNames: ['A', 'B'],\n    inputTypes: [textureType, textureType],\n    output: { dims: inputs[0].dims, type: outputTensorType, textureType },\n    shaderSource,\n    hasMain: true,\n  };\n};\n\nexport const add = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslAdd()), inputs),\n];\n\nexport const and = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslAnd(), 'bool'), inputs),\n];\n\nexport const div = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslDiv()), inputs),\n];\n\nexport const equal = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslEqual(), 'bool'), inputs),\n];\n\nexport const greater = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslGreater(), 'bool'), inputs),\n];\n\nexport const less = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslLess(), 'bool'), inputs),\n];\n\nexport const mul = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslMul()), inputs),\n];\n\nexport const or = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslOr(), 'bool'), inputs),\n];\n\nexport const pow = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslPow()), inputs),\n];\n\nexport const pRelu = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslPRelu()), inputs),\n];\n\nexport const sub = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslSub()), inputs),\n];\n\nexport const xor = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createBinaryProgramInfoLoader(handler, inputs, glslXor(), 'bool'), inputs),\n];\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ProtoUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\n\nexport const cast: OperatorImplementation<Tensor.DataType> = (\n  handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  to: Tensor.DataType,\n): Tensor[] => {\n  validateInputs(inputs);\n  return [handler.cast(inputs[0], to)];\n};\n\nexport const parseCastAttributes: OperatorInitialization<Tensor.DataType> = (node: Graph.Node): Tensor.DataType =>\n  ProtoUtil.tensorDataTypeFromProto(node.attributes.getInt('to'));\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Cast requires 1 input.');\n  }\n\n  if (inputs[0].type === 'string') {\n    throw new Error('Invalid input type.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\nimport { getCoordsDataType, getGlChannels } from '../utils';\n\nimport { ConcatAttributes } from './concat';\nimport { getChannels, unpackFromChannel } from './packing-utils';\n\nconst createPackedConcatProgramMetadata = (inputCount: number, cacheHint: string) => ({\n  name: 'Concat (packed)',\n  inputNames: Array.from({ length: inputCount }, (_v, i) => `X${i}`),\n  inputTypes: Array(inputCount).fill(TextureType.packed),\n  cacheHint,\n});\n\nconst createPackedConcatProgramInfo = (\n  handler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  inputs: Tensor[],\n  axis: number,\n): ProgramInfo => {\n  const inputShape = inputs[0].dims.slice();\n  if (axis >= inputShape.length || axis < -1 * inputShape.length) {\n    throw new Error(\"axis specified for concat doesn't match input dimensionality\");\n  }\n  if (axis < 0) {\n    axis = inputShape.length + axis;\n  }\n  // ensure all of the non-concatenated axes match each other\n  // calculate the shape of the output tensor while we do that\n  const outputShape = inputShape.slice(0);\n  for (let i = 1; i < inputs.length; i++) {\n    const dataNShape = inputs[i].dims.slice();\n    for (let axisIndex = 0; axisIndex < inputShape.length; axisIndex++) {\n      // add to the placeholder for computing output shape\n      if (axisIndex === axis) {\n        outputShape[axis] += dataNShape[axisIndex];\n      }\n      // ensure all non-cancatenated axes match each other\n      else if (inputShape[axisIndex] !== dataNShape[axisIndex]) {\n        throw new Error('non concat dimensions must match');\n      }\n    }\n  }\n\n  const rank = outputShape.length;\n  const coords = getChannels('coords', rank);\n  const dtype = getCoordsDataType(rank);\n  const unpackChannel = unpackFromChannel();\n\n  const shapes = inputs.map((i) => i.dims);\n  const channels = getGlChannels(rank);\n  const offsets: number[] = new Array(shapes.length - 1);\n\n  offsets[0] = shapes[0][axis];\n  for (let i = 1; i < offsets.length; i++) {\n    offsets[i] = offsets[i - 1] + shapes[i][axis];\n  }\n\n  const channel = channels[axis];\n  const lastChannels = channels.slice(-2);\n  const allChannels = channels.join();\n\n  let getValueSnippet = `if (${channel} < ${offsets[0]}) {\n        return getChannel(\n            getX0(${allChannels}), vec2(${lastChannels.join()}));\n        }`;\n  for (let i = 1; i < offsets.length; i++) {\n    const shift = offsets[i - 1];\n    getValueSnippet += `\n            if (${channel} < ${offsets[i]}  && ${channel} >= ${offsets[i - 1]}) {\n              return getChannel(\n                getX${i}(${getShiftedChannelsSnippet(channels, channel, shift)}),\n                vec2(${getShiftedChannelsSnippet(lastChannels, channel, shift)}));\n            }`;\n  }\n  const lastIndex = offsets.length;\n  const shift = offsets[offsets.length - 1];\n  getValueSnippet += `\n            return getChannel(\n              getX${lastIndex}(${getShiftedChannelsSnippet(channels, channel, shift)}),\n              vec2(${getShiftedChannelsSnippet(lastChannels, channel, shift)}));`;\n\n  const glsl = getGlsl(handler.session.backend.glContext.version);\n\n  const shaderSource = `\n          ${unpackChannel}\n          float getValue(${channels.map((x) => 'int ' + x)}) {\n            ${getValueSnippet}\n          }\n\n          void main() {\n            ${dtype} coords = getOutputCoords();\n            int lastDim = coords.${channels[rank - 1]};\n            coords.${channels[rank - 1]} = coords.${channels[rank - 2]};\n            coords.${channels[rank - 2]} = lastDim;\n\n            vec4 result = vec4(getValue(${coords}), 0., 0., 0.);\n\n            ${coords[rank - 1]} = ${coords[rank - 1]} + 1;\n            if (${coords[rank - 1]} < ${outputShape[rank - 1]}) {\n              result.g = getValue(${coords});\n            }\n\n            ${coords[rank - 2]} = ${coords[rank - 2]} + 1;\n            if (${coords[rank - 2]} < ${outputShape[rank - 2]}) {\n              result.a = getValue(${coords});\n            }\n\n            ${coords[rank - 1]} = ${coords[rank - 1]} - 1;\n            if (${coords[rank - 2]} < ${outputShape[rank - 2]} &&\n                ${coords[rank - 1]} < ${outputShape[rank - 1]}) {\n              result.b = getValue(${coords});\n            }\n            ${glsl.output} = result;\n          }\n        `;\n\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.packed },\n    shaderSource,\n    hasMain: true,\n  };\n};\n\nexport const createPackedConcatProgramInfoLoader = (\n  handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ConcatAttributes,\n): ProgramInfoLoader => {\n  const metadata = createPackedConcatProgramMetadata(inputs.length, attributes.cacheKey);\n  return { ...metadata, get: () => createPackedConcatProgramInfo(handler, metadata, inputs, attributes.axis) };\n};\n\nconst getShiftedChannelsSnippet = (channels: string[], channel: string, shift: number): string => {\n  const channelIdx = channels.indexOf(channel);\n  const res = channels.map((c, idx) => {\n    if (idx === channelIdx) {\n      return `${c} - ${shift}`;\n    } else {\n      return c;\n    }\n  });\n  return res.join();\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nimport { createPackedConcatProgramInfoLoader } from './concat-packed';\n\nexport interface ConcatAttributes extends AttributeWithCacheKey {\n  readonly axis: number;\n}\n\nexport const concat: OperatorImplementation<ConcatAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ConcatAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n  if (inferenceHandler.session.pack && inputs[0].dims.length > 1) {\n    const output = inferenceHandler.run(\n      createPackedConcatProgramInfoLoader(inferenceHandler, inputs, attributes),\n      inputs,\n    );\n    return [output];\n  } else {\n    const output = inferenceHandler.run(\n      createUnpackedConcatProgramInfoLoader(inferenceHandler, inputs, attributes),\n      inputs,\n    );\n    return [output];\n  }\n};\n\nconst createUnpackedConcatProgramMetadata = (inputCount: number, cacheHint: string) => ({\n  name: 'Concat',\n  inputNames: Array.from({ length: inputCount }, (_v, i) => `X${i}`),\n  inputTypes: Array(inputCount).fill(TextureType.unpacked),\n  cacheHint,\n});\n\nconst createUnpackedConcatProgramInfo = (\n  _handler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  inputs: Tensor[],\n  axis: number,\n): ProgramInfo => {\n  const inputShape = inputs[0].dims.slice();\n  if (axis >= inputShape.length || axis < -1 * inputShape.length) {\n    throw new Error(\"axis specified for concat doesn't match input dimensionality\");\n  }\n  if (axis < 0) {\n    axis = inputShape.length + axis;\n  }\n  // ensure all of the non-concatenated axes match each other\n  // calculate the shape of the output tensor while we do that\n  const outputShape = inputShape.slice(0);\n  for (let i = 1; i < inputs.length; i++) {\n    const dataNShape = inputs[i].dims.slice();\n    for (let axisIndex = 0; axisIndex < inputShape.length; axisIndex++) {\n      // add to the placeholder for computing output shape\n      if (axisIndex === axis) {\n        outputShape[axis] += dataNShape[axisIndex];\n      }\n      // ensure all non-cancatenated axes match each other\n      else if (inputShape[axisIndex] !== dataNShape[axisIndex]) {\n        throw new Error('non concat dimensions must match');\n      }\n    }\n  }\n\n  const rank = outputShape.length;\n\n  const sizeInConcatAxis = new Array<number>(inputs.length);\n  let previousSum = 0;\n  for (let i = 0; i < sizeInConcatAxis.length; ++i) {\n    previousSum += inputs[i].dims[axis];\n    sizeInConcatAxis[i] = previousSum;\n  }\n\n  let getTextureIndexWhereDataResidesMethod = '';\n  // in most cases linear search is sufficient, as in most scenarios, only 2 tensors are concatenated\n  if (inputs.length < 5) {\n    getTextureIndexWhereDataResidesMethod = getTextureIndexWhereDataResidesLinearSearch(sizeInConcatAxis);\n  } else {\n    getTextureIndexWhereDataResidesMethod = getTextureIndexWhereDataResidesBinarySearch(sizeInConcatAxis);\n  }\n\n  const fetchDataFromCorrectTextureMethod = getFetchDataFromCorrectTextureMethod(inputs.length, rank);\n  const getSizeInConcatAxisValueFromIndexMethod = getGetSizeInConcatAxisValueFromIndexMethod(sizeInConcatAxis);\n  const shaderSource = `\n        ${fetchDataFromCorrectTextureMethod}\n        ${getSizeInConcatAxisValueFromIndexMethod}\n        ${getTextureIndexWhereDataResidesMethod}\n        float process(int indices[${rank}]) {\n          int textureIndex = getTextureWhereDataResides (indices[${axis}]);\n\n          if(textureIndex != 0) {\n            indices[${axis}] = indices[${axis}] - int(getSizeInConcatAxisValueFromIndex(textureIndex-int(1)));\n          }\n\n          return fetchDataFromCorrectTexture(textureIndex, indices);\n        }`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst createUnpackedConcatProgramInfoLoader = (\n  handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ConcatAttributes,\n): ProgramInfoLoader => {\n  const metadata = createUnpackedConcatProgramMetadata(inputs.length, attributes.cacheKey);\n  return { ...metadata, get: () => createUnpackedConcatProgramInfo(handler, metadata, inputs, attributes.axis) };\n};\n\nconst getTextureIndexWhereDataResidesLinearSearch = (sizeInConcatAxis: number[]): string => {\n  const searchAxis = sizeInConcatAxis.map(\n    (size, i) => `if(index<${size}) {return ${i};}\n`,\n  );\n  return `int getTextureWhereDataResides(int index) {\n      ${searchAxis.join('')}\n    }`;\n};\n\n// TODO: Implement BinarySearch in GLSL\nconst getTextureIndexWhereDataResidesBinarySearch = (sizeInConcatAxis: number[]): string =>\n  getTextureIndexWhereDataResidesLinearSearch(sizeInConcatAxis);\n\nconst getFetchDataFromCorrectTextureMethod = (numberOfTensors: number, tensorRank: number) => {\n  const codeLines: string[] = [`float fetchDataFromCorrectTexture(int textureIndex, int indices[${tensorRank}]) {`];\n  for (let i = 0; i < numberOfTensors; ++i) {\n    if (i === 0) {\n      codeLines.push('\\t' + `if (textureIndex == ${i}) { return _X${i}(indices); }`);\n    } else if (i === numberOfTensors - 1) {\n      codeLines.push('\\t' + `else { return _X${i}(indices); }`);\n    } else {\n      codeLines.push('\\t' + `else if (textureIndex == ${i}) { return _X${i}(indices); }`);\n    }\n  }\n  codeLines.push('\\t' + '}');\n  return codeLines.join('\\n');\n};\n\nconst getGetSizeInConcatAxisValueFromIndexMethod = (sizeInConcatAxis: number[]): string => {\n  const codeLines: string[] = ['int getSizeInConcatAxisValueFromIndex(int index) {'];\n  for (let i = 0; i < sizeInConcatAxis.length; ++i) {\n    if (i === 0) {\n      codeLines.push('\\t' + `if (index == ${i}) { return ${sizeInConcatAxis[i]}; }`);\n    } else if (i === sizeInConcatAxis.length - 1) {\n      codeLines.push('\\t' + `else { return ${sizeInConcatAxis[i]}; }`);\n    } else {\n      codeLines.push('\\t' + `else if (index == ${i}) { return ${sizeInConcatAxis[i]}; }`);\n    }\n  }\n  codeLines.push('\\t' + '}');\n\n  return codeLines.join('\\n');\n};\n\nexport const parseConcatAttributes: OperatorInitialization<ConcatAttributes> = (node: Graph.Node): ConcatAttributes =>\n  createAttributeWithCacheKey({ axis: node.attributes.getInt('axis') });\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length < 1) {\n    throw new Error('too few inputs');\n  }\n\n  const inputType = inputs[0].type;\n  const inputDimensionality = inputs[0].dims.length;\n\n  // TODO: Support string concat\n  if (inputType === 'string') {\n    throw new Error('string tensor is not supported yet');\n  }\n\n  for (const input of inputs) {\n    // make sure types of all inputs match\n    if (input.type !== inputType) {\n      throw new Error('input tensors should be one type');\n    }\n\n    // make sure the dimensionality of all inputs are the same\n    if (input.dims.length !== inputDimensionality) {\n      throw new Error('input tensors should have the same shape');\n    }\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { Tensor } from '../../../tensor';\nimport { MAX_CLIP, MIN_CLIP } from '../../../util';\nimport { FunctionType, GlslValueFunction } from '../glsl-definitions';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nexport function glslAbs(): GlslValueFunction {\n  return glslBuiltinUnary('abs');\n}\nexport function glslAcos(): GlslValueFunction {\n  return glslBuiltinUnary('acos');\n}\nexport function glslAsin(): GlslValueFunction {\n  return glslBuiltinUnary('asin');\n}\nexport function glslAtan(): GlslValueFunction {\n  return glslBuiltinUnary('atan');\n}\nexport function glslCeil(): GlslValueFunction {\n  return glslBuiltinUnary('ceil');\n}\nexport function glslCos(): GlslValueFunction {\n  return glslBuiltinUnary('cos');\n}\nexport function glslElu(alpha: number): GlslValueFunction {\n  const name = 'elu';\n  const body = `\n  const float alpha = float(${alpha});\n\n  float ${name}_(float a) {\n    return a >= 0.0 ? a: (exp(a) - 1.0) * alpha;\n  }\n  vec4 ${name}_(vec4 v) {\n    return vec4(${name}_(v.x), ${name}_(v.y), ${name}_(v.z), ${name}_(v.w));\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslExp(): GlslValueFunction {\n  return glslBuiltinUnary('exp');\n}\nexport function glslFloor(): GlslValueFunction {\n  return glslBuiltinUnary('floor');\n}\nexport function glslClip(min: number, max: number): GlslValueFunction {\n  const name = 'clip';\n  const body = `\n  const float min = float(${min});\n  const float max = float(${max});\n\n  float ${name}_(float a) {\n    return clamp(a, min, max);\n  }\n  vec4 ${name}_(vec4 v) {\n    return clamp(v, min, max);\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslIdentity(): GlslValueFunction {\n  const name = 'indentity';\n  const body = `\n  float ${name}_(float a) {\n    return a;\n  }\n  vec4 ${name}_(vec4 v) {\n    return v;\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslLeakyRelu(alpha: number): GlslValueFunction {\n  const name = 'leakyRelu';\n  const body = `\n  const float alpha = float(${alpha});\n\n  float ${name}_(float a) {\n    return a < 0.0 ? a * alpha : a;\n  }\n  vec4 ${name}_(vec4 v) {\n    return vec4(${name}_(v.x), ${name}_(v.y), ${name}_(v.z), ${name}_(v.w));\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslLog(): GlslValueFunction {\n  return glslBuiltinUnary('log');\n}\nexport function glslNeg(): GlslValueFunction {\n  const name = 'neg';\n  const body = `\n  float ${name}_(float a) {\n    return -a;\n  }\n  vec4 ${name}_(vec4 v) {\n    return -v;\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslNot(): GlslValueFunction {\n  const name = 'not';\n  const body = `\n  float ${name}_(float a) {\n    return float( ! bool(a) );\n  }\n  bool ${name}_(bool a) {\n    return !a;\n  }\n  vec4 ${name}_(vec4 v) {\n    return vec4(!bool(v.x), !bool(v.y), !bool(v.z), !bool(v.w));\n  }\n  bvec4 ${name}_(bvec4 v) {\n    return bvec4(!v.x, !v.y, !v.z, !v.w);\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslSin(): GlslValueFunction {\n  return glslBuiltinUnary('sin');\n}\nexport function glslRelu(): GlslValueFunction {\n  const name = 'relu';\n  const body = `\n  float ${name}_(float a) {\n    return max( a, 0.0 );\n  }\n  vec4 ${name}_(vec4 v) {\n    return max( v, 0.0 );\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslSigmoid(): GlslValueFunction {\n  const name = 'sigmoid';\n  const body = `\n  float ${name}_(float a) {\n    return 1.0 / (1.0 + exp(-a));\n  }\n  vec4 ${name}_(vec4 v) {\n    return 1.0 / (1.0 + exp(-v));\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nexport function glslSqrt(): GlslValueFunction {\n  return glslBuiltinUnary('sqrt');\n}\nexport function glslTan(): GlslValueFunction {\n  return glslBuiltinUnary('tan');\n}\nexport function glslTanh(): GlslValueFunction {\n  const name = 'tanh';\n  const body = `\n  float ${name}_(float a) {\n    a = clamp(a, -10., 10.);\n    a = exp(2.*a);\n    return (a - 1.) / (a + 1.);\n  }\n  vec4 ${name}_(vec4 v) {\n    v = clamp(v, -10., 10.);\n    v = exp(2.*v);\n    return (v - 1.) / (v + 1.);\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\nfunction glslBuiltinUnary(name: string): GlslValueFunction {\n  const body = `\n  float ${name}_(float a) {\n    return ${name}(a);\n  }\n  vec4 ${name}_(vec4 v) {\n    return ${name}(v);\n  }\n  `;\n  return { body, name, type: FunctionType.ValueBased };\n}\n\n/////\n/////\n/////\n\nconst createElementwiseProgramInfo = (\n  handler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  input: Tensor,\n  glslFunc: GlslValueFunction,\n): ProgramInfo => {\n  const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n  const glsl = getGlsl(handler.session.backend.glContext.version);\n  return {\n    ...metadata,\n    output: { dims: input.dims, type: input.type, textureType },\n    shaderSource: `\n     ${glslFunc.body}\n     void main() {\n       vec4 v = ${glsl.texture2D}(A, TexCoords);\n       v = ${glslFunc.name}_(v);\n       ${glsl.output} = v;\n     }\n     `,\n    hasMain: true,\n  };\n};\n\nconst createElementwiseProgramInfoLoader = (\n  handler: WebGLInferenceHandler,\n  input: Tensor,\n  glslFunc: GlslValueFunction,\n  cacheKey?: string,\n): ProgramInfoLoader => {\n  const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n  const metadata = { name: glslFunc.name, inputTypes: [textureType], inputNames: ['A'], cacheHint: cacheKey };\n  return { ...metadata, get: () => createElementwiseProgramInfo(handler, metadata, input, glslFunc) };\n};\n\nexport const abs = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAbs()), inputs),\n];\n\nexport const acos = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAcos()), inputs),\n];\n\nexport const asin = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAsin()), inputs),\n];\n\nexport const atan = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAtan()), inputs),\n];\n\nexport interface ClipAttributes extends AttributeWithCacheKey {\n  readonly min: number;\n  readonly max: number;\n}\n\nexport const clip = (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ClipAttributes): Tensor[] => [\n  handler.run(\n    createElementwiseProgramInfoLoader(\n      handler,\n      inputs[0],\n      glslClip(attributes.min, attributes.max),\n      attributes.cacheKey,\n    ),\n    inputs,\n  ),\n];\n\nexport const parseClipAttributes = (node: Graph.Node): ClipAttributes =>\n  createAttributeWithCacheKey({\n    min: node.attributes.getFloat('min', MIN_CLIP),\n    max: node.attributes.getFloat('max', MAX_CLIP),\n  });\n\nexport const clipV11 = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n  const attributes = generateClipAttributesFromInputs(handler, inputs);\n  return clip(handler, [inputs[0]], attributes);\n};\n\nconst generateClipAttributesFromInputs = (handler: WebGLInferenceHandler, inputs: Tensor[]): ClipAttributes => {\n  if (\n    inputs.length >= 3 &&\n    (!handler.session.isInitializer(inputs[1].dataId) || !handler.session.isInitializer(inputs[2].dataId))\n  ) {\n    throw new Error('dynamic clip attributes are not allowed');\n  }\n\n  const min = inputs.length >= 3 ? inputs[1].numberData[0] : MIN_CLIP;\n  const max = inputs.length >= 3 ? inputs[2].numberData[0] : MAX_CLIP;\n  return createAttributeWithCacheKey({ min, max });\n};\n\nexport const ceil = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslCeil()), inputs),\n];\n\nexport const cos = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslCos()), inputs),\n];\n\nexport interface EluAttributes extends AttributeWithCacheKey {\n  readonly alpha: number;\n}\n\nexport const elu = (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: EluAttributes): Tensor[] => [\n  handler.run(\n    createElementwiseProgramInfoLoader(handler, inputs[0], glslElu(attributes.alpha), attributes.cacheKey),\n    inputs,\n  ),\n];\n\nexport const parseEluAttributes = (node: Graph.Node): EluAttributes =>\n  createAttributeWithCacheKey({ alpha: node.attributes.getFloat('alpha', 1.0) });\n\nexport const exp = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslExp()), inputs),\n];\n\nexport const floor = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslFloor()), inputs),\n];\n\nexport const identity = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslIdentity()), inputs),\n];\n\nexport interface LeakyReluAttributes extends AttributeWithCacheKey {\n  readonly alpha: number;\n}\n\nexport const leakyRelu = (\n  handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: LeakyReluAttributes,\n): Tensor[] => [\n  handler.run(\n    createElementwiseProgramInfoLoader(handler, inputs[0], glslLeakyRelu(attributes.alpha), attributes.cacheKey),\n    inputs,\n  ),\n];\n\nexport const parseLeakyReluAttributes = (node: Graph.Node): LeakyReluAttributes =>\n  createAttributeWithCacheKey({ alpha: node.attributes.getFloat('alpha', 0.01) });\n\nexport const log = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslLog()), inputs),\n];\n\nexport const neg = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslNeg()), inputs),\n];\n\nexport const not = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslNot()), inputs),\n];\n\nexport const relu = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslRelu()), inputs),\n];\n\nexport const sigmoid = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslSigmoid()), inputs),\n];\n\nexport const sin = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslSin()), inputs),\n];\n\nexport const sqrt = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslSqrt()), inputs),\n];\n\nexport const tan = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslTan()), inputs),\n];\n\nexport const tanh = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => [\n  handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslTanh()), inputs),\n];\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Attribute } from '../../../attribute';\nimport { MAX_CLIP, MIN_CLIP } from '../../../util';\nimport { GlslValueFunction } from '../glsl-definitions';\n\nimport { glslClip, glslRelu, glslSigmoid } from './unary-op';\n\nexport interface InternalActivationAttributes {\n  readonly activation: string;\n  readonly clipMin?: number;\n  readonly clipMax?: number;\n  readonly activationCacheKey: string;\n}\n\nexport function getActivationSnippet(attributes: InternalActivationAttributes) {\n  let func: GlslValueFunction;\n  switch (attributes.activation) {\n    case 'Relu':\n      func = glslRelu();\n      break;\n    case 'Sigmoid':\n      func = glslSigmoid();\n      break;\n    case 'Clip':\n      func = glslClip(attributes.clipMin!, attributes.clipMax!);\n      break;\n    // TODO: adding other activations that can be fused.\n    default:\n      return { activationFunction: '', applyActivation: '' };\n  }\n\n  const activationName = func.name;\n  const activationFunction = func.body;\n  const applyActivation = `value = ${activationName}_(value);`;\n  return { activationFunction, applyActivation };\n}\n\nexport const parseInternalActivationAttributes = (attributes: Attribute): InternalActivationAttributes => {\n  const activation = attributes.getString('activation', '');\n\n  if (activation === 'Clip') {\n    const [clipMin, clipMax] = attributes.getFloats('activation_params', [MIN_CLIP, MAX_CLIP]);\n    return { activation, clipMax, clipMin, activationCacheKey: `${activation}:${clipMin},${clipMax}` };\n  }\n  return { activation, activationCacheKey: activation };\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Logger } from '../../../instrument';\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nimport { calculateOutputShape, ConvAttributes } from './conv';\nimport { getActivationSnippet } from './fuse-utils';\n\nconst createUnpackedGroupedConvProgramMetadata = (hasBias: boolean, cacheHint: string): ProgramMetadata => ({\n  name: 'GroupedConv',\n  inputNames: hasBias ? ['X', 'W', 'Bias'] : ['X', 'W'],\n  inputTypes: hasBias\n    ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked]\n    : [TextureType.unpacked, TextureType.unpacked],\n  cacheHint,\n});\n\nconst createUnpackedGroupedConvProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  metadata: ProgramMetadata,\n  attributes: ConvAttributes,\n): ProgramInfo => {\n  const hasBias = inputs.length > 2;\n  const processBias = hasBias ? 'value += getBias(output_channel);' : '';\n  const xShape = inputs[0].dims.slice();\n  const wShape = inputs[1].dims.slice();\n  const outputChannelsPerGroup = wShape[0] / attributes.group;\n  Logger.verbose(\n    'GroupedConv',\n    `autpPad:${attributes.autoPad}, dilations:${attributes.dilations}, group:${attributes.group}, kernelShape:${\n      attributes.kernelShape\n    }, pads:${attributes.pads}, strides:${attributes.strides}`,\n  );\n  const outputShape = calculateOutputShape(xShape, wShape, attributes.dilations, attributes.pads, attributes.strides);\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const { activationFunction, applyActivation } = getActivationSnippet(attributes);\n\n  const shaderSource = `\n  const ivec2 strides = ivec2(${attributes.strides[0]}, ${attributes.strides[1]});\n  const ivec2 pads = ivec2(${attributes.pads[0]}, ${attributes.pads[1]});\n  ${activationFunction}\n  void main() {\n    ivec4 coords = getOutputCoords();\n    int batch = coords.x;\n    int output_channel = coords.y;\n    ivec2 xRCCorner = coords.zw * strides - pads;\n    int group_id = output_channel / ${outputChannelsPerGroup};\n\n    float value = 0.0;\n    for (int wInChannel = 0; wInChannel < ${wShape[1]}; wInChannel++) {\n      int input_channel = group_id * ${wShape[1]} + wInChannel;\n      for (int wHeight = 0; wHeight < ${wShape[2]}; wHeight++) {\n        int xHeight = xRCCorner.x + wHeight * ${attributes.dilations[0]};\n\n        if (xHeight < 0 || xHeight >= ${xShape[2]}) {\n          continue;\n        }\n\n        for (int wWidth = 0; wWidth < ${wShape[3]}; wWidth++) {\n          int xWidth = xRCCorner.y + wWidth * ${attributes.dilations[1]};\n          if (xWidth < 0 || xWidth >= ${xShape[3]}) {\n            continue;\n          }\n\n          float xVal = getX(batch, input_channel, xWidth, xHeight);\n          float wVal = getW(output_channel, wInChannel, wWidth, wHeight);\n          value += xVal*wVal;\n        }\n      }\n    }\n    ${processBias}\n    ${applyActivation}\n    ${glsl.output} = vec4(value, .0, .0, .0);\n  }\n`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n    hasMain: true,\n  };\n};\n\nexport const createUnpackedGroupedConvProgramInfoLoader = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  attributes: ConvAttributes,\n): ProgramInfoLoader => {\n  const metadata = createUnpackedGroupedConvProgramMetadata(inputs.length > 2, attributes.cacheKey);\n  return {\n    ...metadata,\n    get: () => createUnpackedGroupedConvProgramInfo(inferenceHandler, inputs, metadata, attributes),\n  };\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nimport { ConvAttributes } from './conv';\nimport { unpackFromChannel } from './packing-utils';\n\nconst createPackedIm2ColProgramMetadata = (cacheHint: string) => ({\n  name: 'Im2Col (packed)',\n  inputNames: ['A'],\n  inputTypes: [TextureType.packed],\n  cacheHint,\n});\n\nconst createPackedIm2ColProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  x: Tensor,\n  w: Tensor,\n  outputShape: readonly number[],\n  attributes: ConvAttributes,\n): ProgramInfo => {\n  const xshape = x.dims;\n  const wshape = w.dims;\n  const rowDim = 2;\n  const colDim = 3;\n  const rank = outputShape.length;\n  const im2colShape = [wshape[1] * wshape[2] * wshape[3], outputShape[2] * outputShape[3]];\n  const kernelSize = wshape[2] * wshape[3];\n  const unpackChannel = unpackFromChannel();\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  let unrolled = '';\n\n  for (let row = 0; row <= 1; row++) {\n    for (let col = 0; col <= 1; col++) {\n      unrolled += `\n            blockIndex = rc.x + ${col};\n            pos = rc.y + ${row};\n\n            if(blockIndex < ${im2colShape[1]} && pos < ${im2colShape[0]}) {\n              offsetY = int(blockIndex / (${outputShape[rank - 1]})) * ${attributes.strides[0]} -\n                ${attributes.pads[0]};\n              d0 = offsetY + ${attributes.dilations[0]} * (imod(pos, ${kernelSize}) / ${wshape[2]});\n\n              if(d0 < ${xshape[rowDim]} && d0 >= 0) {\n                offsetX = imod(blockIndex, ${outputShape[rank - 1]}) * ${attributes.strides[1]} -\n                  ${attributes.pads[1]};\n                d1 = offsetX + ${attributes.dilations[1]} * imod(imod(pos, ${kernelSize}), ${wshape[2]});\n\n                if(d1 < ${xshape[colDim]} && d1 >= 0) {\n\n                  ch = int(float(pos)/ ${kernelSize}.);\n                    innerDims = vec2(d0, d1);\n                    result[${row * 2 + col}] = getChannel(\n                      getA(0, ch, int(innerDims.x),\n                      int(innerDims.y)), innerDims);\n                }\n              }\n            }\n\n          `;\n    }\n  }\n\n  const shaderSource = `\n      ${unpackChannel}\n\n      void main() {\n        ivec2 rc = getOutputCoords();\n          vec4 result = vec4(0.0);\n          int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n          vec2 innerDims;\n          ${unrolled}\n          ${glsl.output} = result;\n      }\n            `;\n  return {\n    ...metadata,\n    output: { dims: im2colShape, type: x.type, textureType: TextureType.packed },\n    shaderSource,\n    hasMain: true,\n  };\n};\n\nexport const createPackedIm2ColProgramInfoLoader = (\n  inferenceHandler: WebGLInferenceHandler,\n  x: Tensor,\n  w: Tensor,\n  outputShape: readonly number[],\n  attributes: ConvAttributes,\n): ProgramInfoLoader => {\n  const metadata = createPackedIm2ColProgramMetadata(attributes.cacheKey);\n  return {\n    ...metadata,\n    get: () => createPackedIm2ColProgramInfo(inferenceHandler, metadata, x, w, outputShape, attributes),\n  };\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { BroadcastUtil, ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\nimport { getCoordsDataType, getGlChannels } from '../utils';\n\nimport { getActivationSnippet, InternalActivationAttributes, parseInternalActivationAttributes } from './fuse-utils';\nimport { createPackedMatmulProgramInfoLoader } from './matmul-pack';\n\nexport const matMul: OperatorImplementation<InternalActivationAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: InternalActivationAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n\n  if (inferenceHandler.session.pack) {\n    return [inferenceHandler.run(createPackedMatmulProgramInfoLoader(inferenceHandler, inputs, attributes), inputs)];\n  } else {\n    return [inferenceHandler.run(createMatmulProgramInfoLoader(inputs, attributes), inputs)];\n  }\n};\n\nexport const parseMatMulAttributes: OperatorInitialization<InternalActivationAttributes> = (\n  node: Graph.Node,\n): InternalActivationAttributes => parseInternalActivationAttributes(node.attributes);\n\nconst createMatmulProgramMetadata = (hasBias: boolean, cacheHint: string) => ({\n  name: 'MatMul',\n  inputNames: hasBias ? ['A', 'B', 'Bias'] : ['A', 'B'],\n  inputTypes: hasBias\n    ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked]\n    : [TextureType.unpacked, TextureType.unpacked],\n  cacheHint,\n});\n\nfunction createMatmulProgramInfo(\n  metadata: ProgramMetadata,\n  inputs: Tensor[],\n  activationAttributes: InternalActivationAttributes,\n): ProgramInfo {\n  const aShape = inputs[0].dims;\n  const bShape = inputs[1].dims;\n  const outputShape = BroadcastUtil.calcShape(aShape, bShape, true);\n  if (!outputShape) {\n    throw new Error(\"Can't use matmul on the given tensors\");\n  }\n  const coordsDataType = getCoordsDataType(outputShape.length);\n  const allGlChannels = getGlChannels();\n  const { activationFunction, applyActivation } = getActivationSnippet(activationAttributes);\n\n  const hasBias = inputs.length > 2;\n  const processBias = hasBias ? 'value += getBiasForMatmul();' : '';\n  const getBiasForMatmulSnippet = hasBias\n    ? `${getBiasForMatmul(coordsDataType, allGlChannels, inputs[2].dims, outputShape, false)}`\n    : '';\n\n  const rank = outputShape.length;\n  const arank = aShape.length;\n  const brank = bShape.length;\n  const sharedDim = aShape[aShape.length - 1];\n  const shaderSource = `\n    ${activationFunction}\n    ${getBiasForMatmulSnippet}\n    float process(int indices[${rank}]) {\n        int a[${arank}];\n        int b[${brank}];\n        bcastMatmulIndices_A(indices, a);\n        bcastMatmulIndices_B(indices, b);\n\n        float value;\n        for (int k=0; k<${sharedDim}; ++k) {\n            a[${arank - 1}] = k;\n            b[${brank - 2}] = k;\n            value += _A(a) * _B(b);\n        }\n        ${processBias}\n        ${applyActivation}\n        return value;\n    }`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n}\n\nexport function createMatmulProgramInfoLoader(\n  inputs: Tensor[],\n  activationAttributes: InternalActivationAttributes,\n): ProgramInfoLoader {\n  const metadata = createMatmulProgramMetadata(inputs.length > 2, activationAttributes.activationCacheKey);\n  return { ...metadata, get: () => createMatmulProgramInfo(metadata, inputs, activationAttributes) };\n}\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 2) {\n    throw new Error('MatMul requires 2 inputs.');\n  }\n\n  if (inputs[0].dims[inputs[0].dims.length - 1] !== inputs[1].dims[inputs[1].dims.length - 2]) {\n    throw new Error('shared dimension does not match.');\n  }\n\n  if (\n    (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') ||\n    (inputs[1].type !== 'float32' && inputs[1].type !== 'float64')\n  ) {\n    throw new Error('inputs should be float type');\n  }\n\n  if (inputs[0].type !== inputs[1].type) {\n    throw new Error('inputs types should match');\n  }\n};\n\nexport function getBiasForMatmul(\n  coordsDataType: string,\n  allGlChannels: readonly string[],\n  inShape: readonly number[],\n  outShape: readonly number[],\n  isPacked: boolean,\n): string {\n  let unpackedCoordsSnippet = '';\n  const inRank = inShape.length;\n  const outRank = outShape.length;\n  const rankDiff = outRank - inRank;\n  if (outRank < 2 && inRank > 0) {\n    unpackedCoordsSnippet = 'coords';\n  } else {\n    unpackedCoordsSnippet = inShape.map((_s, i) => `coords.${allGlChannels[i + rankDiff]}`).join(', ');\n  }\n  const broadcastDims = BroadcastUtil.getBroadcastDims(inShape, outShape);\n  const coordsSnippet = broadcastDims.map((d) => `coords.${allGlChannels[d + rankDiff]} = 0;`).join('\\n');\n  const inSize = ShapeUtil.size(inShape);\n  const isInputScalar = inSize === 1;\n  let output = 'vec4(outputValue.xx, outputValue.yy)';\n  if (isInputScalar) {\n    output = 'vec4(outputValue.x)';\n  }\n  const getBiasForMatmulSource = isPacked\n    ? `\nvec4 getBiasForMatmul() {\n  ${coordsDataType} coords = getOutputCoords();\n  ${coordsSnippet}\n  vec4 outputValue = getBias(${unpackedCoordsSnippet});\n  return ${output};\n}`\n    : `\nfloat getBiasForMatmul() {\n  ${coordsDataType} coords = getOutputCoords();\n  ${coordsSnippet}\n  return getBias(coords.x);\n}`;\n\n  return getBiasForMatmulSource;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { BroadcastUtil, ShapeUtil } from '../../../util';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\nimport { getCoordsDataType, getGlChannels } from '../utils';\n\nimport { getActivationSnippet, InternalActivationAttributes } from './fuse-utils';\nimport { getBiasForMatmul } from './matmul';\n\nconst createPackedMatmulProgramMetadata = (hasBias: boolean, cacheHint: string) => ({\n  name: 'MatMul (packed)',\n  inputNames: hasBias ? ['A', 'B', 'Bias'] : ['A', 'B'],\n  inputTypes: hasBias\n    ? [TextureType.packed, TextureType.packed, TextureType.packed]\n    : [TextureType.packed, TextureType.packed],\n  cacheHint,\n});\n\nconst createPackedMatmulProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  inputs: Tensor[],\n  activationAttributes: InternalActivationAttributes,\n): ProgramInfo => {\n  const hasBias = inputs.length > 2;\n  const processBias = hasBias ? 'value += getBiasForMatmul();' : '';\n  const aShape = inputs[0].dims;\n  const bShape = inputs[1].dims;\n  const outputShape = BroadcastUtil.calcShape(aShape, bShape, true);\n  const isBroadcast = !ShapeUtil.areEqual(inputs[0].dims, inputs[1].dims);\n\n  if (!outputShape) {\n    throw new Error(\"Can't use matmul on the given tensors\");\n  }\n  const sharedDim = aShape[aShape.length - 1];\n  const sharedDimIndex = Math.ceil(sharedDim / 2);\n  const aRank = aShape.length;\n  const bRank = bShape.length;\n\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const coordsDataType = getCoordsDataType(outputShape.length);\n  const outRank = outputShape.length;\n  const allGlChannels = getGlChannels();\n  const { activationFunction, applyActivation } = getActivationSnippet(activationAttributes);\n\n  const getBiasForMatmulSnippet = hasBias\n    ? `${getBiasForMatmul(coordsDataType, allGlChannels, inputs[2].dims, outputShape, true)}`\n    : '';\n\n  const getBcastedSamplerForMatmulSnippet = isBroadcast\n    ? `${getBcastSamplerForMatmul(coordsDataType, allGlChannels, inputs, outputShape)}`\n    : '';\n\n  const getSamplerAInLoopSnippet = isBroadcast ? 'getAAtOutCoordsMatmul(i)' : `getA(${getA(allGlChannels, aRank)})`;\n  const getSamplerBInLoopSnippet = isBroadcast ? 'getBAtOutCoordsMatmul(i)' : `getB(${getB(allGlChannels, bRank)})`;\n  const getOutputCoordsSnippet = isBroadcast\n    ? ''\n    : `${coordsDataType} rc =\n          getOutputCoords(); int lastDim = rc.${allGlChannels[outRank - 1]}; rc.${allGlChannels[outRank - 1]} =\n          rc.${allGlChannels[outRank - 2]}; rc.${allGlChannels[outRank - 2]} = lastDim;\n      `;\n  const shaderSource = `\n            ${getBcastedSamplerForMatmulSnippet}\n            ${getBiasForMatmulSnippet}\n            ${activationFunction}\n            void main() {\n              ${getOutputCoordsSnippet}\n\n              vec4 value = vec4(0);\n              for (int i = 0; i < ${sharedDimIndex}; i++) {\n                vec4 a = ${getSamplerAInLoopSnippet};\n                vec4 b = ${getSamplerBInLoopSnippet};\n\n                value += (a.rrbb * b.rgrg);\n                value += (a.ggaa * b.baba);\n              }\n              ${processBias}\n              ${applyActivation}\n              ${glsl.output} = value;\n            }`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.packed },\n    shaderSource,\n    hasMain: true,\n  };\n};\n\nexport const createPackedMatmulProgramInfoLoader = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  activationAttributes: InternalActivationAttributes,\n): ProgramInfoLoader => {\n  const metadata = createPackedMatmulProgramMetadata(inputs.length > 2, activationAttributes.activationCacheKey);\n  return {\n    ...metadata,\n    get: () => createPackedMatmulProgramInfo(inferenceHandler, metadata, inputs, activationAttributes),\n  };\n};\n\nfunction getBcastSamplerForMatmul(\n  coordsDataType: string,\n  allGlChannels: readonly string[],\n  inputs: Tensor[],\n  outShape: readonly number[],\n): string {\n  let unpackedACoordsSnippet = [];\n  let unpackedBCoordsSnippet = [];\n\n  const inAShape = inputs[0].dims;\n  const inBShape = inputs[1].dims;\n\n  const inARank = inAShape.length;\n  const inBRank = inBShape.length;\n\n  const outRank = outShape.length;\n  const rankADiff = outRank - inARank;\n  const rankBDiff = outRank - inBRank;\n\n  unpackedACoordsSnippet = inAShape.map((_s, i) => `coords.${allGlChannels[i + rankADiff]}`);\n  unpackedACoordsSnippet[inARank - 1] = 'i*2';\n  unpackedACoordsSnippet.join(', ');\n  unpackedBCoordsSnippet = inBShape.map((_s, i) => `coords.${allGlChannels[i + rankBDiff]}`);\n  unpackedBCoordsSnippet[inBRank - 2] = 'i*2';\n  unpackedBCoordsSnippet.join(', ');\n\n  const broadcastADims = BroadcastUtil.getBroadcastDims(inAShape, outShape);\n  const broadcastBDims = BroadcastUtil.getBroadcastDims(inBShape, outShape);\n\n  const coordsASnippet = broadcastADims.map((d) => `coords.${allGlChannels[d + rankADiff]} = 0;`).join('\\n');\n  const coordsBSnippet = broadcastBDims.map((d) => `coords.${allGlChannels[d + rankBDiff]} = 0;`).join('\\n');\n  const swapDimSnippet = `int lastDim = coords.${allGlChannels[outRank - 1]};\n  coords.${allGlChannels[outRank - 1]} = coords.${allGlChannels[outRank - 2]};\n  coords.${allGlChannels[outRank - 2]} = lastDim;`;\n\n  const getBcastSamplerMatmulSource = `\nvec4 getAAtOutCoordsMatmul(int i) {\n  ${coordsDataType} coords = getOutputCoords();\n  ${swapDimSnippet}\n  ${coordsASnippet}\n  vec4 outputValue = getA(${unpackedACoordsSnippet});\n  return outputValue;\n}\n\nvec4 getBAtOutCoordsMatmul(int i) {\n  ${coordsDataType} coords = getOutputCoords();\n  ${swapDimSnippet}\n  ${coordsBSnippet}\n  vec4 outputValue = getB(${unpackedBCoordsSnippet});\n  return outputValue;\n}`;\n\n  return getBcastSamplerMatmulSource;\n}\n\nfunction getA(allGlChannels: string[], rank: number): string {\n  let res = '';\n  for (let i = 0; i < rank - 2; i++) {\n    res += `rc.${allGlChannels[i]}, `;\n  }\n  res += `rc.${allGlChannels[rank - 2]}, ` + 'i*2';\n  return res;\n}\n\nfunction getB(allGlChannels: string[], rank: number): string {\n  let res = '';\n  for (let i = 0; i < rank - 2; i++) {\n    res += `rc.${allGlChannels[i]}, `;\n  }\n  res += 'i*2, ' + `rc.${allGlChannels[rank - 1]}`;\n  return res;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { WebGLInferenceHandler } from '../inference-handler';\n\nimport { calculateOutputShape, ConvAttributes } from './conv';\nimport { createPackedIm2ColProgramInfoLoader } from './im2col-pack';\nimport { createPackedMatmulProgramInfoLoader } from './matmul-pack';\n\nexport const conv2DPackedPointwise = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  attributes: ConvAttributes,\n): Tensor => {\n  const xshape = inputs[0].dims;\n  const kshape = inputs[1].dims;\n  const outputShape = calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n  const reshapedX = inferenceHandler.reshapePacked(inputs[0], [xshape[1], xshape[2] * xshape[3]]);\n  const reshapedK = inferenceHandler.reshapePacked(inputs[1], [kshape[0], kshape[1]]);\n\n  const matmulInputs = inputs.length > 2 ? [reshapedK, reshapedX, inputs[2]] : [reshapedK, reshapedX];\n  const matmulOutput = inferenceHandler.run(\n    createPackedMatmulProgramInfoLoader(inferenceHandler, matmulInputs, attributes),\n    matmulInputs,\n  );\n  return inferenceHandler.reshapePacked(matmulOutput, outputShape);\n};\n\nexport const conv2DPacked = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  attributes: ConvAttributes,\n): Tensor => {\n  const xshape = inputs[0].dims;\n  const kshape = inputs[1].dims;\n  const outputShape = calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n\n  // run im2col\n  const im2colOutput = inferenceHandler.run(\n    createPackedIm2ColProgramInfoLoader(inferenceHandler, inputs[0], inputs[1], outputShape, attributes),\n    [inputs[0]],\n  );\n\n  // reshape kernel\n  const kernelReshaped = inferenceHandler.reshapePacked(inputs[1], [kshape[0], kshape[1] * kshape[2] * kshape[3]]);\n\n  // run matmul\n  const matmulInputs = inputs.length === 3 ? [kernelReshaped, im2colOutput, inputs[2]] : [kernelReshaped, im2colOutput];\n  const matmulOutput = inferenceHandler.run(\n    createPackedMatmulProgramInfoLoader(inferenceHandler, matmulInputs, attributes),\n    matmulInputs,\n  );\n\n  // reshape output\n  const outputReshaped = inferenceHandler.reshapePacked(matmulOutput, outputShape);\n  return outputReshaped;\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nimport { ConvAttributes } from './conv';\n\nconst createIm2ColProgramMetadata = (cacheHint: string) => ({\n  name: 'Im2Col',\n  inputNames: ['X'],\n  inputTypes: [TextureType.unpacked],\n  cacheHint,\n});\n\nconst createIm2ColProgramInfo = (\n  _inferenceHandler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  x: Tensor,\n  w: Tensor,\n  outputShape: readonly number[],\n  attributes: ConvAttributes,\n): ProgramInfo => {\n  const xshape = x.dims;\n  const wshape = w.dims;\n\n  const rank = outputShape.length;\n  const im2colDims = calculateIm2ColDims(xshape, wshape, outputShape, 4);\n\n  const shaderSource = `\n        const int XC = ${xshape[1]};\n        const int XH = ${xshape[2]};\n        const int XW = ${xshape[3]};\n        const int KH = ${attributes.kernelShape[0]};\n        const int KW = ${attributes.kernelShape[1]};\n        const int dilationH = ${attributes.dilations[0]};\n        const int dilationW = ${attributes.dilations[1]};\n        const int strideH = ${attributes.strides[0]};\n        const int strideW = ${attributes.strides[1]};\n        const int padH = ${attributes.pads[0]};\n        const int padW = ${attributes.pads[1]};\n        const int KHKW = KH*KW;\n        const int XCKHKW = XC * KHKW;\n        const int outputChannels = 4;\n        vec4 process(int indices[${rank}]) {\n          int b  = indices[0]; // batch size\n          int oh = indices[1] * strideH - padH; //output height\n          int ow = indices[2] * strideW - padW; //output width\n          int p = indices[3] * outputChannels; //patch\n          vec4 value = vec4(0.0);\n          for(int i=0; i < outputChannels; ++i) {\n            if(p < XCKHKW) {\n              int patchC = p / KHKW;\n              int patchH = (p - patchC*KHKW) / KW;\n              int patchW = (p - patchC*KHKW) - patchH * KW;\n              int xh2 = oh + patchH * dilationH;\n              int xw2 = ow + patchW * dilationW;\n              int x[${xshape.length}];\n              x[0] = b;\n              x[1] = patchC;\n              x[2] = xh2;\n              x[3] = xw2;\n              if(xh2 >= 0 &&\n                  xh2 < XH &&\n                  xw2 >= 0 &&\n                  xw2 < XW) {\n                value[i] = _X(x);\n              }\n            }\n            ++p;\n          }\n          return value;\n        }\n        `;\n  return {\n    ...metadata,\n    output: { dims: im2colDims, type: x.type, textureType: TextureType.packedLastDimension },\n    shaderSource,\n  };\n};\n\nexport const createIm2ColProgramInfoLoader = (\n  inferenceHandler: WebGLInferenceHandler,\n  x: Tensor,\n  w: Tensor,\n  outputShape: readonly number[],\n  attributes: ConvAttributes,\n): ProgramInfoLoader => {\n  const metadata = createIm2ColProgramMetadata(attributes.cacheKey);\n  return {\n    ...metadata,\n    get: () => createIm2ColProgramInfo(inferenceHandler, metadata, x, w, outputShape, attributes),\n  };\n};\n\nexport const calculateIm2ColDims = (\n  inputShape: readonly number[],\n  kernelShape: readonly number[],\n  outputShape: readonly number[],\n  channels = 4,\n): number[] => [\n  outputShape[0],\n  outputShape[2],\n  outputShape[3],\n  Math.ceil((inputShape[1] * kernelShape[2] * kernelShape[3]) / channels),\n];\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nimport { getActivationSnippet, InternalActivationAttributes } from './fuse-utils';\nimport { calculateIm2ColDims } from './im2col';\n\nconst createDotProductProgramMetadata = (hasBias: boolean, attributes: InternalActivationAttributes) => ({\n  name: 'ConvDotProduct',\n  inputNames: hasBias ? ['Im2Col', 'K', 'B'] : ['Im2Col', 'K'],\n  inputTypes: hasBias\n    ? [TextureType.unpacked, TextureType.packedLastDimension, TextureType.unpacked]\n    : [TextureType.unpacked, TextureType.packedLastDimension],\n  cacheKey: attributes.activationCacheKey,\n});\n\nconst createDotProductProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  inputs: readonly Tensor[],\n  outputShape: number[],\n  attributes: InternalActivationAttributes,\n): ProgramInfo => {\n  const xshape = inputs[0].dims;\n  const kshape = inputs[1].dims;\n  const adjustedKernelShape = [kshape[0], Math.ceil((xshape[1] * kshape[2] * kshape[3]) / 4)];\n  const im2colShape = calculateIm2ColDims(xshape, kshape, outputShape);\n  const [kWidth, kHeight] = inferenceHandler.calculateTextureWidthAndHeight(\n    adjustedKernelShape,\n    TextureType.packedLastDimension,\n  );\n\n  const im2colStrides = ShapeUtil.computeStrides(im2colShape);\n  const [im2colWidth, im2colHeight] = inferenceHandler.calculateTextureWidthAndHeight(\n    im2colShape,\n    TextureType.packedLastDimension,\n  );\n  const rank = outputShape.length;\n\n  const initValue = inputs.length < 3 ? '0.0' : '_B(b)';\n  const sharedDim = Math.ceil((xshape[1] * kshape[2] * kshape[3]) / 4);\n  const { activationFunction, applyActivation } = getActivationSnippet(attributes);\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const shaderSource = `\n${activationFunction}\nfloat process(int indices[${rank}]) {\n  int b[1];\n  b[0] = indices[1];\n  int im2col[4];\n  im2col[0] = indices[0];\n  im2col[1] = indices[2];\n  im2col[2] = indices[3];\n  int im2colOffset = im2col[0] * ${im2colStrides[0]} + im2col[1] * ${im2colStrides[1]} + im2col[2] * ${\n    im2colStrides[2]\n  };\n  int kernelOffset = indices[1] * ${adjustedKernelShape[1]};\n  float value = ${initValue};\n  for (int i = 0; i < ${sharedDim}; ++i) {\n    vec2 im2colCoords = offsetToCoords(im2colOffset, ${im2colWidth}, ${im2colHeight});\n    vec2 kernelCoords = offsetToCoords(kernelOffset, ${kWidth}, ${kHeight});\n    value += dot(${glsl.texture2D}(Im2Col, im2colCoords), ${glsl.texture2D}(K, kernelCoords));\n    ++im2colOffset;\n    ++kernelOffset;\n  }\n  ${applyActivation}\n  return value;\n}`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nexport const createDotProductProgramInfoLoader = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  outputShape: number[],\n  attributes: InternalActivationAttributes,\n): ProgramInfoLoader => {\n  const metadata = createDotProductProgramMetadata(inputs.length > 2, attributes);\n  return {\n    ...metadata,\n    get: () => createDotProductProgramInfo(inferenceHandler, metadata, inputs, outputShape, attributes),\n  };\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { InferenceHandler } from '../../../backend';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { PoolConvUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\n\nimport { createUnpackedGroupedConvProgramInfoLoader } from './conv-grouped';\nimport { conv2DPacked } from './conv-pack';\nimport { createDotProductProgramInfoLoader } from './dot-product';\nimport { InternalActivationAttributes, parseInternalActivationAttributes } from './fuse-utils';\nimport { createIm2ColProgramInfoLoader } from './im2col';\nimport { createMatmulProgramInfoLoader } from './matmul';\n\nexport const calculateOutputShape = (\n  inputShape: readonly number[],\n  kernelShape: readonly number[],\n  dilations: readonly number[],\n  adjustPads: readonly number[],\n  strides: readonly number[],\n): number[] => {\n  const batchSize = inputShape[0];\n  const inputSpatialShape = inputShape.slice(2);\n  const spatialRank = inputSpatialShape.length;\n  const outChannels = kernelShape[0];\n  const kernelSpatialShape = kernelShape.slice(2);\n  const dilatedKernelShape = kernelSpatialShape.map((v, i) => v + (v - 1) * (dilations[i] - 1));\n  const inputSpatialShapeWithPad = inputSpatialShape.map((v, i) => v + adjustPads[i] + adjustPads[i + spatialRank]);\n  const outputSpatialShape = inputSpatialShapeWithPad.map((v, i) =>\n    Math.floor((v - dilatedKernelShape[i] + strides[i]) / strides[i]),\n  );\n  const outputShape = [batchSize, outChannels].concat(...outputSpatialShape);\n  return outputShape;\n};\n\nexport interface ConvAttributes extends InternalActivationAttributes, AttributeWithCacheKey {\n  readonly autoPad: string;\n  readonly dilations: readonly number[];\n  readonly group: number;\n  readonly kernelShape: readonly number[];\n  readonly pads: readonly number[];\n  readonly strides: readonly number[];\n}\n\nexport const conv: OperatorImplementation<ConvAttributes> = (\n  inferenceHandler: InferenceHandler,\n  inputs: Tensor[],\n  attributes: ConvAttributes,\n): Tensor[] => {\n  validateInputs(inputs, attributes); // currently will fail if not conv2D\n  return conv2d(inferenceHandler, inputs, attributes);\n};\n\nconst conv2d: OperatorImplementation<ConvAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ConvAttributes,\n): Tensor[] => {\n  const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n  const packMode = inferenceHandler.session.pack;\n  const isPointwise = adjustedAttributes.kernelShape[0] === 1 && adjustedAttributes.kernelShape[1] === 1;\n  if (adjustedAttributes.group > 1) {\n    const result = inferenceHandler.run(\n      createUnpackedGroupedConvProgramInfoLoader(inferenceHandler, inputs, adjustedAttributes),\n      inputs,\n    );\n    return [result];\n  } else if (isPointwise && packMode) {\n    return [conv2DUnpackedPointwise(inferenceHandler, inputs, adjustedAttributes)];\n  } else if (packMode && inputs[0].dims.length === 4 && inputs[0].dims[0] === 1 && !isPointwise) {\n    return [conv2DPacked(inferenceHandler, inputs, adjustedAttributes)];\n  } else {\n    return [conv2DUnpacked(inferenceHandler, inputs, adjustedAttributes)];\n  }\n};\n\nconst conv2DUnpackedPointwise = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  attributes: ConvAttributes,\n): Tensor => {\n  const xshape = inputs[0].dims;\n  const kshape = inputs[1].dims;\n  const outputShape = calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n  const reshapedX = inferenceHandler.reshapeUnpacked(inputs[0], [xshape[1], xshape[2] * xshape[3]]);\n  const reshapedK = inferenceHandler.reshapeUnpacked(inputs[1], [kshape[0], kshape[1]]);\n\n  const matmulInputs = inputs.length > 2 ? [reshapedK, reshapedX, inputs[2]] : [reshapedK, reshapedX];\n  const matmulOutput = inferenceHandler.run(createMatmulProgramInfoLoader(matmulInputs, attributes), matmulInputs);\n  return inferenceHandler.reshapeUnpacked(matmulOutput, outputShape);\n};\n\nconst conv2DUnpacked = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  attributes: ConvAttributes,\n): Tensor => {\n  const xshape = inputs[0].dims;\n  const kshape = inputs[1].dims;\n  const outputShape = calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n  const xIm2Col = inferenceHandler.run(\n    createIm2ColProgramInfoLoader(inferenceHandler, inputs[0], inputs[1], outputShape, attributes),\n    [inputs[0]],\n  );\n\n  const dotProductInputs = inputs.length === 3 ? [xIm2Col, inputs[1], inputs[2]] : [xIm2Col, inputs[1]];\n  const output = inferenceHandler.run(\n    createDotProductProgramInfoLoader(inferenceHandler, inputs, outputShape, attributes),\n    dotProductInputs,\n  );\n  return output;\n};\n\nconst getAdjustedConvAttributes = <T extends ConvAttributes>(attributes: T, inputs: Tensor[]): T => {\n  const kernelShape = attributes.kernelShape.slice();\n  // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n  if (attributes.kernelShape.length === 0) {\n    for (let i = 2; i < inputs[1].dims.length; ++i) {\n      kernelShape.push(inputs[1].dims[i]);\n    }\n  }\n  const pads = attributes.pads.slice();\n  PoolConvUtil.adjustPadsBasedOnAutoPad(\n    inputs[0].dims,\n    attributes.strides,\n    attributes.dilations,\n    kernelShape,\n    pads,\n    attributes.autoPad,\n  );\n\n  // always return a new object so does not modify the original attributes\n  const newAttributes: T = Object.assign({}, attributes);\n  Object.assign(newAttributes, { kernelShape, pads, cacheKey: attributes.cacheKey });\n  return newAttributes;\n};\n\nexport const parseConvAttributes: OperatorInitialization<ConvAttributes> = (node: Graph.Node): ConvAttributes => {\n  const attributes = node.attributes;\n  const activationAttributes = parseInternalActivationAttributes(attributes);\n  // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n  const autoPad = attributes.getString('auto_pad', 'NOTSET');\n  const dilations = attributes.getInts('dilations', [1, 1]);\n  const group = attributes.getInt('group', 1);\n  const kernelShape = attributes.getInts('kernel_shape', []);\n  const pads = attributes.getInts('pads', [0, 0, 0, 0]);\n  const strides = attributes.getInts('strides', [1, 1]);\n\n  return createAttributeWithCacheKey({\n    autoPad,\n    dilations,\n    group,\n    kernelShape,\n    pads,\n    strides,\n    ...activationAttributes,\n  });\n};\n\nconst validateInputs = (inputs: Tensor[], attributes: ConvAttributes): void => {\n  // Refer to the below link for all input checks\n  // https://github.com/onnx/onnx/blob/main/docs/Operators.md#Conv\n  if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n    throw new Error('Conv requires 2 or 3 inputs');\n  }\n\n  // TODO : Need to add support for multi-dimensional conv\n  if (inputs[0].dims.length !== 4 || inputs[1].dims.length !== 4) {\n    throw new Error('currently only support 2-dimensional conv');\n  }\n\n  // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n  const dataChannel = inputs[0].dims[1];\n  const filterInChannel = inputs[1].dims[1] * attributes.group;\n  if (dataChannel !== filterInChannel) {\n    throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n  }\n\n  // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n  if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[1].dims[0] !== inputs[2].dims[0])) {\n    throw new Error('invalid bias');\n  }\n\n  const spatialRank = inputs[0].dims.length - 2;\n  // wrong dilations dimension\n  if (attributes.dilations.length !== spatialRank) {\n    throw new Error(`dilations should be ${spatialRank}D`);\n  }\n\n  // Wrong strides dimension\n  if (attributes.strides.length !== spatialRank) {\n    throw new Error(`strides should be ${spatialRank}D`);\n  }\n\n  // Wrong pads dimension\n  if (attributes.pads.length !== spatialRank * 2) {\n    throw new Error(`pads should be ${spatialRank * 2}D`);\n  }\n\n  // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n  // (the first 2 dims are batch_size and channels)\n  if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n    throw new Error('invalid kernel shape');\n  }\n\n  // TODO : Need to add support for float64\n  if (inputs[0].type !== 'float32' || inputs[1].type !== 'float32') {\n    throw new Error('Conv input(X,W) should be float tensor');\n  }\n\n  if (inputs.length === 3 && inputs[2].type !== 'float32') {\n    throw new Error('Conv input(bias) should be float tensor');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { InferenceHandler } from '../../../backend';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nimport { ConvAttributes } from './conv';\nimport { getActivationSnippet, parseInternalActivationAttributes } from './fuse-utils';\n\nconst computeTotalPad = (\n  inDim: number,\n  stride: number,\n  adj: number,\n  kernel: number,\n  dilation: number,\n  outSize: number,\n) => (inDim - 1) * stride + adj + (kernel - 1) * dilation + 1 - outSize;\n\nconst distributePadding = (totalPad: number, autoPad: string, pads: number[], head: number, tail: number) => {\n  const smallPad = Math.floor(totalPad / 2);\n  if (autoPad === 'SAME_UPPER') {\n    pads[head] = smallPad;\n    pads[tail] = totalPad - smallPad;\n  } else if (autoPad === 'SAME_LOWER') {\n    pads[head] = totalPad - smallPad;\n    pads[tail] = smallPad;\n  }\n};\n\nconst calculateOutputShapeAndPads = (\n  inputShape: readonly number[],\n  kernelShape: readonly number[],\n  dilations: readonly number[],\n  autoPad: string,\n  pads: number[],\n  strides: readonly number[],\n  outputPadding: readonly number[],\n  outputShape: number[],\n) => {\n  const spatialRank = inputShape.length - 2;\n  const updateShape = outputShape.length === 0;\n  for (let i = 0; i < spatialRank; ++i) {\n    const outSize = updateShape ? inputShape[i + 2] * strides[i] : outputShape[i];\n    const totalPad = computeTotalPad(inputShape[i + 2], strides[i], pads[i], kernelShape[i], dilations[i], outSize);\n    distributePadding(totalPad, autoPad, pads, i, i + spatialRank);\n    if (updateShape) {\n      outputShape.push(\n        strides[i] * (inputShape[i + 2] - 1) +\n          outputPadding[i] +\n          (kernelShape[i] - 1) * dilations[i] +\n          1 -\n          pads[i] -\n          pads[i + spatialRank],\n      );\n    }\n  }\n};\n\nexport interface ConvTransposeAttributes extends ConvAttributes {\n  readonly outputPadding: readonly number[];\n  readonly outputShape: readonly number[];\n}\n\nexport const convTranspose: OperatorImplementation<ConvTransposeAttributes> = (\n  inferenceHandler: InferenceHandler,\n  inputs: Tensor[],\n  attributes: ConvTransposeAttributes,\n): Tensor[] => {\n  validateInputs(inputs, attributes); // currently will fail if not convTranspose2D\n  return convTranspose2d(inferenceHandler, inputs, attributes);\n};\n\nconst convTranspose2d: OperatorImplementation<ConvTransposeAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ConvTransposeAttributes,\n): Tensor[] => {\n  const adjustedAttributes = getAdjustedConvTransposeAttributes(attributes, inputs);\n  return [convTranspose2DUnpacked(inferenceHandler, inputs, adjustedAttributes)];\n};\n\nconst createConvTransposeProgramMetadata = (hasBias: boolean, cacheHint: string) => ({\n  name: 'ConvTranspose',\n  inputNames: hasBias ? ['X', 'W', 'B'] : ['X', 'W'],\n  inputTypes: hasBias\n    ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked]\n    : [TextureType.unpacked, TextureType.unpacked],\n  cacheHint,\n});\n\nconst createUnpackedConvTransposeProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  metadata: ProgramMetadata,\n  attributes: ConvTransposeAttributes,\n): ProgramInfo => {\n  const hasBias = inputs.length > 2;\n  const valueInit = hasBias ? 'getB(output_channel)' : '0.0';\n  const xShape = inputs[0].dims;\n  const wShape = inputs[1].dims;\n  const outputChannelsPerGroup = wShape[1];\n  const inputChannelsPerGroup = wShape[0] / attributes.group;\n  const outputShape = [inputs[0].dims[0], inputs[1].dims[1] * attributes.group, ...attributes.outputShape];\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const { activationFunction, applyActivation } = getActivationSnippet(attributes);\n\n  const shaderSource = `\n  const ivec2 strides = ivec2(${attributes.strides[0]}, ${attributes.strides[1]});\n  const ivec2 pads = ivec2(${attributes.pads[0]}, ${attributes.pads[1]});\n  ${activationFunction}\n  void main() {\n    ivec4 coords = getOutputCoords();\n    int batch = coords.x;\n    int output_channel = coords.y;\n\n    ivec2 loc = coords.zw + pads;\n\n    int group_id = output_channel / ${outputChannelsPerGroup};\n    int wOutChannel = output_channel - group_id * ${outputChannelsPerGroup};\n\n    float value = ${valueInit};\n    for (int inChannelOffset = 0; inChannelOffset < ${inputChannelsPerGroup}; inChannelOffset++) {\n      int input_channel = group_id * ${inputChannelsPerGroup} + inChannelOffset;\n      for (int wWOff = 0; wWOff < ${wShape[2]}; wWOff++) {\n        for (int wHOff = 0; wHOff < ${wShape[3]}; wHOff++) {\n          ivec2 wOff = ivec2(wWOff * ${attributes.dilations[0]}, wHOff * ${attributes.dilations[1]});\n          ivec2 wLoc = loc - wOff;\n          ivec2 wLocIn = wLoc / strides;\n          if (\n            wLocIn * strides == wLoc &&\n            wLocIn.x >= 0 && wLocIn.x < ${xShape[2]} &&\n            wLocIn.y >= 0 && wLocIn.y < ${xShape[3]}\n          ) {\n            float xVal = getX(batch, input_channel, wLocIn.y, wLocIn.x);\n            float wVal = getW(input_channel, wOutChannel, wHOff, wWOff);\n            value += xVal * wVal;\n          }\n        }\n      }\n    }\n    ${applyActivation}\n    ${glsl.output} = vec4(value, .0, .0, .0);\n  }\n`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n    hasMain: true,\n  };\n};\n\nconst createUnpackedConvTransposeProgramInfoLoader = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  attributes: ConvTransposeAttributes,\n): ProgramInfoLoader => {\n  const metadata = createConvTransposeProgramMetadata(inputs.length > 2, attributes.cacheKey);\n  return {\n    ...metadata,\n    get: () => createUnpackedConvTransposeProgramInfo(inferenceHandler, inputs, metadata, attributes),\n  };\n};\n\nconst convTranspose2DUnpacked = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: readonly Tensor[],\n  attributes: ConvTransposeAttributes,\n): Tensor => {\n  const result = inferenceHandler.run(\n    createUnpackedConvTransposeProgramInfoLoader(inferenceHandler, inputs, attributes),\n    inputs,\n  );\n  return result;\n};\n\nconst getAdjustedConvTransposeAttributes = <T extends ConvTransposeAttributes>(attributes: T, inputs: Tensor[]): T => {\n  const kernelShape = attributes.kernelShape.slice();\n  // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n  if (attributes.kernelShape.length === 0) {\n    for (let i = 2; i < inputs[1].dims.length; ++i) {\n      kernelShape.push(inputs[1].dims[i]);\n    }\n  }\n\n  const pads = attributes.pads.slice();\n  const outputShape = attributes.outputShape.slice();\n  const inputShape = inputs[0].dims;\n  // If outputShape is not specified in the attributes of this op, infer it from the parameters\n  // Similarly, automatically infer pads if not specified\n  calculateOutputShapeAndPads(\n    inputShape,\n    kernelShape,\n    attributes.dilations,\n    attributes.autoPad,\n    pads,\n    attributes.strides,\n    attributes.outputPadding,\n    outputShape,\n  );\n\n  // always return a new object so does not modify the original attributes\n  const newAttributes: T = Object.assign({}, attributes);\n  Object.assign(newAttributes, { kernelShape, pads, outputShape, cacheKey: attributes.cacheKey });\n  return newAttributes;\n};\n\nexport const parseConvTransposeAttributes: OperatorInitialization<ConvTransposeAttributes> = (\n  node: Graph.Node,\n): ConvTransposeAttributes => {\n  const attributes = node.attributes;\n  const activationAttributes = parseInternalActivationAttributes(attributes);\n  // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n  const autoPad = attributes.getString('auto_pad', 'NOTSET');\n  const dilations = attributes.getInts('dilations', [1, 1]);\n  const group = attributes.getInt('group', 1);\n  const kernelShape = attributes.getInts('kernel_shape', []);\n  const outputPadding = attributes.getInts('output_padding', [0, 0]);\n  const outputShape = attributes.getInts('output_shape', []);\n  const pads = attributes.getInts('pads', [0, 0, 0, 0]);\n  const strides = attributes.getInts('strides', [1, 1]);\n\n  return createAttributeWithCacheKey({\n    autoPad,\n    dilations,\n    group,\n    kernelShape,\n    outputPadding,\n    outputShape,\n    pads,\n    strides,\n    ...activationAttributes,\n  });\n};\n\nconst validateInputs = (inputs: Tensor[], attributes: ConvTransposeAttributes): void => {\n  // Refer to the below link for all input checks\n  // https://github.com/onnx/onnx/blob/main/docs/Operators.md#Conv\n  if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n    throw new Error('Conv requires 2 or 3 inputs');\n  }\n\n  // TODO : Need to add support for multi-dimensional conv\n  if (inputs[0].dims.length !== 4 || inputs[1].dims.length !== 4) {\n    throw new Error('currently only support 2-dimensional conv');\n  }\n\n  // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n  const dataChannel = inputs[0].dims[1];\n  const filterInChannel = inputs[1].dims[0];\n  if (dataChannel !== filterInChannel) {\n    throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n  }\n\n  const featureMaps = inputs[1].dims[1] * attributes.group;\n\n  // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n  if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[2].dims[0] !== featureMaps)) {\n    throw new Error('invalid bias');\n  }\n\n  const spatialRank = inputs[0].dims.length - 2;\n  // wrong dilations dimension\n  if (attributes.dilations.length !== spatialRank) {\n    throw new Error(`dilations should be ${spatialRank}D`);\n  }\n\n  // Wrong strides dimension\n  if (attributes.strides.length !== spatialRank) {\n    throw new Error(`strides should be ${spatialRank}D`);\n  }\n\n  // Wrong pads dimension\n  if (attributes.pads.length !== spatialRank * 2) {\n    throw new Error(`pads should be ${spatialRank * 2}D`);\n  }\n\n  // Wrong output padding dimension\n  if (attributes.outputPadding.length !== spatialRank) {\n    throw new Error(`output_padding should be ${spatialRank}D`);\n  }\n\n  // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n  // (the first 2 dims are batch_size and channels)\n  if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n    throw new Error('invalid kernel shape');\n  }\n\n  // as with kernelShape, must have same number of spatial dims as input\n  if (attributes.outputShape.length !== 0 && attributes.outputShape.length !== inputs[0].dims.length - 2) {\n    throw new Error('invalid output shape');\n  }\n\n  // TODO : Need to add support for float64\n  if (inputs[0].type !== 'float32' || inputs[1].type !== 'float32') {\n    throw new Error('ConvTranspose input(X,W) should be float tensor');\n  }\n\n  if (inputs.length === 3 && inputs[2].type !== 'float32') {\n    throw new Error('ConvTranspose input(bias) should be float tensor');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, TextureType } from '../types';\n\nexport interface TransposeAttributes extends AttributeWithCacheKey {\n  readonly perm: number[];\n}\n\nconst transposeProgramMetadata = {\n  name: 'Transpose',\n  inputNames: ['A'],\n  inputTypes: [TextureType.unpacked],\n};\n\nexport const transpose: OperatorImplementation<TransposeAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: TransposeAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n  const output = inferenceHandler.run(\n    {\n      ...transposeProgramMetadata,\n      cacheHint: attributes.cacheKey,\n      get: () => createTransposeProgramInfo(inferenceHandler, inputs[0], attributes.perm),\n    },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parseTransposeAttributes: OperatorInitialization<TransposeAttributes> = (\n  node: Graph.Node,\n): TransposeAttributes => createAttributeWithCacheKey({ perm: node.attributes.getInts('perm', []) });\n\nconst createTransposeProgramInfo = (\n  _inferenceHandler: WebGLInferenceHandler,\n  input: Tensor,\n  perm: number[],\n): ProgramInfo => {\n  const inputShape = input.dims;\n  perm = getAdjustedPerm(inputShape, perm);\n  const unpackedOutputShape = getOutputShape(inputShape, perm);\n  const rank = inputShape.length;\n  // A dims=[${inputs[0].dims.toString()}]\n  // out Dims=[${unpackedOutputShape.toString()}]\n  // based on perm=[${perm.toString()}]\n  const shaderSource = `\n      ${getPermFunctionBody('perm', perm, rank)}\n      float process(int indices[${rank}]) {\n        int a[${rank}];\n        perm(a, indices);\n        return _A(a);\n      }`;\n  return {\n    ...transposeProgramMetadata,\n    output: { dims: unpackedOutputShape, type: input.type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst getAdjustedPerm = (inputShape: readonly number[], perm: number[]): number[] => {\n  if (perm && perm.length !== inputShape.length) {\n    perm = [...inputShape.keys()].reverse();\n  }\n  return perm;\n};\n\nconst getOutputShape = (inputShape: readonly number[], perm: number[]): readonly number[] => {\n  perm = getAdjustedPerm(inputShape, perm);\n  return ShapeUtil.sortBasedOnPerm(inputShape, perm);\n};\n\nconst getPermFunctionBody = (name: string, perm: number[], rank: number): string => {\n  const reverseFunc = [];\n  reverseFunc.push(`void ${name}(out int a[${rank}], int src[${rank}]) {`);\n  for (let i = 0; i < rank; ++i) {\n    reverseFunc.push(`\\ta[${perm[i]}]=src[${i}];`);\n  }\n  reverseFunc.push('\\t}');\n  return reverseFunc.join('\\n');\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Transpose requires 1 input.');\n  }\n\n  if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n    throw new Error('input should be float tensor');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { WebGLInferenceHandler } from '../inference-handler';\n\nimport { transpose, TransposeAttributes } from './transpose';\n\nexport interface DepthToSpaceAttributes {\n  mode: 'DCR' | 'CRD';\n  blocksize: number;\n}\n\nexport const depthToSpace: OperatorImplementation<DepthToSpaceAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: DepthToSpaceAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n  const blocksize = attributes.blocksize;\n  const blocksizeSqr = blocksize * blocksize;\n  const transposePerm = attributes.mode === 'DCR' ? [0, 3, 4, 1, 5, 2] : [0, 1, 4, 2, 5, 3];\n  const firstReshapeShape =\n    attributes.mode === 'DCR'\n      ? [\n          inputs[0].dims[0],\n          blocksize,\n          blocksize,\n          inputs[0].dims[1] / blocksizeSqr,\n          inputs[0].dims[2],\n          inputs[0].dims[3],\n        ]\n      : [\n          inputs[0].dims[0],\n          inputs[0].dims[1] / blocksizeSqr,\n          blocksize,\n          blocksize,\n          inputs[0].dims[2],\n          inputs[0].dims[3],\n        ];\n\n  // const transpose = new WebGLTranspose();\n  // const attributes = new Attribute(undefined);\n  // attributes.set('perm', 'ints', transposePerm);\n  // transpose.initialize(attributes);\n\n  // First reshape\n  const firstReshapedTensor = inferenceHandler.reshapeUnpacked(inputs[0], firstReshapeShape);\n\n  // transpose\n  const transposeAttributes: TransposeAttributes = { perm: transposePerm, cacheKey: `${transposePerm}` };\n  const [transposeOutput] = transpose(inferenceHandler, [firstReshapedTensor], transposeAttributes);\n\n  // Second reshape\n  const secondReshapeShape = [\n    inputs[0].dims[0],\n    inputs[0].dims[1] / blocksizeSqr,\n    inputs[0].dims[2] * blocksize,\n    inputs[0].dims[3] * blocksize,\n  ];\n  const result = inferenceHandler.reshapeUnpacked(transposeOutput, secondReshapeShape);\n  return [result];\n};\n\nexport const parseDepthToSpaceAttributes: OperatorInitialization<DepthToSpaceAttributes> = (\n  node: Graph.Node,\n): DepthToSpaceAttributes => {\n  // processing node attributes\n  const blocksize = node.attributes.getInt('blocksize');\n  if (blocksize < 1) {\n    throw new Error(`blocksize must be >= 1, but got : ${blocksize} for DepthToSpace`);\n  }\n  const mode = node.attributes.getString('mode', 'DCR');\n  if (mode !== 'DCR' && mode !== 'CRD') {\n    throw new Error(`unrecognized mode: ${mode} for DepthToSpace`);\n  }\n  return { mode, blocksize };\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (inputs.length !== 1) {\n    throw new Error(`DepthToSpace expect 1 inputs, but got ${inputs.length}`);\n  }\n\n  // Input has to be a 4-D tensor\n  // TODO: Support string depth-to-space.\n  if (inputs[0].type === 'string' || inputs[0].dims.length !== 4) {\n    throw new TypeError('DepthToSpace input should be a 4-D numeric tensor');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\n\nexport const flatten: OperatorImplementation<number> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  axis: number,\n): Tensor[] => {\n  validateInputs(inputs, axis);\n\n  const outputDims = ShapeUtil.flattenShape(inputs[0].dims, axis);\n  return [inferenceHandler.reshapeUnpacked(inputs[0], outputDims)];\n};\n\nexport const parseFlattenAttributes: OperatorInitialization<number> = (node: Graph.Node): number =>\n  node.attributes.getInt('axis', 1); // default axis is 1\n\nconst validateInputs = (inputs: Tensor[], axis: number): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Flatten requires 1 input.');\n  }\n\n  const r = inputs[0].dims.length;\n  if (r === 0) {\n    throw new Error('scalar tensor is not supported.');\n  }\n\n  if (axis < -r || axis > r) {\n    throw new Error('Invalid axis');\n  }\n\n  // TODO: Support string type\n  if (inputs[0].type === 'string') {\n    throw new Error('string tensor is not supported.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { InferenceHandler } from './backend';\nimport { Graph } from './graph';\nimport { Tensor } from './tensor';\n\nexport type OperatorImplementation<T> = (inferenceHandler: InferenceHandler, inputs: Tensor[], context: T) => Tensor[];\nexport type OperatorInitialization<T> = (node: Graph.Node, graph: Graph) => T;\n\nexport interface Operator {\n  readonly impl: OperatorImplementation<unknown>;\n  readonly context: Graph.Node | unknown;\n}\n\nexport const NUMBER_TYPES: readonly Tensor.DataType[] = [\n  'float32',\n  'float64',\n  'int32',\n  'int16',\n  'int8',\n  'uint16',\n  'uint32',\n  'uint8',\n];\nexport const INT_TYPES: readonly Tensor.DataType[] = ['int32', 'int16', 'int8', 'uint16', 'uint32', 'uint8'];\nexport const FLOAT_TYPES: readonly Tensor.DataType[] = ['float32', 'float64'];\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { NUMBER_TYPES, OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\ninterface GatherAttributes extends AttributeWithCacheKey {\n  readonly axis: number;\n}\n\nexport const gather: OperatorImplementation<GatherAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: GatherAttributes,\n): Tensor[] => {\n  validateInputs(inputs, attributes.axis);\n  const output = inferenceHandler.run(createGatherProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n  return [output];\n};\n\nexport const parseGatherAttributes: OperatorInitialization<GatherAttributes> = (node: Graph.Node): GatherAttributes =>\n  createAttributeWithCacheKey({ axis: node.attributes.getInt('axis', 0) });\n\nconst gatherProgramMetadata = {\n  name: 'Gather',\n  inputNames: ['A', 'B'],\n  inputTypes: [TextureType.unpacked, TextureType.unpacked],\n};\n\nconst createGatherProgramInfo = (\n  _handler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  inputs: Tensor[],\n  axis: number,\n): ProgramInfo => {\n  const inputShape = inputs[0].dims.slice();\n  const indexDataShape = inputs[1].dims.slice();\n  const outputShape = new Array(inputShape.length + indexDataShape.length - 1);\n\n  axis = ShapeUtil.normalizeAxis(axis, inputShape.length);\n  const indexCopyOps: string[] = [];\n  for (let i = 0; i < outputShape.length; i++) {\n    // outputShape is divided into three parts: A, B, C\n    // |0        axis|  axis + indexDataShape.length |          end|\n    // |     A       |             B                 |      C      |\n    //\n    // inputIdx: [A, inputs[1][B], C]\n    if (i < axis) {\n      // A\n      outputShape[i] = inputShape[i];\n      indexCopyOps.push(`inputIdx[${i}] = outputIdx[${i}];`);\n    } else {\n      if (i < axis + indexDataShape.length) {\n        // B\n        outputShape[i] = indexDataShape[i - axis];\n        indexCopyOps.push(`indexDataIdx[${i - axis}] = outputIdx[${i}];`);\n      } else {\n        // C\n        outputShape[i] = inputShape[i - indexDataShape.length + 1]; // skip 1 for axis\n        indexCopyOps.push(`inputIdx[${i - indexDataShape.length + 1}] = outputIdx[${i}];`);\n      }\n    }\n  }\n\n  const orank = outputShape.length || 1;\n  const irank = inputShape.length;\n  const iDrank = indexDataShape.length || 1;\n  const shaderSource = `\n      float process(int outputIdx[${orank}]) {\n        int inputIdx[${irank}];\n        int indexDataIdx[${iDrank}];\n        indexDataIdx[0] = 0;\n        ${indexCopyOps.join('\\n        ')}\n        int idx = int(_B(indexDataIdx));\n        inputIdx[${axis}] = idx < 0 ? idx + ${inputShape[axis]} : idx;\n        return _A(inputIdx);\n      }`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst createGatherProgramInfoLoader = (\n  handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: GatherAttributes,\n): ProgramInfoLoader => {\n  const metadata = { ...gatherProgramMetadata, cacheHint: attributes.cacheKey };\n  return { ...metadata, get: () => createGatherProgramInfo(handler, metadata, inputs, attributes.axis) };\n};\n\nconst validateInputs = (inputs: Tensor[], axis: number): void => {\n  if (!inputs || inputs.length !== 2) {\n    throw new Error('Gather requires 2 inputs.');\n  }\n  const tensorRank = inputs[0].dims.length;\n  if (tensorRank < 1) {\n    throw new Error('Invalid input shape.');\n  }\n  if (axis < -tensorRank || axis > tensorRank - 1) {\n    throw new Error('Invalid axis.');\n  }\n  if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n    throw new Error('Invaid input type.');\n  }\n  if (inputs[1].type !== 'int32' && inputs[1].type !== 'int16') {\n    throw new Error('Invaid input type.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { GemmUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nexport interface GemmAttributes extends AttributeWithCacheKey {\n  transA: boolean;\n  transB: boolean;\n  alpha: number;\n  beta: number;\n  isOptionalC: boolean; // in opset 11, C becomes optional\n}\n\nexport const gemm: OperatorImplementation<GemmAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: GemmAttributes,\n): Tensor[] => {\n  validateInputs(inputs, attributes);\n  const output = inferenceHandler.run(createGemmProgramInfoLoader(inputs, attributes), inputs);\n  return [output];\n};\n\nconst parseGemmAttributes = (node: Graph.Node, isOptionalC: boolean): GemmAttributes => {\n  const transA = node.attributes.getInt('transA', 0) !== 0;\n  const transB = node.attributes.getInt('transB', 0) !== 0;\n  const alpha = node.attributes.getFloat('alpha', 1.0);\n  const beta = node.attributes.getFloat('beta', 1.0);\n  return createAttributeWithCacheKey({ transA, transB, alpha, beta, isOptionalC });\n};\n\nexport const parseGemmAttributesV7: OperatorInitialization<GemmAttributes> = (node: Graph.Node): GemmAttributes =>\n  parseGemmAttributes(node, false);\n\nexport const parseGemmAttributesV11: OperatorInitialization<GemmAttributes> = (node: Graph.Node): GemmAttributes =>\n  parseGemmAttributes(node, true);\n\nconst createGemmProgramInfoLoader = (inputs: Tensor[], attributes: GemmAttributes): ProgramInfoLoader => {\n  const metadata = {\n    name: 'Gemm',\n    inputNames: inputs.length === 3 ? ['A', 'B', 'C'] : ['A', 'B'],\n    inputTypes:\n      inputs.length === 3\n        ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked]\n        : [TextureType.unpacked, TextureType.unpacked],\n    key: attributes.cacheKey,\n  };\n\n  return { ...metadata, get: () => createGemmProgramInfo(metadata, inputs, attributes) };\n};\n\nconst createGemmProgramInfo = (\n  metadata: ProgramMetadata,\n  inputs: Tensor[],\n  attributes: GemmAttributes,\n): ProgramInfo => {\n  const aShape = inputs[0].dims.slice();\n  const bShape = inputs[1].dims.slice();\n  const [M, N] = GemmUtil.getShapeOfGemmResult(\n    aShape,\n    attributes.transA,\n    bShape,\n    attributes.transB,\n    inputs.length === 3 ? inputs[2].dims : undefined,\n  );\n  const outputShape = [M, N];\n  if (!outputShape) {\n    throw new Error(\"Can't use gemm on the given tensors\");\n  }\n  let sharedDim = aShape[aShape.length - 1];\n  let line = '';\n  if (attributes.transA) {\n    sharedDim = aShape[0];\n  }\n  if (attributes.transA && attributes.transB) {\n    line = 'value += _A_T(a) * _B_T(b);';\n  } else if (attributes.transA && !attributes.transB) {\n    line = 'value += _A_T(a) * _B(b);';\n  } else if (!attributes.transA && attributes.transB) {\n    line = 'value += _A(a) * _B_T(b);';\n  } else if (!attributes.transA && !attributes.transB) {\n    line = 'value += _A(a) * _B(b);';\n  }\n  const rank = outputShape.length;\n  const declareC = inputs.length === 3 ? `int c[${inputs[2].dims.length}];` : '';\n  const broadcastC = inputs.length === 3 ? 'bcastIndices_C(indices, c);' : '';\n  const calculateC = inputs.length === 3 ? 'value += beta * _C(c);' : '';\n  const shaderSource = `\n      float process(int indices[${rank}]) {\n          int a[${rank}];\n          int b[${rank}];\n          ${declareC}\n\n          copyVec(indices, a);\n          copyVec(indices, b);\n          ${broadcastC}\n\n          float value = 0.0;\n          for (int k=0; k<${sharedDim}; ++k) {\n              a[${rank - 1}] = k;\n              b[${rank - 2}] = k;\n              ${line}\n          }\n\n          value = value * alpha;\n          ${calculateC}\n          return value;\n      }`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    variables: [\n      { name: 'alpha', type: 'float', data: attributes.alpha },\n      { name: 'beta', type: 'float', data: attributes.beta },\n    ],\n    shaderSource,\n  };\n};\n\nconst validateInputs = (inputs: Tensor[], attributes: GemmAttributes): void => {\n  if (!inputs) {\n    throw new Error('Input is missing');\n  }\n  if (attributes.isOptionalC && (inputs.length < 2 || inputs.length > 3)) {\n    throw new Error('Invaid input shape.');\n  }\n  if (!attributes.isOptionalC && inputs.length !== 3) {\n    throw new Error('Gemm requires 3 inputs');\n  }\n\n  // 'C' can be of dimensionality 1 or 2 only\n  if (inputs.length === 3 && inputs[2].dims.length !== 1 && inputs[2].dims.length !== 2) {\n    throw new Error('Invalid input shape of C');\n  }\n\n  if (\n    (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') ||\n    (inputs[1].type !== 'float32' && inputs[1].type !== 'float64') ||\n    (inputs.length === 3 && inputs[2].type !== 'float32' && inputs[2].type !== 'float64')\n  ) {\n    throw new Error('Invalid input type.');\n  }\n\n  if (inputs[0].type !== inputs[1].type || (inputs.length === 3 && inputs[0].type !== inputs[2].type)) {\n    throw new Error('Input types are mismatched');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nexport interface ImageScalerAttributes extends AttributeWithCacheKey {\n  scale: number;\n  bias: number[];\n}\n\nexport const imageScaler: OperatorImplementation<ImageScalerAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ImageScalerAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n  const output = inferenceHandler.run(createImageScalerProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n  return [output];\n};\n\nexport const parseImageScalerAttributes: OperatorInitialization<ImageScalerAttributes> = (\n  node: Graph.Node,\n): ImageScalerAttributes => {\n  const scale = node.attributes.getFloat('scale');\n  const bias = node.attributes.getFloats('bias');\n  return createAttributeWithCacheKey({ scale, bias });\n};\n\nconst imageScalerProgramMetadata = {\n  name: 'ImageScaler',\n  inputNames: ['X'],\n  inputTypes: [TextureType.unpacked],\n};\n\nconst createImageScalerProgramInfo = (\n  _handler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  inputs: Tensor[],\n  attributes: ImageScalerAttributes,\n): ProgramInfo => {\n  const outputShape = inputs[0].dims.slice();\n  const rank = outputShape.length;\n  const getBiasMethod = createGetBiasMethod(attributes.bias.length);\n  const shaderSource = `\n      ${getBiasMethod}\n      float process(int indices[${rank}]) {\n        return _X(indices) * scale + getBias(bias, indices[1]);\n      }`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    variables: [\n      { name: 'bias', type: 'float', arrayLength: attributes.bias.length, data: attributes.bias },\n      { name: 'scale', type: 'float', data: attributes.scale },\n    ],\n    shaderSource,\n  };\n};\n\nconst createImageScalerProgramInfoLoader = (\n  handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ImageScalerAttributes,\n): ProgramInfoLoader => {\n  const metadata = { ...imageScalerProgramMetadata, cacheHint: attributes.cacheKey };\n  return { ...metadata, get: () => createImageScalerProgramInfo(handler, metadata, inputs, attributes) };\n};\n\nconst createGetBiasMethod = (numChannels: number): string => {\n  const codeLines: string[] = [`float getBias(float bias[${numChannels}], int channel) {`];\n  for (let i = 0; i < numChannels; ++i) {\n    if (i === 0) {\n      codeLines.push('\\t' + `if (channel == ${i}) { return bias[${i}]; }`);\n    } else if (i === numChannels - 1) {\n      codeLines.push('\\t' + `else { return bias[${i}]; }`);\n    } else {\n      codeLines.push('\\t' + `else if (channel == ${i}) { return bias[${i}]; }`);\n    }\n  }\n  codeLines.push('\\t' + '}');\n  return codeLines.join('\\n');\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('ImageScaler requires 1 input.');\n  }\n  if (inputs[0].dims.length !== 4) {\n    throw new Error('Invalid input shape.');\n  }\n  if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n    throw new Error('Invalid input type.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType } from '../types';\n\nexport const instanceNormalization: OperatorImplementation<number> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  epsilon: number,\n): Tensor[] => {\n  validateInputs(inputs);\n\n  const meanAndVariance = inferenceHandler.run(createMeanAndVarianceProgramInfoLoader(inputs[0]), inputs);\n  const output = inferenceHandler.run(\n    createComputeOutputProgramInfoLoader(inferenceHandler, inputs[0], epsilon, meanAndVariance.dims),\n    [inputs[0], meanAndVariance, inputs[1], inputs[2]],\n  );\n  return [output];\n};\n\nexport const parseInstanceNormalizationAttributes: OperatorInitialization<number> = (node: Graph.Node): number =>\n  node.attributes.getFloat('epsilon', 1e-5);\n\nconst meanAndVarianceProgramMetadata = {\n  name: 'InstanceNormalization_MeanAndVariance',\n  inputNames: ['X'],\n  inputTypes: [TextureType.unpacked],\n};\n\nconst createMeanAndVarianceProgramInfo = (metadata: ProgramMetadata, input: Tensor): ProgramInfo => {\n  const xDims = input.dims.slice();\n  const channel = xDims[1];\n  const channelSize = xDims[2] * xDims[3];\n  const outputShape = [xDims[0], channel];\n\n  const shaderSource = `\n      vec4 process(int[2] indices) {\n        vec4 v = vec4(0.0);\n        int a[4];\n        a[0] = indices[0];\n        a[1] = indices[1];\n        float temp = 0.0;\n        for(int a2=0; a2<${xDims[2]}; a2++) {\n          a[2] = a2;\n          for(int a3=0; a3<${xDims[3]}; a3++) {\n            a[3] = a3;\n            float x = _X(a);\n            temp += x;\n          }\n        }\n        float mean = temp / float(${channelSize});\n        temp = 0.0;\n        for(int a2=0; a2<${xDims[2]}; a2++) {\n          a[2] = a2;\n          for(int a3=0; a3<${xDims[3]}; a3++) {\n            a[3] = a3;\n            float x = _X(a);\n            temp += (x - mean) * (x - mean);\n          }\n        }\n        v.r = mean;\n        v.g = temp / float(${channelSize});\n\n        return v;\n      }`;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: input.type, textureType: TextureType.packedLastDimension },\n    shaderSource,\n  };\n};\n\nconst createMeanAndVarianceProgramInfoLoader = (input: Tensor): ProgramInfoLoader => ({\n  ...meanAndVarianceProgramMetadata,\n  get: () => createMeanAndVarianceProgramInfo(meanAndVarianceProgramMetadata, input),\n});\n\nconst computeOutputProgramMetadata = {\n  name: 'InstanceNormalization_ComputeOutput',\n  inputNames: ['X', 'MeanAndVariance', 'Scale', 'B'],\n  inputTypes: [TextureType.unpacked, TextureType.packedLastDimension, TextureType.unpacked, TextureType.unpacked],\n};\n\nconst createComputeOutputProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  metadata: ProgramMetadata,\n  input: Tensor,\n  epsilon: number,\n  meanAndVarianceShape: readonly number[],\n): ProgramInfo => {\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const [textureWidth, textureHeight] = inferenceHandler.calculateTextureWidthAndHeight(\n    meanAndVarianceShape,\n    TextureType.packedLastDimension,\n  );\n  const [meanAndVarianceWidth, meanAndVarianceHeight] = [textureWidth / 4, textureHeight];\n  const shaderSource = `\n      vec4 get_MeanAndVariance(int[2] mv) {\n        int offset = indicesToOffset_MeanAndVariance(mv);\n        vec2 coords = offsetToCoords(offset, ${meanAndVarianceWidth}, ${meanAndVarianceHeight});\n        return ${glsl.texture2D}(MeanAndVariance, coords);\n      }\n\n      float process(int[4] indices) {\n        int mv[2];\n        mv[0] = indices[0];\n        mv[1] = indices[1];\n        vec4 mean_and_variance = get_MeanAndVariance(mv);\n        float mean = mean_and_variance.r;\n        float variance = mean_and_variance.g;\n\n        int sb[1];\n        sb[0] = indices[1];\n        float scale = _Scale(sb);\n        float b = _B(sb);\n\n        return scale * (_X(indices) - mean) / sqrt(variance + epsilon) + b;\n      }`;\n  return {\n    ...metadata,\n    output: { dims: input.dims, type: input.type, textureType: TextureType.unpacked },\n    variables: [{ name: 'epsilon', type: 'float', data: epsilon }],\n    shaderSource,\n  };\n};\n\nconst createComputeOutputProgramInfoLoader = (\n  inferenceHandler: WebGLInferenceHandler,\n  input: Tensor,\n  epsilon: number,\n  meanAndVarianceShape: readonly number[],\n): ProgramInfoLoader => {\n  const metadata = { ...computeOutputProgramMetadata, cacheHint: `${epsilon}` };\n  return {\n    ...metadata,\n    get: () => createComputeOutputProgramInfo(inferenceHandler, metadata, input, epsilon, meanAndVarianceShape),\n  };\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 3) {\n    throw new Error('InstanceNormalization requires 3 inputs.');\n  }\n\n  const X = inputs[0];\n  const scale = inputs[1];\n  const B = inputs[2];\n\n  // input should at least have three dimensions - N,C,dim1,...,dimn\n  // other inputs can have only one dimensions\n  if (X.dims.length < 3 || scale.dims.length !== 1 || B.dims.length !== 1) {\n    throw new Error('Invalid input shape.');\n  }\n  if (scale.dims[0] !== X.dims[1] || B.dims[0] !== X.dims[1]) {\n    throw new Error('Input shapes are mismatched.');\n  }\n  if (\n    (X.type !== 'float32' && X.type !== 'float64') ||\n    (scale.type !== 'float32' && scale.type !== 'float64') ||\n    (B.type !== 'float32' && B.type !== 'float64')\n  ) {\n    throw new Error('Invalid input type.');\n  }\n  if (inputs[0].dims.length !== 4) {\n    throw new Error('Only support 4-D input shape.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramInfoLoader, TextureType } from '../types';\n\nexport interface LrnAttributes extends AttributeWithCacheKey {\n  alpha: number;\n  beta: number;\n  bias: number;\n  size: number;\n}\n\nexport const lrn: OperatorImplementation<LrnAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: LrnAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n\n  // if (inferenceHandler.session.pack) {\n  //   return [inferenceHandler.run(createPackedLrnProgramInfoLoader(inferenceHandler, inputs, attributes),\n  //   inputs)];\n  // } else {\n  return [inferenceHandler.run(createLrnProgramInfoLoader(inputs, attributes), inputs)];\n  //}\n};\n\nexport const parseLrnAttributes: OperatorInitialization<LrnAttributes> = (node: Graph.Node): LrnAttributes => {\n  const alpha = node.attributes.getFloat('alpha', 0.0001);\n  const beta = node.attributes.getFloat('beta', 0.75);\n  const bias = node.attributes.getFloat('bias', 1.0);\n  const size = node.attributes.getInt('size');\n\n  return createAttributeWithCacheKey({ alpha, beta, bias, size });\n};\n\nconst lrnProgramMetadata = {\n  name: 'LRN',\n  inputNames: ['X'],\n  inputTypes: [TextureType.unpacked],\n};\n\nfunction createLrnProgramInfo(inputs: Tensor[], attributes: LrnAttributes): ProgramInfo {\n  const C = inputs[0].dims[1];\n  const rank = inputs[0].dims.length;\n  const from = -Math.floor((attributes.size - 1) / 2);\n  const to = Math.ceil((attributes.size - 1) / 2);\n  const alpha = `float(${attributes.alpha}) / float(${attributes.size})`;\n  const bias = `float(${attributes.bias})`;\n  const beta = `float(${attributes.beta})`;\n\n  const shaderSource = `\n    float process(int indices[${rank}]) {\n        int c = indices[1];\n        float x = _X(indices);\n        float square_sum = 0.0;\n\n        for (int i = ${from}; i <= ${to}; i++) {\n          int idx = c + i;\n          if (c >= 0 && c < ${C}) {\n            indices[1] = idx;\n            float j = _X(indices);\n            square_sum += j * j;\n          }\n        }\n        return x / pow(${bias} + ${alpha} * square_sum, ${beta});\n    }`;\n  return {\n    ...lrnProgramMetadata,\n    cacheHint: attributes.cacheKey,\n    output: { dims: inputs[0].dims, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n}\n\nexport function createLrnProgramInfoLoader(inputs: Tensor[], attributes: LrnAttributes): ProgramInfoLoader {\n  return { ...lrnProgramMetadata, cacheHint: attributes.cacheKey, get: () => createLrnProgramInfo(inputs, attributes) };\n}\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('LRN requires 1 input.');\n  }\n  if (inputs[0].dims.length !== 4) {\n    throw new Error('currently only support LRN for input with \"NCHW\" format');\n  }\n  if (inputs[0].type !== 'float32') {\n    throw new Error('input should be float type');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { getGlsl, Glsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, TextureType } from '../types';\n\nexport interface PadAttributes extends AttributeWithCacheKey {\n  readonly mode: string;\n  readonly pads: number[];\n  readonly value: number;\n}\n\nconst padProgramMetadata = {\n  name: 'Pad',\n  inputNames: ['A'],\n  inputTypes: [TextureType.unpacked],\n};\n\nexport const padV2: OperatorImplementation<PadAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: PadAttributes,\n): Tensor[] => {\n  validateInputsV2(inputs);\n  const output = inferenceHandler.run(\n    {\n      ...padProgramMetadata,\n      cacheHint: attributes.cacheKey,\n      get: () => createPadProgramInfo(inferenceHandler, inputs[0], attributes),\n    },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parsePadAttributesV2: OperatorInitialization<PadAttributes> = (node: Graph.Node): PadAttributes => {\n  const mode = node.attributes.getString('mode', 'constant');\n  const value = node.attributes.getFloat('value', 0.0);\n  const pads = node.attributes.getInts('pads');\n  return createAttributeWithCacheKey({ mode, value, pads });\n};\n\nexport const padV11: OperatorImplementation<string> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  mode: string,\n): Tensor[] => {\n  validateInputsV11(inputs);\n  const attrubutes = generatePadAttributesFromInputs(inferenceHandler, inputs, mode);\n  return padV2(inferenceHandler, [inputs[0]], attrubutes);\n};\n\nexport const parsePadAttributesV11: OperatorInitialization<string> = (node: Graph.Node): string =>\n  node.attributes.getString('mode', 'constant');\n\nconst generatePadAttributesFromInputs = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  mode: string,\n): PadAttributes => {\n  if (\n    !inferenceHandler.session.isInitializer(inputs[1].dataId) ||\n    (inputs.length >= 3 && !inferenceHandler.session.isInitializer(inputs[2].dataId))\n  ) {\n    throw new Error('dynamic pad attributes are not allowed');\n  }\n\n  const pads = Array.from(inputs[1].integerData);\n  const value = inputs.length >= 3 ? inputs[2].floatData[0] : 0.0;\n\n  return createAttributeWithCacheKey({ mode, pads, value });\n};\n\nconst createPadProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  input: Tensor,\n  attributes: PadAttributes,\n): ProgramInfo => {\n  const outputShape = ShapeUtil.padShape(input.dims.slice(), attributes.pads);\n  const rank = outputShape.length;\n  const padFunction = getPadFunction(inferenceHandler, input, attributes);\n  const shaderSource = `\n      ${padFunction}\n      float process(int[${rank}] indices) {\n          return padA(indices);\n      }`;\n  return {\n    name: 'Pad',\n    inputNames: ['A'],\n    inputTypes: [TextureType.unpacked],\n    output: { dims: outputShape, type: input.type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst validateInputsV2 = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Pad requires 1 input');\n  }\n  if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n    throw new Error('Invalid input type.');\n  }\n};\n\nconst validateInputsV11 = (inputs: Tensor[]): void => {\n  if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n    throw new Error('Pad requires 2 or 3 inputs');\n  }\n  if (inputs[1].type !== 'int32') {\n    throw new Error('Invalid input type.');\n  }\n  if (inputs.length >= 3 && inputs[2].type === 'string') {\n    throw new Error('Invalid input type.');\n  }\n};\n\nconst getPadFunction = (inferenceHandler: WebGLInferenceHandler, input: Tensor, attributes: PadAttributes): string => {\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const [width, height] = inferenceHandler.calculateTextureWidthAndHeight(input.dims, TextureType.unpacked);\n  const strides = ShapeUtil.computeStrides(input.dims);\n\n  switch (attributes.mode) {\n    case 'constant':\n      return getPadConstant(glsl, input.dims, strides, width, height, attributes.pads, attributes.value);\n    case 'reflect':\n      return getPadReflect(glsl, input.dims, strides, width, height, attributes.pads);\n    case 'edge':\n      return getPadEdge(glsl, input.dims, strides, width, height, attributes.pads);\n    default:\n      throw new Error('Invalid mode');\n  }\n};\n\nconst getPadConstant = (\n  glsl: Glsl,\n  shape: readonly number[],\n  strides: readonly number[],\n  width: number,\n  height: number,\n  pads: number[],\n  value: number,\n): string => {\n  const rank = shape.length;\n  let block = '';\n  for (let i = rank - 1; i >= 0; --i) {\n    block += `\n        k = m[${i}] - ${pads[i]};\n        if (k < 0)  return constant;\n        if (k >= ${shape[i]}) return constant;\n        offset += k * ${strides[i]};\n        `;\n  }\n  return `\n      float padA(int m[${rank}]) {\n        const float constant = float(${value});\n        int offset = 0;\n        int k = 0;\n        ${block}\n        vec2 coords = offsetToCoords(offset, ${width}, ${height});\n        float value = getColorAsFloat(${glsl.texture2D}(A, coords));\n        return value;\n      }\n      `;\n};\n\nconst getPadReflect = (\n  glsl: Glsl,\n  shape: readonly number[],\n  strides: readonly number[],\n  width: number,\n  height: number,\n  pads: number[],\n): string => {\n  const rank = shape.length;\n\n  let block = '';\n  for (let i = rank - 1; i >= 0; --i) {\n    block += `\n        k = m[${i}] - ${pads[i]};\n        if (k < 0) { k = -k; }\n        {\n          const int _2n_1 = ${2 * (shape[i] - 1)};\n          k = int( mod( float(k), float(_2n_1) ) ) ;\n          if(k >= ${shape[i]}) { k = _2n_1 - k; }\n        }\n        offset += k * ${strides[i]};\n        `;\n  }\n  return `\n      float padA(int m[${rank}]) {\n        int offset = 0;\n        int k = 0;\n        ${block}\n        vec2 coords = offsetToCoords(offset, ${width}, ${height});\n        float value = getColorAsFloat(${glsl.texture2D}(A, coords));\n        return value;\n      }\n      `;\n};\n\nconst getPadEdge = (\n  glsl: Glsl,\n  shape: readonly number[],\n  strides: readonly number[],\n  width: number,\n  height: number,\n  pads: number[],\n): string => {\n  const rank = shape.length;\n\n  let block = '';\n  for (let i = rank - 1; i >= 0; --i) {\n    block += `\n        k = m[${i}] - ${pads[i]};\n        if (k < 0)  k = 0;\n        if (k >= ${shape[i]}) k = ${shape[i] - 1};\n        offset += k * ${strides[i]};\n      `;\n  }\n  return `\n      float padA(int m[${rank}]) {\n        int offset = 0;\n        int k = 0;\n        ${block}\n        vec2 coords = offsetToCoords(offset, ${width}, ${height});\n        float value = getColorAsFloat(${glsl.texture2D}(A, coords));\n        return value;\n      }\n      `;\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { PoolConvUtil, ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramMetadata, TextureType } from '../types';\n\nexport interface AveragePoolAttributes extends AttributeWithCacheKey {\n  readonly autoPad: string;\n  readonly ceilMode: number;\n  readonly countIncludePad: boolean;\n  readonly kernelShape: readonly number[];\n  readonly strides: readonly number[];\n  readonly pads: readonly number[];\n}\n\nexport const averagePool: OperatorImplementation<AveragePoolAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: AveragePoolAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n  const metadata = {\n    name: 'AveragePool',\n    inputNames: ['X'],\n    inputTypes: [TextureType.unpacked],\n    cacheHint: attributes.cacheKey,\n  };\n  const output = inferenceHandler.run(\n    { ...metadata, get: () => createAveragePoolProgramInfo(inputs, metadata, false, attributes) },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parseAveragePoolAttributes: OperatorInitialization<AveragePoolAttributes> = (\n  node: Graph.Node,\n): AveragePoolAttributes => {\n  const autoPad = node.attributes.getString('auto_pad', 'NOTSET');\n  const ceilMode = node.attributes.getInt('ceil_mode', 0);\n  const countIncludePad = node.attributes.getInt('count_include_pad', 0) === 0 ? false : true;\n  const kernelShape = node.attributes.getInts('kernel_shape');\n  const strides = node.attributes.getInts('strides', []);\n  const pads = node.attributes.getInts('pads', []);\n\n  // TODO: support attribute 'ceil_mode'\n  if (ceilMode !== 0) {\n    throw new Error('using ceil() in shape computation is not yet supported for AveragePool');\n  }\n\n  return createAttributeWithCacheKey({ autoPad, ceilMode, countIncludePad, kernelShape, strides, pads });\n};\n\nconst createAveragePoolProgramInfo = (\n  inputs: Tensor[],\n  metadata: ProgramMetadata,\n  isGlobalOperator: boolean,\n  attributes: AveragePoolAttributes,\n): ProgramInfo => {\n  const [adjustedAttributes, outputShape] = getAdjustedPoolAttributesAndOutputShape(\n    inputs,\n    attributes,\n    isGlobalOperator,\n  );\n  const kernelSize = ShapeUtil.size(adjustedAttributes.kernelShape);\n  const op1 = 'value += _X(x);';\n  let op2 = '';\n  if (adjustedAttributes.countIncludePad) {\n    op2 += `value /= float(${kernelSize});`;\n  } else {\n    op2 += `value /= float(${kernelSize} - pad);`;\n  }\n  const poolingCode = generatePoolingCode(inputs[0].dims, adjustedAttributes, op1, op2, '0.0');\n  const shaderSource = `\n        ${poolingCode}\n      `;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nexport const globalAveragePool: OperatorImplementation<AveragePoolAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: AveragePoolAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n  const metadata = {\n    name: 'GlobalAveragePool',\n    inputNames: ['X'],\n    inputTypes: [TextureType.unpacked],\n    cacheHint: `${attributes.countIncludePad}`,\n  };\n  const output = inferenceHandler.run(\n    { ...metadata, get: () => createAveragePoolProgramInfo(inputs, metadata, true, attributes) },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parseGlobalAveragePoolAttributes: OperatorInitialization<AveragePoolAttributes> = (\n  node: Graph.Node,\n): AveragePoolAttributes => {\n  const countIncludePad = node.attributes.getInt('count_include_pad', 0) === 0 ? false : true;\n  return createAttributeWithCacheKey({\n    autoPad: '',\n    ceilMode: 0,\n    countIncludePad,\n    kernelShape: [],\n    strides: [],\n    pads: [],\n  });\n};\n\nexport interface MaxPoolAttributes extends AveragePoolAttributes {\n  readonly storageOrder: number;\n  readonly dilations: number[];\n}\n\nexport const maxPool: OperatorImplementation<MaxPoolAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: MaxPoolAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n  const metadata = {\n    name: 'MaxPool',\n    inputNames: ['X'],\n    inputTypes: [TextureType.unpacked],\n    cacheHint: attributes.cacheKey,\n  };\n  const output = inferenceHandler.run(\n    { ...metadata, get: () => createMaxPoolProgramInfo(inputs, metadata, false, attributes) },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parseMaxPoolAttributes: OperatorInitialization<MaxPoolAttributes> = (\n  node: Graph.Node,\n): MaxPoolAttributes => {\n  const autoPad = node.attributes.getString('auto_pad', 'NOTSET');\n  const ceilMode = node.attributes.getInt('ceil_mode', 0);\n  const kernelShape = node.attributes.getInts('kernel_shape');\n  const strides = node.attributes.getInts('strides', []);\n  const pads = node.attributes.getInts('pads', []);\n  const storageOrder = node.attributes.getInt('storage_order', 0);\n  const dilations = node.attributes.getInts('dilations', []);\n\n  // TODO: support attribute 'ceil_mode' and 'storage_order'\n  if (storageOrder !== 0) {\n    throw new Error('column major storage order is not yet supported for MaxPool');\n  }\n  if (ceilMode !== 0) {\n    throw new Error('using ceil() in shape computation is not yet supported for MaxPool');\n  }\n\n  return createAttributeWithCacheKey({\n    autoPad,\n    ceilMode,\n    countIncludePad: false,\n    kernelShape,\n    strides,\n    pads,\n    storageOrder,\n    dilations,\n  });\n};\n\nconst createMaxPoolProgramInfo = (\n  inputs: Tensor[],\n  metadata: ProgramMetadata,\n  isGlobalOperator: boolean,\n  attributes: MaxPoolAttributes,\n): ProgramInfo => {\n  const [adjustedAttributes, outputShape] = getAdjustedPoolAttributesAndOutputShape(\n    inputs,\n    attributes,\n    isGlobalOperator,\n  );\n  const op1 = `\n      value = max(_X(x), value);\n    `;\n  const op2 = '';\n  const poolingCode = generatePoolingCode(inputs[0].dims, adjustedAttributes, op1, op2, '-1e5');\n  const shaderSource = `\n      ${poolingCode}\n    `;\n  return {\n    ...metadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst getAdjustedPoolAttributesAndOutputShape = (\n  inputs: Tensor[],\n  attributes: AveragePoolAttributes | MaxPoolAttributes,\n  isGlobalOperator: boolean,\n): [AveragePoolAttributes | MaxPoolAttributes, number[]] => {\n  const inputShape = inputs[0].dims.slice();\n  const hasDilations = Object.hasOwnProperty.call(attributes, 'dilations');\n  const kernelShape = attributes.kernelShape.slice();\n  const strides = attributes.strides.slice();\n  const dilations: number[] = hasDilations ? (attributes as MaxPoolAttributes).dilations.slice() : [];\n  const pads = attributes.pads.slice();\n  PoolConvUtil.adjustPoolAttributes(isGlobalOperator, inputShape, kernelShape, strides, dilations, pads);\n\n  const outputShape = PoolConvUtil.computePoolOutputShape(\n    isGlobalOperator,\n    inputShape,\n    strides,\n    dilations,\n    kernelShape,\n    pads,\n    attributes.autoPad,\n  );\n\n  const newAttributes = Object.assign({}, attributes);\n  if (hasDilations) {\n    Object.assign(newAttributes, { kernelShape, strides, pads, dilations, cacheKey: attributes.cacheKey });\n  } else {\n    Object.assign(newAttributes, { kernelShape, strides, pads, cacheKey: attributes.cacheKey });\n  }\n  return [newAttributes, outputShape];\n};\n\nconst globalMaxPoolAttributes = {\n  autoPad: '',\n  ceilMode: 0,\n  countIncludePad: false,\n  kernelShape: [],\n  strides: [],\n  pads: [],\n  storageOrder: 0,\n  dilations: [],\n  cacheKey: '',\n};\n\nconst globalMaxPoolMetadata = {\n  name: 'GlobalMaxPool',\n  inputNames: ['X'],\n  inputTypes: [TextureType.unpacked],\n};\n\nexport const globalMaxPool = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n  validateInputs(inputs);\n  const output = inferenceHandler.run(\n    {\n      ...globalMaxPoolMetadata,\n      get: () => createMaxPoolProgramInfo(inputs, globalMaxPoolMetadata, true, globalMaxPoolAttributes),\n    },\n    inputs,\n  );\n  return [output];\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Pool ops requires 1 input.');\n  }\n  if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n    throw new Error('Invalid input type.');\n  }\n};\n\nconst generatePoolingCode = (\n  inputDims: readonly number[],\n  attributes: AveragePoolAttributes,\n  op1: string,\n  op2: string,\n  start: string,\n): string => {\n  const rank = inputDims.length;\n  if (attributes.kernelShape.length <= 2) {\n    const kw = attributes.kernelShape[attributes.kernelShape.length - 1];\n    const sw = attributes.strides[attributes.strides.length - 1];\n    const pwStart = attributes.pads[attributes.pads.length / 2 - 1];\n    const pwEnd = attributes.pads[attributes.pads.length - 1];\n    const dimW = inputDims[rank - 1];\n    let codeW = '';\n    let codeH = '';\n    let codeHEnd = '';\n    if (pwStart + pwEnd !== 0) {\n      codeW = `\n          for (int i = 0; i < ${kw}; i++) {\n            x[${rank} - 1] = indices[${rank} - 1] * ${sw} - ${pwStart} + i;\n            if (x[${rank} - 1] < 0 || x[${rank} - 1] >= ${dimW}) {\n              pad++;\n              continue;\n            }\n            ${op1}\n          }`;\n    } else {\n      codeW = `\n          for (int i = 0; i < ${kw}; i++) {\n            x[${rank} - 1] = indices[${rank} - 1] * ${sw} - ${pwStart} + i;\n            ${op1}\n          }`;\n    }\n\n    if (attributes.kernelShape.length === 2) {\n      const kh = attributes.kernelShape[attributes.kernelShape.length - 2];\n      const sh = attributes.strides[attributes.strides.length - 2];\n      const phStart = attributes.pads[attributes.pads.length / 2 - 2];\n      const phEnd = attributes.pads[attributes.pads.length - 2];\n      const dimH = inputDims[rank - 2];\n      if (phStart + phEnd !== 0) {\n        codeH = `\n            for (int j = 0; j < ${kh}; j++) {\n              x[${rank} - 2] = indices[${rank} - 2] * ${sh} - ${phStart} + j;\n              if (x[${rank} - 2] < 0 || x[${rank} - 2] >= ${dimH}) {\n                pad+= ${kw};\n                continue;\n              }\n          `;\n      } else {\n        codeH = `\n            for (int j = 0; j < ${kh}; j++) {\n              x[${rank} - 2] = indices[${rank} - 2] * ${sh} - ${phStart} + j;\n            `;\n      }\n      codeHEnd = `\n          }\n        `;\n    }\n\n    const poolingCode = `\n        float process(int indices[${rank}]) {\n          int x[${rank}];\n          copyVec(indices, x);\n\n          float value = ${start};\n          int pad = 0;\n          ${codeH}\n          ${codeW}\n          ${codeHEnd}\n          ${op2}\n          return value;\n        }\n      `;\n    return poolingCode;\n  } else {\n    const kernelSize = ShapeUtil.size(attributes.kernelShape);\n    const kernelStrides = ShapeUtil.computeStrides(attributes.kernelShape);\n    const stridesRank = kernelStrides.length;\n    const padsRank = attributes.pads.length;\n    const offsetToIndicesFunction = offsetToIndices(stridesRank);\n    const copyInputDims = copyArray(inputDims, 'inputDims');\n    const copyPads = copyArray(attributes.pads, 'pads');\n    const copyKernelStrides = copyArray(kernelStrides, 'kernelStrides');\n    const copyStrides = copyArray(attributes.strides, 'strides');\n    const hasPads = attributes.pads.reduce((sum, cur) => sum + cur);\n    let padCode = '';\n    if (hasPads) {\n      padCode = `\n            if (x[j] >= inputDims[j] || x[j] < 0) {\n              pad++;\n              isPad = true;\n              break;\n            }\n          }\n          if (!isPad) {\n            ${op1}\n          }`;\n    } else {\n      padCode = `\n          }\n          ${op1}\n        `;\n    }\n    const poolingCode = `\n        ${offsetToIndicesFunction}\n        float process(int indices[${rank}]) {\n          int x[${rank}];\n          copyVec(indices, x);\n          int offset[${stridesRank}];\n          int pads[${padsRank}];\n          int inputDims[${rank}];\n          int kernelStrides[${stridesRank}];\n          int strides[${stridesRank}];\n          ${copyPads}\n          ${copyInputDims}\n          ${copyStrides}\n          ${copyKernelStrides}\n\n          float value = ${start};\n          int pad = 0;\n          bool isPad = false;\n          for (int i = 0; i < ${kernelSize}; i++) {\n            offsetToIndices(i, kernelStrides, offset);\n            isPad = false;\n            for (int j = ${rank} - ${stridesRank}; j < ${rank}; j++) {\n              x[j] = indices[j] * strides[j - ${rank} + ${stridesRank}]\n                + offset[j - ${rank} + ${stridesRank}] - pads[j - 2];\n              ${padCode}\n          }\n          ${op2}\n\n          return value;\n        }\n      `;\n    return poolingCode;\n  }\n};\n\nconst copyArray = (array: readonly number[], arrayName: string): string => {\n  let block = '';\n  for (let i = 0; i < array.length; i++) {\n    block += `\n      ${arrayName}[${i}] = ${array[i]};\n    `;\n  }\n  return block;\n};\n\nconst offsetToIndices = (rank: number): string => `\n  void offsetToIndices(int offset, int[${rank}] strides, out int[${rank}] indices) {\n    if (${rank} == 0) {\n      return;\n    }\n    for (int i = 0; i < ${rank} - 1; ++i) {\n      indices[i] = offset / strides[i];\n      offset -= indices[i] * strides[i];\n    }\n    indices[${rank} - 1] = offset;\n  }`;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { NUMBER_TYPES, OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramMetadata, TextureType } from '../types';\n\nexport interface ReduceAttributes extends AttributeWithCacheKey {\n  readonly axes: number[];\n  readonly keepDims: boolean;\n}\n\n// return [init ops, reduce ops, final ops]\ntype ReduceOp = (inputs: Tensor[], axes: number[]) => string[];\n\nconst reduce = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ReduceAttributes,\n  name: string,\n  reduceOp: ReduceOp,\n): Tensor[] => {\n  validateInputs(inputs);\n\n  const reduceProgramMetadata = {\n    name,\n    inputNames: ['A'],\n    inputTypes: [TextureType.unpacked],\n  };\n\n  const output = inferenceHandler.run(\n    {\n      ...reduceProgramMetadata,\n      cacheHint: attributes.cacheKey,\n      get: () => createReduceProgramInfo(inferenceHandler, inputs, attributes, name, reduceOp, reduceProgramMetadata),\n    },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parseReduceAttributes: OperatorInitialization<ReduceAttributes> = (node: Graph.Node): ReduceAttributes => {\n  const axes = node.attributes.getInts('axes', []);\n  const keepDims = node.attributes.getInt('keepdims', 1) === 1;\n  return createAttributeWithCacheKey({ axes, keepDims });\n};\n\nconst createReduceProgramInfo = (\n  _handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ReduceAttributes,\n  _name: string,\n  reduceOp: ReduceOp,\n  reduceProgramMetadata: ProgramMetadata,\n): ProgramInfo => {\n  const outputShape: number[] = [];\n  const iRank = inputs[0].dims.length || 1;\n\n  const idxCopy = []; // copy output indexes to input indexes\n\n  const axes = ShapeUtil.normalizeAxes(attributes.axes, inputs[0].dims.length);\n  const ops = reduceOp(inputs, axes);\n  let reduceOps = ops[1];\n\n  for (let k = 0; k < inputs[0].dims.length; k++) {\n    // if this axis is reduced\n    if (axes.indexOf(k) >= 0 || axes.length === 0) {\n      if (attributes.keepDims) {\n        outputShape.push(1);\n      } // else { remove the axis from outputShape; }\n\n      // loop over the d-th axis\n      reduceOps = `\n          for(int j${k} = 0; j${k} < ${inputs[0].dims[k]}; j${k}++) {\n            inputIdx[${k}] = j${k};\n            ${reduceOps}\n          }`;\n    } else {\n      idxCopy.push(`inputIdx[${k}] = outputIdx[${outputShape.length}];`);\n\n      outputShape.push(inputs[0].dims[k]);\n    }\n  }\n\n  const oRank = outputShape.length || 1;\n\n  const shaderSource = `\n      float process(int outputIdx[${oRank}]) {\n        float value;                 // final result\n        int inputIdx[${iRank}];      // addressing input data\n        ${idxCopy.join('\\n')}\n        ${ops[0]}       // init ops for reduce max/min\n        ${reduceOps}\n        ${ops[2]}       // final computation for reduce mean\n        return value;\n      }`;\n\n  return {\n    ...reduceProgramMetadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  // TODO: support Reduce* operators with 2 inputs.\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Reduce op requires 1 input.');\n  }\n\n  if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n    throw new Error('Invalid input type.');\n  }\n};\n\nexport const reduceSum: OperatorImplementation<ReduceAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ReduceAttributes,\n): Tensor[] => {\n  const reduceOp: ReduceOp = (): string[] => ['value = 0.0;', 'value += _A(inputIdx);', ''];\n  return reduce(inferenceHandler, inputs, attributes, 'ReduceSum', reduceOp);\n};\n\nexport const reduceMean: OperatorImplementation<ReduceAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ReduceAttributes,\n): Tensor[] => {\n  const reduceOp: ReduceOp = (inputs: Tensor[], axes: number[]): string[] => {\n    let size = 1.0;\n    for (let k = 0; k < inputs[0].dims.length; k++) {\n      if (axes.indexOf(k) >= 0 || axes.length === 0) {\n        size *= inputs[0].dims[k];\n      }\n    }\n\n    return ['value = 0.0;', 'value += _A(inputIdx);', `value /= ${size}.;`]; // ensure real number with `.`\n  };\n  return reduce(inferenceHandler, inputs, attributes, 'ReduceMean', reduceOp);\n};\n\nexport const reduceMax: OperatorImplementation<ReduceAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ReduceAttributes,\n): Tensor[] => {\n  const reduceOp: ReduceOp = (inputs: Tensor[], axes: number[]): string[] => {\n    const idxZero = [];\n    for (let k = 0; k < inputs[0].dims.length; k++) {\n      if (axes.indexOf(k) >= 0 || axes.length === 0) {\n        idxZero.push(`inputIdx[${k}] = 0;`); // first element\n      }\n    }\n\n    return [`${idxZero.join('\\n')}\\nvalue = _A(inputIdx);`, 'value = max(value, _A(inputIdx));', ''];\n  };\n  return reduce(inferenceHandler, inputs, attributes, 'ReduceMax', reduceOp);\n};\n\nexport const reduceMin: OperatorImplementation<ReduceAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ReduceAttributes,\n): Tensor[] => {\n  const reduceOp: ReduceOp = (inputs: Tensor[], axes: number[]): string[] => {\n    const idxZero = [];\n    for (let k = 0; k < inputs[0].dims.length; k++) {\n      if (axes.indexOf(k) >= 0 || axes.length === 0) {\n        idxZero.push(`inputIdx[${k}] = 0;`); // first element\n      }\n    }\n\n    return [`${idxZero.join('\\n')}\\nvalue = _A(inputIdx);`, 'value = min(value, _A(inputIdx));', ''];\n  };\n  return reduce(inferenceHandler, inputs, attributes, 'ReduceMin', reduceOp);\n};\n\nexport const reduceProd: OperatorImplementation<ReduceAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ReduceAttributes,\n): Tensor[] => {\n  const reduceOp: ReduceOp = (): string[] => ['value = 1.0;', 'value *= _A(inputIdx);', ''];\n  return reduce(inferenceHandler, inputs, attributes, 'ReduceProd', reduceOp);\n};\n\nexport const reduceLogSum: OperatorImplementation<ReduceAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ReduceAttributes,\n): Tensor[] => {\n  const reduceOp: ReduceOp = (): string[] => ['value = 0.0;', 'value += _A(inputIdx);', 'value = log(value);'];\n  return reduce(inferenceHandler, inputs, attributes, 'ReduceLogSum', reduceOp);\n};\n\nexport const reduceLogSumSquare: OperatorImplementation<ReduceAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: ReduceAttributes,\n): Tensor[] => {\n  const reduceOp: ReduceOp = (): string[] => ['float t; value = 0.0;', 't = _A(inputIdx); value += t * t;', ''];\n  return reduce(inferenceHandler, inputs, attributes, 'ReduceLogSumSquare', reduceOp);\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\n\nexport const reshape = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n  const reshapedDims = ShapeUtil.calculateReshapedDims(inputs[0].dims, inputs[1].integerData);\n  if (handler.session.pack) {\n    return [handler.reshapePacked(inputs[0], reshapedDims)];\n  } else {\n    return [handler.reshapeUnpacked(inputs[0], reshapedDims)];\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, TextureType } from '../types';\n\nexport interface UpsampleAttributes extends AttributeWithCacheKey {\n  readonly opset: number;\n  readonly isResize: boolean;\n  readonly mode: string;\n  readonly scales: number[];\n  readonly extrapolationValue: number;\n  readonly coordinateTransformMode: string;\n  readonly useExtrapolation: boolean;\n  readonly needRoiInput: boolean;\n  readonly nearestMode: string;\n  readonly cubicCoefficientA: number;\n  readonly excludeOutside: boolean;\n  readonly useNearest2xOptimization: boolean;\n  readonly roiInputIdx: number;\n  readonly scalesInputIdx: number;\n  readonly sizesInputIdx: number;\n}\n\nconst upsampleProgramMetadata = {\n  name: 'Upsample',\n  inputNames: ['X'],\n  inputTypes: [TextureType.unpacked],\n};\n\nexport const upsample: OperatorImplementation<UpsampleAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: UpsampleAttributes,\n): Tensor[] => {\n  validateInputs(inputs, attributes);\n  const output = inferenceHandler.run(\n    {\n      ...upsampleProgramMetadata,\n      cacheHint: attributes.cacheKey,\n      get: () => createUpsampleProgramInfo(inferenceHandler, inputs, attributes),\n    },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parseUpsampleAttributesV7: OperatorInitialization<UpsampleAttributes> = (\n  node: Graph.Node,\n): UpsampleAttributes => parseUpsampleAttributes(node, 7);\n\nexport const parseUpsampleAttributesV9: OperatorInitialization<UpsampleAttributes> = (\n  node: Graph.Node,\n): UpsampleAttributes => parseUpsampleAttributes(node, 9);\n\nexport const parseUpsampleAttributes = (node: Graph.Node, opset: number): UpsampleAttributes => {\n  const isResize = opset >= 10;\n\n  // processing node attributes\n  const mode = node.attributes.getString('mode', 'nearest');\n  if (mode !== 'nearest' && mode !== 'linear' && (opset < 11 || mode !== 'cubic')) {\n    throw new Error(`unrecognized mode: ${mode}`);\n  }\n\n  let scales: number[] = [];\n  if (opset < 9) {\n    scales = node.attributes.getFloats('scales');\n    scalesValidation(scales, mode, isResize);\n  }\n\n  const extrapolationValue = node.attributes.getFloat('extrapolation_value', 0.0);\n\n  const coordinateTransformMode =\n    opset > 10 ? node.attributes.getString('coordinate_transformation_mode', 'half_pixel') : 'asymmetric';\n  if (\n    [\n      'asymmetric',\n      'pytorch_half_pixel',\n      'tf_half_pixel_for_nn',\n      'align_corners',\n      'tf_crop_and_resize',\n      'half_pixel',\n    ].indexOf(coordinateTransformMode) === -1\n  ) {\n    throw new Error(`coordinate_transform_mode '${coordinateTransformMode}' is not supported`);\n  }\n  const needRoiInput = coordinateTransformMode === 'tf_crop_and_resize';\n  const useExtrapolation = needRoiInput;\n\n  const nearestMode =\n    mode === 'nearest' && opset >= 11 ? node.attributes.getString('nearest_mode', 'round_prefer_floor') : '';\n  if (['round_prefer_floor', 'round_prefer_ceil', 'floor', 'ceil', ''].indexOf(nearestMode) === -1) {\n    throw new Error(`nearest_mode '${nearestMode}' is not supported`);\n  }\n\n  const cubicCoefficientA = node.attributes.getFloat('cubic_coeff_a', -0.75);\n  const excludeOutside = node.attributes.getInt('exclude_outside', 0) !== 0;\n  if (excludeOutside && mode !== 'cubic') {\n    throw new Error('exclude_outside can be set to 1 only when mode is CUBIC.');\n  }\n\n  const useNearest2xOptimization =\n    opset < 11 ? true : mode === 'nearest' && coordinateTransformMode === 'asymmetric' && nearestMode === 'floor';\n\n  let roiInputIdx = 0;\n  let scalesInputIdx = 0;\n  let sizesInputIdx = 0;\n\n  if (opset > 10) {\n    // handle when roiInput is not given\n    if (node.inputs.length > 2) {\n      roiInputIdx = 1;\n      scalesInputIdx = 2;\n      sizesInputIdx = 3;\n    } else {\n      scalesInputIdx = 1;\n      sizesInputIdx = 2;\n    }\n  } else if (opset === 9) {\n    scalesInputIdx = 1;\n  }\n\n  return createAttributeWithCacheKey({\n    opset,\n    isResize,\n    mode,\n    scales,\n    extrapolationValue,\n    coordinateTransformMode,\n    useExtrapolation,\n    needRoiInput,\n    nearestMode,\n    cubicCoefficientA,\n    excludeOutside,\n    useNearest2xOptimization,\n    roiInputIdx,\n    scalesInputIdx,\n    sizesInputIdx,\n  });\n};\n\nconst createUpsampleProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: UpsampleAttributes,\n): ProgramInfo => {\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const [inputWidth, inputHeight] = inferenceHandler.calculateTextureWidthAndHeight(\n    inputs[0].dims,\n    TextureType.unpacked,\n  );\n\n  const outputShape = inputs[0].dims.map((dim, i) => Math.floor(dim * attributes.scales[i]));\n  const [outputWidth, outputHeight] = inferenceHandler.calculateTextureWidthAndHeight(\n    outputShape,\n    TextureType.unpacked,\n  );\n  const dim = outputShape.length;\n\n  const outputPitches = new Array<number>(dim);\n  const inputPitches = new Array<number>(dim);\n  let precalculatedPitches = `\n      int output_pitches[${dim}];\n      int input_pitches[${dim}];\n      `;\n  for (let d = dim - 1; d >= 0; d--) {\n    outputPitches[d] = d === dim - 1 ? 1 : outputPitches[d + 1] * outputShape[d + 1];\n    inputPitches[d] = d === dim - 1 ? 1 : inputPitches[d + 1] * inputs[0].dims[d + 1];\n\n    precalculatedPitches += `\n        output_pitches[${d}] = ${outputPitches[d]};\n        input_pitches[${d}] = ${inputPitches[d]};\n        `;\n  }\n  const getInputFloatFunction = `\n      float getInputFloat(int index) {\n        vec2 coords = offsetToCoords(index, ${inputWidth}, ${inputHeight});\n        float value = getColorAsFloat(${glsl.texture2D}(X, coords));\n        return value;\n      }\n      `;\n\n  const shaderSource =\n    attributes.mode === 'nearest'\n      ? // nearest\n        `\n    ${getInputFloatFunction}\n    float process(int indices[${dim}]) {\n      int input_index = 0;\n      int output_index = coordsToOffset(TexCoords, ${outputWidth}, ${outputHeight});\n\n      ${precalculatedPitches}\n\n      int d, m;\n      for (int dim = 0; dim < ${dim}; ++dim) {\n        d = output_index / output_pitches[dim];\n        m = output_index - d * output_pitches[dim];\n        output_index = m;\n\n        if (scales[dim] != 1 && d > 0) {\n          int d2 = d / scales[dim];\n          m = d - d2 * scales[dim];\n          d = d2;\n        }\n        input_index += input_pitches[dim] * d;\n      }\n\n      return getInputFloat(input_index);\n    }`\n      : dim === 4\n        ? // bilinear 4D\n          `\n    ${getInputFloatFunction}\n    float process(int indices[4]) {\n      int input_index = 0;\n      int output_index = coordsToOffset(TexCoords, ${outputWidth}, ${outputHeight});\n\n      ${precalculatedPitches}\n\n      int m;\n      int index_of_dim0, index_of_dim1, index_of_dim2, index_of_dim3;\n      index_of_dim0 = output_index / output_pitches[0];\n      m = output_index - index_of_dim0 * output_pitches[0];\n      index_of_dim1 = m / output_pitches[1];\n      m = m - index_of_dim1 * output_pitches[1];\n      index_of_dim2 = m / output_pitches[2];\n      m = m - index_of_dim2 * output_pitches[2];\n      index_of_dim3 = m;\n\n      int index_of_input_dim2, index_of_input_dim3, x_offset, y_offset;\n      index_of_input_dim2 = index_of_dim2 / scales[2];\n      y_offset = index_of_dim2 - index_of_input_dim2 * scales[2];\n      index_of_input_dim3 = index_of_dim3 / scales[3];\n      x_offset = index_of_dim3 - index_of_input_dim3 * scales[3];\n\n      input_index = index_of_dim0 * input_pitches[0] +\n            index_of_dim1 * input_pitches[1] +\n            index_of_input_dim2 * input_pitches[2] +\n            index_of_input_dim3;\n\n      float x00 = getInputFloat(input_index);\n      float x10, x01, x11;\n\n      bool end_of_dim2 = false;\n      if (index_of_input_dim2 == (${inputs[0].dims[2]} - 1)) {\n        // It's the end in dimension 2\n        x01 = x00;\n        end_of_dim2 = true;\n      } else {\n        x01 = getInputFloat(input_index + input_pitches[2]);\n      }\n\n      if (index_of_input_dim3 == (input_pitches[2] - 1)) {\n        // It's the end in dimension 3\n        x10 = x00;\n        x11 = x01;\n      }\n      else {\n        x10 = getInputFloat(input_index + 1);\n        x11 = end_of_dim2 ? x10 : getInputFloat(input_index + input_pitches[2] + 1);\n      }\n\n      float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[2]);\n      float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[2]);\n      return y0 + float(x_offset) * (y1 - y0) / float(scales[3]);\n    }`\n        : // bilinear 2D\n          `\n    ${getInputFloatFunction}\n    float process(int indices[2]) {\n      int input_index = 0;\n      int output_index = coordsToOffset(TexCoords, ${outputWidth}, ${outputHeight});\n\n      ${precalculatedPitches}\n\n      int m;\n      int index_of_dim0, index_of_dim1;\n      index_of_dim0 = output_index / output_pitches[0];\n      m = output_index - index_of_dim0 * output_pitches[0];\n      index_of_dim1 = m;\n\n      int index_of_input_dim0, index_of_input_dim1, x_offset, y_offset;\n      index_of_input_dim0 = index_of_dim0 / scales[0];\n      y_offset = index_of_dim0 - index_of_input_dim0 * scales[0];\n      index_of_input_dim1 = index_of_dim1 / scales[1];\n      x_offset = index_of_dim1 - index_of_input_dim1 * scales[1];\n\n      input_index = index_of_input_dim0 * input_pitches[0] + index_of_input_dim1;\n\n      float x00 = getInputFloat(input_index);\n      float x10, x01, x11;\n\n      bool end_of_dim0 = false;\n      if (index_of_input_dim0 == (${inputs[0].dims[0]} - 1)) {\n        // It's the end in dimension 0\n        x01 = x00;\n        end_of_dim0 = true;\n      } else {\n        x01 = getInputFloat(input_index + input_pitches[0]);\n      }\n\n      if (index_of_input_dim1 == (input_pitches[0] - 1)) {\n        // It's the end in dimension 1\n        x10 = x00;\n        x11 = x01;\n      }\n      else {\n        x10 = getInputFloat(input_index + 1);\n        x11 = end_of_dim0 ? x10 : getInputFloat(input_index + input_pitches[0] + 1);\n      }\n\n      float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[0]);\n      float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[0]);\n      return y0 + float(x_offset) * (y1 - y0) / float(scales[1]);\n    }`;\n  return {\n    ...upsampleProgramMetadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n    variables: [\n      {\n        name: 'scales',\n        type: 'int',\n        arrayLength: attributes.scales.length,\n        data: attributes.scales.map((x) => Math.ceil(x)),\n      },\n    ],\n  };\n};\n\nexport const validateInputs = (inputs: Tensor[], attribute: UpsampleAttributes): void => {\n  if (\n    !inputs ||\n    (attribute.opset < 9 && inputs.length !== 1) ||\n    (attribute.opset >= 9 && attribute.opset < 11 && inputs.length !== 2) ||\n    (attribute.opset >= 11 && inputs.length < 2)\n  ) {\n    throw new Error('invalid inputs.');\n  }\n\n  if (attribute.scales.length > 0 && inputs[0].dims.length !== attribute.scales.length) {\n    throw new Error('Invalid input shape.');\n  }\n\n  if (inputs[0].type === 'string') {\n    throw new Error('Invalid input tensor types.');\n  }\n};\n\nexport const scalesValidation = (scales: number[], mode: string, isResize: boolean): void => {\n  if (!isResize) {\n    for (const scale of scales) {\n      if (scale < 1) {\n        throw new Error('Scale value should be greater than or equal to 1.');\n      }\n    }\n  } else {\n    for (const scale of scales) {\n      if (scale <= 0) {\n        throw new Error('Scale value should be greater than 0.');\n      }\n    }\n  }\n  if (mode === 'linear' || mode === 'cubic') {\n    if (scales.length !== 2 && (scales.length !== 4 || scales[0] !== 1 || scales[1] !== 1)) {\n      throw new Error(`'Linear' mode and 'Cubic' mode only support 2-D inputs ('Bilinear', 'Bicubic') \\\n        or 4-D inputs with the corresponding outermost 2 scale values being 1 \\\n        in the ${isResize ? 'Resize' : 'Upsample'} opeartor.`);\n    }\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, TextureType } from '../types';\nimport { getCoordsDataType } from '../utils';\n\nimport { unpackFromChannel } from './packing-utils';\nimport { parseUpsampleAttributes, scalesValidation, UpsampleAttributes, validateInputs } from './upsample';\n\nconst resizeProgramMetadata = {\n  name: 'Resize',\n  inputNames: ['A'],\n  inputTypes: [TextureType.packed],\n};\n\nexport const resize: OperatorImplementation<UpsampleAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: UpsampleAttributes,\n): Tensor[] => {\n  validateInputs(inputs, attributes);\n  const output = inferenceHandler.run(\n    {\n      ...resizeProgramMetadata,\n      cacheHint: attributes.cacheKey,\n      get: () => createPackedResizeProgramInfo(inferenceHandler, inputs, attributes),\n    },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parseResizeAttributesV10: OperatorInitialization<UpsampleAttributes> = (\n  node: Graph.Node,\n): UpsampleAttributes => parseUpsampleAttributes(node, 10);\n\nexport const parseResizeAttributesV11: OperatorInitialization<UpsampleAttributes> = (\n  node: Graph.Node,\n): UpsampleAttributes => parseUpsampleAttributes(node, 11);\n\nconst createPackedResizeProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: UpsampleAttributes,\n): ProgramInfo => {\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const [scales, outputShape] = prepareInputs(inputs, attributes);\n\n  const isSame = scales.every((s: number) => s === 1) && attributes.coordinateTransformMode !== 'tf_crop_and_resize';\n  if (isSame) {\n    return {\n      ...resizeProgramMetadata,\n      output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.packed },\n      hasMain: true,\n      shaderSource: `void main() {\n                    vec4 v = ${glsl.texture2D}(X, TexCoords);\n                    ${glsl.output} = v;\n                }`,\n    };\n  }\n\n  const dim = outputShape.length;\n  if (dim < 2) {\n    throw new Error(`output dimension should be at least 2, but got ${dim}`);\n  }\n\n  const outputHeight = outputShape[dim - 2];\n  const outputWidth = outputShape[dim - 1];\n\n  const inputShape = inputs[0].dims;\n  if (dim !== inputShape.length) {\n    throw new Error(`output dimension should match input ${inputShape.length}, but got ${dim}`);\n  }\n  const inputHeight = inputShape[dim - 2];\n  const inputWidth = inputShape[dim - 1];\n\n  const scalesHeight = scales[dim - 2];\n  const scalesWidth = scales[dim - 1];\n\n  let getSourceFracIndex = '';\n\n  if (attributes.mode !== 'linear') {\n    // TODO: support other modes\n    throw new Error(`resize (packed) does not support mode: '${attributes.mode}'`);\n  }\n  switch (attributes.coordinateTransformMode) {\n    case 'asymmetric':\n      getSourceFracIndex = `\n                    vec4 getSourceFracIndex(ivec4 coords) {\n                        return vec4(coords) / scaleWHWH;\n                    }\n                `;\n      break;\n    case 'half_pixel':\n      getSourceFracIndex = `\n                    vec4 getSourceFracIndex(ivec4 coords) {\n                        return (vec4(coords) + 0.5) / scaleWHWH - 0.5;\n                    }\n                `;\n      break;\n    case 'pytorch_half_pixel':\n      getSourceFracIndex = `\n                    vec4 getSourceFracIndex(ivec4 coords) {\n                        vec4 fcoords = vec4(coords);\n                        return vec4(\n                            ${outputWidth}.0 > 1.0 ? (fcoords.x + 0.5) / scaleWHWH.x - 0.5 : 0.0,\n                            ${outputHeight}.0 > 1.0 ? (fcoords.y + 0.5) / scaleWHWH.y - 0.5 : 0.0,\n                            ${outputWidth}.0 > 1.0 ? (fcoords.z + 0.5) / scaleWHWH.z - 0.5 : 0.0,\n                            ${outputHeight}.0 > 1.0 ? (fcoords.w + 0.5) / scaleWHWH.w - 0.5 : 0.0\n                          );\n                    }\n                `;\n      break;\n    case 'align_corners':\n      getSourceFracIndex = `\n                    vec4 getSourceFracIndex(ivec4 coords) {\n                        vec4 resized = vec4(${outputWidth}.0 - 1.0, ${outputHeight}.0 - 1.0, ${outputWidth}.0 - 1.0,\n                            ${outputHeight}.0 - 1.0);\n                        vec4 original = vec4(${inputWidth}.0 - 1.0, ${inputHeight}.0 - 1.0, ${inputWidth}.0 - 1.0,\n                            ${inputHeight}.0 - 1.0);\n                        vec4 new_scale = original / resized;\n                        return vec4(coords) * new_scale;\n                    }\n                `;\n      break;\n    default:\n      // TODO:supporting other coordinateTransformModes\n      throw new Error(`resize (packed) does not support coordinateTransformMode: \\\n                                '${attributes.coordinateTransformMode}'`);\n  }\n\n  const coordsDataType = getCoordsDataType(dim);\n  const unpackChannel = unpackFromChannel();\n  const shaderSource = `\n            const vec2 inputWH = vec2(${inputHeight}.0, ${inputWidth}.0);\n            const vec4 scaleWHWH = vec4(float(${scalesHeight}), float(${scalesWidth}), float(${scalesHeight}), float(${\n              scalesWidth\n            }));\n            ${unpackChannel}\n            ${getSourceFracIndex}\n            float getAValue(int x10, int r, int c, int d) {\n                return getChannel(getA(x10, r, c, d), vec2(c, d));\n            }\n            void main() {\n                ${coordsDataType} rc = getOutputCoords();\n\n                int batch = rc[0];\n                int depth = rc[1];\n\n                // retrieve the 4 coordinates that is used in the 4 packed output values.\n                ivec4 coords = ivec4(rc.wz, rc.w + 1, rc.z + 1);\n\n                // calculate the source index in fraction\n                vec4 sourceFrac = getSourceFracIndex(coords);\n\n                // get the lower and upper bound of the 4 values that will be packed into one texel.\n                ivec4 x00 = ivec4(max(sourceFrac.xy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xy)));\n                ivec4 x01 = ivec4(max(sourceFrac.xw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xw)));\n                ivec4 x10 = ivec4(max(sourceFrac.zy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zy)));\n                ivec4 x11 = ivec4(max(sourceFrac.zw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zw)));\n\n                bool hasNextRow = rc.w < ${outputHeight - 1};\n                bool hasNextCol = rc.z < ${outputWidth - 1};\n\n                // pack x00, x01, x10, x11's top-left corner into one vec4 structure\n                vec4 topLeft = vec4(\n                    getAValue(batch, depth, x00.x, x00.y),\n                    hasNextCol ? getAValue(batch, depth, x01.x, x01.y) : 0.0,\n                    hasNextRow ? getAValue(batch, depth, x10.x, x10.y) : 0.0,\n                    (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.y) : 0.0);\n\n                // pack x00, x01, x10, x11's top-right corner into one vec4 structure\n                vec4 topRight = vec4(\n                    getAValue(batch, depth, x00.x, x00.w),\n                    hasNextCol ? getAValue(batch, depth, x01.x, x01.w) : 0.0,\n                    hasNextRow ? getAValue(batch, depth, x10.x, x10.w) : 0.0,\n                    (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.w) : 0.0);\n\n                // pack x00, x01, x10, x11's bottom-left corner into one vec4 structure\n                vec4 bottomLeft = vec4(\n                    getAValue(batch, depth, x00.z, x00.y),\n                    hasNextCol ? getAValue(batch, depth, x01.z, x01.y) : 0.0,\n                    hasNextRow ? getAValue(batch, depth, x10.z, x10.y) : 0.0,\n                    (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.y) : 0.0);\n\n                // pack x00, x01, x10, x11's bottom-right corner into one vec4 structure\n                vec4 bottomRight = vec4(\n                    getAValue(batch, depth, x00.z, x00.w),\n                    hasNextCol ? getAValue(batch, depth, x01.z, x01.w) : 0.0,\n                    hasNextRow ? getAValue(batch, depth, x10.z, x10.w) : 0.0,\n                    (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.w) : 0.0);\n\n                // calculate the interpolation fraction on u and v direction\n                vec4 frac = vec4(sourceFrac) - floor(sourceFrac);\n                vec4 clampFrac = clamp(frac, vec4(0.0), vec4(1.0));\n\n                vec4 top = mix(topLeft, topRight, clampFrac.ywyw);\n                vec4 bottom = mix(bottomLeft, bottomRight, clampFrac.ywyw);\n                vec4 newValue = mix(top, bottom, clampFrac.xxzz);\n\n                ${glsl.output} = vec4(newValue);\n            }\n        `;\n  return {\n    ...resizeProgramMetadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.packed },\n    hasMain: true,\n    shaderSource,\n  };\n};\n\nconst prepareInputs = (inputs: Tensor[], attributes: UpsampleAttributes): [readonly number[], readonly number[]] => {\n  const x = inputs[0];\n  const xDims = x.dims;\n\n  let scales = attributes.scales;\n  let outputSizes: number[] | undefined;\n  if (scales.length === 0) {\n    const scalesTensor = inputs[attributes.scalesInputIdx];\n    if (scalesTensor && scalesTensor.size !== 0) {\n      if (inputs[attributes.sizesInputIdx]) {\n        throw new Error('Only one of scales or sizes must be provided as input.');\n      }\n      scales = parseScalesData(scalesTensor, attributes.mode, attributes.isResize);\n    } else {\n      const sizesTensor = inputs[attributes.sizesInputIdx];\n      if (!sizesTensor || sizesTensor.size === 0) {\n        throw new Error('Either scales or sizes MUST be provided as input.');\n      }\n\n      outputSizes = Array.from(sizesTensor.integerData);\n      scales = parseScalesDataFromOutputSize(outputSizes, xDims, attributes.mode, attributes.isResize);\n    }\n  } else {\n    if (inputs[attributes.sizesInputIdx]) {\n      throw new Error('Only one of scales or sizes must be provided as input.');\n    }\n  }\n\n  const yDims = outputSizes || xDims.map((dim, i) => Math.floor(dim * scales[i]));\n\n  return [scales, yDims];\n};\n\nconst parseScalesData = (scale: Tensor, mode: string, isResize: boolean): number[] => {\n  const scales = Array.from(scale.floatData);\n  scalesValidation(scales, mode, isResize);\n  return scales;\n};\n\nconst parseScalesDataFromOutputSize = (\n  yDims: readonly number[],\n  xDims: readonly number[],\n  mode: string,\n  isResize: boolean,\n): number[] => {\n  const length = xDims.length;\n  const scales = new Array<number>(length);\n\n  for (let i = 0, end = length; i < end; i++) {\n    if (xDims[i] === 0) {\n      if (yDims[i] !== 0) {\n        throw new Error('Input dim is zero but required output dim is non-zero.');\n      }\n      scales[i] = 1;\n    } else {\n      scales[i] = yDims[i] / xDims[i];\n    }\n  }\n  scalesValidation(scales, mode, isResize);\n  return scales;\n};\n\n// roi data is not used yet. but leave here for future usage.\n// const getRoi = (inputs: Tensor[], attributes: UpsampleAttributes) : number[] => {\n//     let roi: number[] = [];\n//     if (attributes.needRoiInput) {\n//         if (attributes.roiInputIdx <= 0) {\n//             throw new Error('Invalid roi input index.');\n//         }\n//         const roiTensor = inputs[attributes.roiInputIdx];\n//         roi = roiTensor.size > 0 ? Array.from(roiTensor.floatData) : [];\n//     } else {\n//         roi = new Array(inputs[0].dims.length * 2).fill(0);\n//     }\n//     return roi;\n// };\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { WebGLInferenceHandler } from '../inference-handler';\n\nexport const shape = (_inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n  validateInputs(inputs);\n  return [new Tensor([inputs[0].dims.length], 'int32', undefined, undefined, new Int32Array(inputs[0].dims))];\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Shape requires 1 input.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { NUMBER_TYPES, OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, TextureType } from '../types';\n\nexport interface SliceAttributes extends AttributeWithCacheKey {\n  readonly axes: number[];\n  readonly ends: number[];\n  readonly starts: number[];\n}\n\nconst sliceProgramMetadata = {\n  name: 'Slice',\n  inputNames: ['A'],\n  inputTypes: [TextureType.unpacked],\n};\n\nexport const slice: OperatorImplementation<SliceAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: SliceAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n  const output = inferenceHandler.run(\n    {\n      ...sliceProgramMetadata,\n      cacheHint: attributes.cacheKey,\n      get: () => createSliceProgramInfo(inferenceHandler, inputs[0], attributes),\n    },\n    inputs,\n  );\n  return [output];\n};\n\nexport const parseSliceAttributes: OperatorInitialization<SliceAttributes> = (node: Graph.Node): SliceAttributes => {\n  const starts = node.attributes.getInts('starts');\n  const ends = node.attributes.getInts('ends');\n  const axes = node.attributes.getInts('axes', []);\n  return createAttributeWithCacheKey({ starts, ends, axes });\n};\n\nconst createSliceProgramInfo = (\n  _inferenceHandler: WebGLInferenceHandler,\n  input: Tensor,\n  attributes: SliceAttributes,\n): ProgramInfo => {\n  const axes = attributes.axes.length === 0 ? input.dims.slice(0).map((_val, i) => i) : attributes.axes;\n  const normalizedAxes = ShapeUtil.normalizeAxes(axes, input.dims.length);\n  const starts = attributes.starts.map((start, i) => {\n    if (start > input.dims[normalizedAxes[i]] - 1) {\n      return input.dims[normalizedAxes[i]];\n    }\n    return ShapeUtil.normalizeAxis(start, input.dims[normalizedAxes[i]]);\n  });\n  const ends = attributes.ends.map((end, i) => {\n    if (end > input.dims[normalizedAxes[i]] - 1) {\n      return input.dims[normalizedAxes[i]];\n    }\n    return ShapeUtil.normalizeAxis(end, input.dims[normalizedAxes[i]]);\n  });\n\n  const outputShape = input.dims.slice();\n\n  const sliceOps: string[] = [];\n  for (let i = 0; i < normalizedAxes.length; i++) {\n    outputShape[normalizedAxes[i]] = ends[i] - starts[i];\n    if (starts[i] > 0) {\n      sliceOps.push(`outputIdx[${normalizedAxes[i]}] += ${starts[i]};`);\n    } // else { sliceOps.push(`outputIdx[${normalizedAxes[i]}] += 0;`); }\n  }\n\n  const rank = outputShape.length;\n  const shaderSource = `\n      float process(int outputIdx[${rank}]) {\n        ${sliceOps.join('\\n      ')}\n        return _A(outputIdx);\n      }`;\n  return {\n    ...sliceProgramMetadata,\n    output: { dims: outputShape, type: input.type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Slice requires 1 input.');\n  }\n  if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n    throw new Error('Invalid input type.');\n  }\n};\n\nexport const sliceV10 = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n  validateInputsV10(inputs);\n  const attributes = generateSliceAttributesFromInputs(inferenceHandler, inputs);\n  const output = inferenceHandler.run(\n    {\n      ...sliceProgramMetadata,\n      cacheHint: attributes.cacheKey,\n      get: () => createSliceProgramInfo(inferenceHandler, inputs[0], attributes),\n    },\n    [inputs[0]],\n  );\n  return [output];\n};\n\nconst generateSliceAttributesFromInputs = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n): SliceAttributes => {\n  if (\n    !inferenceHandler.session.isInitializer(inputs[1].dataId) ||\n    !inferenceHandler.session.isInitializer(inputs[2].dataId) ||\n    (inputs.length >= 4 && !inferenceHandler.session.isInitializer(inputs[3].dataId)) ||\n    (inputs.length >= 5 && !inferenceHandler.session.isInitializer(inputs[4].dataId))\n  ) {\n    throw new Error('dynamic slice attributes are not allowed');\n  }\n\n  if (inputs.length >= 5 && inputs[4].integerData.some((i: number) => i !== 1)) {\n    throw new Error('currently non-1 steps is not supported for Slice');\n  }\n\n  const starts = Array.from(inputs[1].integerData);\n  const ends = Array.from(inputs[2].integerData);\n  const axes = inputs.length >= 4 ? Array.from(inputs[3].integerData) : [];\n  const cacheKey = `${axes};${starts};${ends}`;\n  return { starts, ends, axes, cacheKey };\n};\n\nconst validateInputsV10 = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length < 3 || inputs.length > 5) {\n    throw new Error('Invalid input number.');\n  }\n  if (inputs[1].type !== 'int32' || inputs[1].dims.length !== 1) {\n    throw new Error('Invalid input type.');\n  }\n  if (inputs[2].type !== 'int32' || inputs[2].dims.length !== 1) {\n    throw new Error('Invalid input type.');\n  }\n  if (inputs.length >= 4 && (inputs[3].type !== 'int32' || inputs[3].dims.length !== 1)) {\n    throw new Error('Invalid input type.');\n  }\n  if (inputs.length >= 5 && (inputs[4].type !== 'int32' || inputs[4].dims.length !== 1)) {\n    throw new Error('Invalid input type.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, TextureType } from '../types';\n\nimport { transpose, TransposeAttributes } from './transpose';\n\nexport interface SoftmaxAttributes extends AttributeWithCacheKey {\n  readonly axis: number;\n}\n\nconst softmaxComputeMaxProgramMetadata = {\n  name: 'SoftmaxComputeMax',\n  inputNames: ['A'],\n  inputTypes: [TextureType.unpacked],\n};\n\nconst softmaxComputeScaleProgramMetadata = {\n  name: 'SoftmaxComputeScale',\n  inputNames: ['A', 'Max'],\n  inputTypes: [TextureType.unpacked, TextureType.unpacked],\n};\n\nconst softmaxProgramMetadata = {\n  name: 'SoftMax',\n  inputNames: ['A', 'Max', 'Norm'],\n  inputTypes: [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked],\n};\n\nexport const softmax: OperatorImplementation<SoftmaxAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: SoftmaxAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n\n  const inputShape = inputs[0].dims.slice();\n  const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n  const logicalRowCount = ShapeUtil.sizeToDimension(inputShape, axis);\n  const featureCount = ShapeUtil.sizeFromDimension(inputShape, axis);\n\n  const output = computeSoftmax(inferenceHandler, inputs, attributes, logicalRowCount, featureCount);\n  return output;\n};\n\nexport const parseSoftmaxAttributes: OperatorInitialization<SoftmaxAttributes> = (\n  node: Graph.Node,\n): SoftmaxAttributes => createAttributeWithCacheKey({ axis: node.attributes.getInt('axis', 1) });\n\nexport const parseSoftmaxAttributesV13: OperatorInitialization<SoftmaxAttributes> = (\n  node: Graph.Node,\n): SoftmaxAttributes => createAttributeWithCacheKey({ axis: node.attributes.getInt('axis', -1) });\n\n// The \"semantic\" meaning of axis has changed in opset-13.\n// Please compare: https://github.com/onnx/onnx/blob/main/docs/Operators.md#Softmax\n// with https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Softmax-11 for detailed explanations\n// To account for the opset-13 behavior, our plan will be to transpose the \"axis\" dim to the innermost dim\n// and perform softmax and then reverse the transpose. We can skip the transposing aspect if the axis is already\n// the innermost dim\nexport const softmaxV13: OperatorImplementation<SoftmaxAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: SoftmaxAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n\n  const inputShape = inputs[0].dims.slice();\n  const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n  const rank = inputShape.length;\n\n  const isTransposeRequired = axis !== rank - 1 ? true : false;\n  const transposedInputShape: number[] = [];\n  let perm: number[] = [];\n  let transposedInputs: Tensor[] = [];\n  let transposeAttribute: TransposeAttributes;\n\n  if (isTransposeRequired) {\n    perm = Array.from({ length: rank }).map((_, i) => i);\n\n    // swap the innermost dim with the dim corresponding to axis\n    perm[axis] = rank - 1;\n    perm[rank - 1] = axis;\n\n    perm.map((p) => transposedInputShape.push(inputShape[p]));\n\n    transposeAttribute = createAttributeWithCacheKey({ perm });\n    transposedInputs = transpose(inferenceHandler, inputs, transposeAttribute);\n  }\n\n  const logicalRowCount = isTransposeRequired\n    ? ShapeUtil.sizeToDimension(transposedInputShape, rank - 1)\n    : ShapeUtil.sizeToDimension(inputShape, rank - 1);\n  const featureCount = isTransposeRequired\n    ? ShapeUtil.sizeFromDimension(transposedInputShape, rank - 1)\n    : ShapeUtil.sizeFromDimension(inputShape, rank - 1);\n\n  const output = computeSoftmax(\n    inferenceHandler,\n    isTransposeRequired ? transposedInputs : inputs,\n    attributes,\n    logicalRowCount,\n    featureCount,\n  );\n\n  if (isTransposeRequired) {\n    const reversedOutput = transpose(inferenceHandler, output, transposeAttribute!);\n    return reversedOutput;\n  } else {\n    return output;\n  }\n};\n\nconst computeSoftmax = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: SoftmaxAttributes,\n  logicalRowCount: number,\n  featureCount: number,\n): Tensor[] => {\n  const computeMaxProgramInfo = createComputeMaxProgramInfo(\n    inferenceHandler,\n    inputs[0],\n    logicalRowCount,\n    featureCount,\n    [logicalRowCount],\n  );\n  const max = inferenceHandler.run(\n    { ...softmaxComputeMaxProgramMetadata, cacheHint: attributes.cacheKey, get: () => computeMaxProgramInfo },\n    inputs,\n  );\n\n  const computeScaleProgramInfo = createComputScaleProgramInfo(\n    inferenceHandler,\n    inputs[0],\n    logicalRowCount,\n    featureCount,\n    computeMaxProgramInfo.output.dims,\n    [logicalRowCount],\n  );\n  const scale = inferenceHandler.run(\n    { ...softmaxComputeScaleProgramMetadata, cacheHint: attributes.cacheKey, get: () => computeScaleProgramInfo },\n    [inputs[0], max],\n  );\n\n  const softMaxProgramInfo = createSoftMaxProgramInfo(\n    inferenceHandler,\n    inputs[0],\n    logicalRowCount,\n    featureCount,\n    computeMaxProgramInfo.output.dims,\n    computeScaleProgramInfo.output.dims,\n  );\n  const output = inferenceHandler.run(\n    { ...softmaxProgramMetadata, cacheHint: attributes.cacheKey, get: () => softMaxProgramInfo },\n    [inputs[0], max, scale],\n  );\n  return [output];\n};\n\n/**\n * Create a texture that contains the maximum value of each of the 'N' rows\n */\nconst createComputeMaxProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  input: Tensor,\n  logicalRowCount: number,\n  featureCount: number,\n  outputShape: number[],\n): ProgramInfo => {\n  const [textureWidth, textureHeight] = inferenceHandler.calculateTextureWidthAndHeight(\n    input.dims,\n    TextureType.unpacked,\n  );\n  const rank = outputShape.length;\n\n  if (logicalRowCount < 1 || featureCount < 1) {\n    throw new Error('Logical row count N and feature count D must be greater than or equal to 1');\n  }\n\n  if (outputShape.length !== 1) {\n    throw new Error('Dimensionality of the output should be 1');\n  }\n\n  if (outputShape[0] !== logicalRowCount) {\n    throw new Error('Shape of the output should be equal to logical row count');\n  }\n\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const shaderSource = `\n      float process(int[${rank}] indices) {\n        int logical_row_start_offset = indices[0] * ${featureCount};\n\n        float max = getColorAsFloat(${glsl.texture2D}(A, offsetToCoords(logical_row_start_offset, ${textureWidth},\n        ${textureHeight} )));\n        for(int i=1; i<${featureCount}; ++i)\n        {\n          float current = getColorAsFloat(${glsl.texture2D}(A, offsetToCoords(logical_row_start_offset + i,\n            ${textureWidth}, ${textureHeight})));\n          if(current > max)\n          max = current;\n        }\n\n        return max;\n      }`;\n  return {\n    ...softmaxComputeMaxProgramMetadata,\n    output: { dims: outputShape, type: input.type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\n/**\n * Create a texture that contains the normalization factor for each of the 'N' rows\n */\nconst createComputScaleProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  input: Tensor,\n  logicalRowCount: number,\n  featureCount: number,\n  maxElementPerLogicalRow: readonly number[],\n  outputShape: number[],\n): ProgramInfo => {\n  const [textureWidth, textureHeight] = inferenceHandler.calculateTextureWidthAndHeight(\n    input.dims,\n    TextureType.unpacked,\n  );\n  const rank = outputShape.length;\n\n  if (logicalRowCount < 1 || featureCount < 1) {\n    throw new Error('Logical row count N and feature count D must be greater than or equal to 1');\n  }\n\n  if (outputShape.length !== 1) {\n    throw new Error('Dimensionality of the output should be 1');\n  }\n\n  if (outputShape[0] !== logicalRowCount) {\n    throw new Error('Shape of the output should be equal to logical row count');\n  }\n\n  if (maxElementPerLogicalRow.length !== 1) {\n    throw new Error('Dimensionality of the intermediate results should be 1');\n  }\n\n  if (maxElementPerLogicalRow[0] !== logicalRowCount) {\n    throw new Error('Shape of the intermediate results should be equal to logical row count');\n  }\n\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const shaderSource = `\n      float process(int[${rank}] indices) {\n        int logical_row_start_offset = indices[0] * ${featureCount};\n\n        float norm_factor = 0.0;\n        float max = _Max(indices);\n        for(int i=0; i<${featureCount}; ++i)\n        {\n          norm_factor += exp(getColorAsFloat(${glsl.texture2D}(A, offsetToCoords(logical_row_start_offset + i,\n            ${textureWidth}, ${textureHeight}))) - max);\n        }\n\n        return norm_factor;\n      }`;\n  return {\n    ...softmaxComputeScaleProgramMetadata,\n    output: { dims: outputShape, type: input.type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst createSoftMaxProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  input: Tensor,\n  logicalRowCount: number,\n  featureCount: number,\n  maxElementPerLogicalRow: readonly number[],\n  normalizationPerLogicalRow: readonly number[],\n): ProgramInfo => {\n  const [textureWidth, textureHeight] = inferenceHandler.calculateTextureWidthAndHeight(\n    input.dims,\n    TextureType.unpacked,\n  );\n  const rank = input.dims.length;\n\n  if (logicalRowCount < 1 || featureCount < 1) {\n    throw new Error('Logical row count N and feature count D must be greater than or equal to 1');\n  }\n\n  if (maxElementPerLogicalRow.length !== 1 || normalizationPerLogicalRow.length !== 1) {\n    throw new Error('Dimensionality of the intermediate results should be 1');\n  }\n\n  if (maxElementPerLogicalRow[0] !== logicalRowCount || normalizationPerLogicalRow[0] !== logicalRowCount) {\n    throw new Error('Shape of the intermediate results should be equal to logical row count');\n  }\n\n  const shaderSource = `\n      float process(int[${rank}] indices) {\n\n      // get offset of current logical tensor index from the 2-D texture coordinates (TexCoords)\n      int offset = coordsToOffset(TexCoords, ${textureWidth}, ${textureHeight});\n\n      //determine the logical row for this index\n      int logical_row_index[1];\n      logical_row_index[0] = offset / ${featureCount};\n\n      float norm_factor = _Norm(logical_row_index);\n\n      // avoid possible division by 0\n      // if norm_facor is 0, all elements are zero\n      // if so, return 0\n      if(norm_factor == 0.0)\n        return 0.0;\n\n      return exp(_A(indices) - _Max(logical_row_index)) / norm_factor;\n    }`;\n  return {\n    ...softmaxProgramMetadata,\n    output: { dims: input.dims, type: input.type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Softmax requires 1 input.');\n  }\n\n  if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n    throw new Error('Invalid input type');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AttributeWithCacheKey, createAttributeWithCacheKey } from '../../../attribute-with-cache-key';\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil, SplitUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, TextureType } from '../types';\n\nexport interface SplitAttributes extends AttributeWithCacheKey {\n  readonly axis: number;\n  readonly split: number[];\n  readonly numOutputs: number;\n}\n\nconst splitProgramMetadata = {\n  name: 'Split',\n  inputNames: ['A'],\n  inputTypes: [TextureType.unpacked],\n};\n\nexport const split: OperatorImplementation<SplitAttributes> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  attributes: SplitAttributes,\n): Tensor[] => {\n  validateInputs(inputs);\n\n  const axis = ShapeUtil.normalizeAxis(attributes.axis, inputs[0].dims.length);\n  const count = getProgramCount(inferenceHandler, inputs, axis, attributes);\n  const output: Tensor[] = [];\n  for (let i = 0; i < count; ++i) {\n    output.push(\n      inferenceHandler.run(\n        {\n          ...splitProgramMetadata,\n          cacheHint: `${attributes.cacheKey};${i}`,\n          get: () => createSplitProgramInfo(inferenceHandler, inputs[0], attributes, axis, i),\n        },\n        inputs,\n      ),\n    );\n  }\n\n  return output;\n};\n\nexport const parseSplitAttributes: OperatorInitialization<SplitAttributes> = (node: Graph.Node): SplitAttributes => {\n  const axis = node.attributes.getInt('axis', 0);\n  const split = node.attributes.getInts('split', []);\n  const numOutputs = node.outputs.length;\n  return createAttributeWithCacheKey({ axis, split, numOutputs });\n};\n\nconst getProgramCount = (\n  _inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  axis: number,\n  attributes: SplitAttributes,\n): number => {\n  const [, offsets] = SplitUtil.splitShape(inputs[0].dims, axis, attributes.split, attributes.numOutputs);\n  return offsets.length;\n};\n\nconst createSplitProgramInfo = (\n  _inferenceHandler: WebGLInferenceHandler,\n  input: Tensor,\n  attributes: SplitAttributes,\n  axis: number,\n  index: number,\n): ProgramInfo => {\n  const [shapes, offsets] = SplitUtil.splitShape(input.dims, axis, attributes.split, attributes.numOutputs);\n  const offset = offsets[index];\n  const outputShape = shapes[index];\n  const rank = outputShape.length;\n  const shaderSource = `\n      float process(int indices[${rank}]) {\n        indices[${axis}] += ${offset};\n        return _A(indices);\n      }\n    `;\n  return {\n    ...splitProgramMetadata,\n    cacheHint: `${attributes.cacheKey}:${index}`,\n    output: { dims: outputShape, type: input.type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Split requires one input.');\n  }\n\n  if (\n    inputs[0].type !== 'int8' &&\n    inputs[0].type !== 'uint8' &&\n    inputs[0].type !== 'int16' &&\n    inputs[0].type !== 'uint16' &&\n    inputs[0].type !== 'int32' &&\n    inputs[0].type !== 'uint32' &&\n    inputs[0].type !== 'float32' &&\n    inputs[0].type !== 'float64' &&\n    inputs[0].type !== 'bool'\n  ) {\n    throw new Error('Invalid input type.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\n\nexport const squeeze: OperatorImplementation<number[]> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  axes: number[],\n): Tensor[] => {\n  validateInputs(inputs);\n  const outputShape = ShapeUtil.squeezeShape(inputs[0].dims, axes);\n  const output = inferenceHandler.reshapeUnpacked(inputs[0], outputShape);\n  return [output];\n};\n\nexport const squeezeV13 = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n  validateInputsV13(inputs);\n  return squeeze(inferenceHandler, [inputs[0]], Array.from(inputs[1].integerData));\n};\n\nexport const parseSqueezeAttributes: OperatorInitialization<number[]> = (node: Graph.Node): number[] =>\n  node.attributes.getInts('axes');\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Squeeze requires 1 input.');\n  }\n\n  if (inputs[0].type === 'string') {\n    throw new Error('invalid input tensor types.');\n  }\n};\n\nconst validateInputsV13 = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 2) {\n    throw new Error('Squeeze requires 2 inputs.');\n  }\n\n  if (inputs[1].type !== 'int32') {\n    throw new Error('Invalid input type.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from '../../../tensor';\nimport { getGlsl } from '../glsl-source';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramMetadata, TextureType } from '../types';\n\nexport const sum = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n  validateInputs(inputs);\n\n  const sumProgramMetadata = {\n    name: 'Sum',\n    inputNames: inputs.map((_v, i) => `X${i}`),\n    inputTypes: new Array(inputs.length).fill(TextureType.unpacked),\n  };\n\n  const output = inferenceHandler.run(\n    { ...sumProgramMetadata, get: () => createSumProgramInfo(inferenceHandler, inputs, sumProgramMetadata) },\n    inputs,\n  );\n  return [output];\n};\n\nconst createSumProgramInfo = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  sumProgramMetadata: ProgramMetadata,\n): ProgramInfo => {\n  const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n  const outputShape = inputs[0].dims.slice();\n  const sumLine = inputs.map((_v, i) => `${glsl.texture2D}(X${i},TexCoords)`).join(' + ');\n  const shaderSource = `\n      void main() {\n        vec4 result = ${sumLine};\n        ${glsl.output} = result;\n      }\n    `;\n  return {\n    ...sumProgramMetadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    hasMain: true,\n    shaderSource,\n  };\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length === 0) {\n    throw new Error('Sum requires inputs.');\n  }\n\n  const length = inputs[0].dims.length;\n  for (let i = 1; i < inputs.length; i++) {\n    if (length !== inputs[i].dims.length) {\n      throw new Error('Input shapes are mismatched.');\n    }\n\n    for (let j = 0; j < length; j++) {\n      if (inputs[0].dims[j] !== inputs[i].dims[j]) {\n        throw new Error('Input shapes are not matched.');\n      }\n    }\n  }\n\n  if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n    throw new Error('Invalid input type.');\n  }\n  for (let i = 1; i < inputs.length; i++) {\n    if (inputs[0].type !== inputs[i].type) {\n      throw new Error('Input types are not matched.');\n    }\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { NUMBER_TYPES } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { WebGLInferenceHandler } from '../inference-handler';\nimport { ProgramInfo, ProgramMetadata, TextureType } from '../types';\n\nexport const tile = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n  validateInputs(inputs);\n\n  const tileProgramMetadata = {\n    name: 'Tile',\n    inputNames: ['A'],\n    inputTypes: [TextureType.unpacked],\n  };\n\n  const output = inferenceHandler.run(\n    { ...tileProgramMetadata, get: () => createTileProgramInfo(inferenceHandler, inputs, tileProgramMetadata) },\n    inputs,\n  );\n  return [output];\n};\n\nconst createTileProgramInfo = (\n  _handler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  tileProgramMetadata: ProgramMetadata,\n): ProgramInfo => {\n  const inputShape = inputs[0].dims.slice();\n  const outputShape = new Array(inputShape.length);\n\n  const tileOps: string[] = [];\n  for (let i = 0; i < inputShape.length; i++) {\n    outputShape[i] = inputShape[i] * inputs[1].numberData[i];\n    tileOps.push(`inputIdx[${i}] = int(mod(float(outputIdx[${i}]), ${inputShape[i]}.));`);\n  }\n\n  const rank = outputShape.length;\n  const shaderSource = `\n      float process(int outputIdx[${rank}]) {\n        int inputIdx[${rank}];\n        ${tileOps.join('\\n')}\n        return _A(inputIdx);\n      }\n    `;\n  return {\n    ...tileProgramMetadata,\n    output: { dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked },\n    shaderSource,\n  };\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 2) {\n    throw new Error('Tile requires 2 input.');\n  }\n  if (inputs[1].dims.length !== 1) {\n    throw new Error('The second input shape must 1 dimension.');\n  }\n  if (inputs[1].dims[0] !== inputs[0].dims.length) {\n    throw new Error('Invalid input shape.');\n  }\n  if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n    throw new Error('Invalid input type.');\n  }\n  if (inputs[1].type !== 'int32' && inputs[1].type !== 'int16') {\n    throw new Error('Invalid repeat type.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Graph } from '../../../graph';\nimport { OperatorImplementation, OperatorInitialization } from '../../../operators';\nimport { Tensor } from '../../../tensor';\nimport { ShapeUtil } from '../../../util';\nimport { WebGLInferenceHandler } from '../inference-handler';\n\nexport const unsqueeze: OperatorImplementation<number[]> = (\n  inferenceHandler: WebGLInferenceHandler,\n  inputs: Tensor[],\n  axes: number[],\n): Tensor[] => {\n  validateInputs(inputs);\n  const outputShape = ShapeUtil.unsqueezeShape(inputs[0].dims, axes);\n  const output = inferenceHandler.reshapeUnpacked(inputs[0], outputShape);\n  return [output];\n};\n\nexport const unsqueezeV13 = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n  validateInputsV13(inputs);\n  return unsqueeze(inferenceHandler, [inputs[0]], Array.from(inputs[1].integerData));\n};\n\nexport const parseUnsqueezeAttributes: OperatorInitialization<number[]> = (node: Graph.Node): number[] =>\n  node.attributes.getInts('axes');\n\nconst validateInputs = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 1) {\n    throw new Error('Unsqueeze requires 1 input.');\n  }\n\n  if (inputs[0].type === 'string') {\n    throw new Error('invalid input tensor types.');\n  }\n};\n\nconst validateInputsV13 = (inputs: Tensor[]): void => {\n  if (!inputs || inputs.length !== 2) {\n    throw new Error('Unsqueeze requires 2 inputs.');\n  }\n\n  if (inputs[1].type !== 'int32') {\n    throw new Error('Invalid input type.');\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { OpSet } from '../../opset';\n\nimport { batchNormalization, parseBatchNormalizationAttributes } from './ops/batch-normalization';\nimport * as binaryOps from './ops/binary-op';\nimport { cast, parseCastAttributes } from './ops/cast';\nimport { concat, parseConcatAttributes } from './ops/concat';\nimport { conv, parseConvAttributes } from './ops/conv';\nimport { convTranspose, parseConvTransposeAttributes } from './ops/conv-transpose';\nimport { depthToSpace, parseDepthToSpaceAttributes } from './ops/depth-to-space';\nimport { flatten, parseFlattenAttributes } from './ops/flatten';\nimport { gather, parseGatherAttributes } from './ops/gather';\nimport { gemm, parseGemmAttributesV11, parseGemmAttributesV7 } from './ops/gemm';\nimport { imageScaler, parseImageScalerAttributes } from './ops/image-scaler';\nimport { instanceNormalization, parseInstanceNormalizationAttributes } from './ops/instance-normalization';\nimport { lrn, parseLrnAttributes } from './ops/lrn';\nimport { matMul, parseMatMulAttributes } from './ops/matmul';\nimport { padV11, padV2, parsePadAttributesV11, parsePadAttributesV2 } from './ops/pad';\nimport {\n  averagePool,\n  globalAveragePool,\n  globalMaxPool,\n  maxPool,\n  parseAveragePoolAttributes,\n  parseGlobalAveragePoolAttributes,\n  parseMaxPoolAttributes,\n} from './ops/pool';\nimport {\n  parseReduceAttributes,\n  reduceLogSum,\n  reduceLogSumSquare,\n  reduceMax,\n  reduceMean,\n  reduceMin,\n  reduceProd,\n  reduceSum,\n} from './ops/reduce';\nimport { reshape } from './ops/reshape';\nimport { parseResizeAttributesV10, parseResizeAttributesV11, resize } from './ops/resize-packed';\nimport { shape } from './ops/shape';\nimport { parseSliceAttributes, slice, sliceV10 } from './ops/slice';\nimport { parseSoftmaxAttributes, parseSoftmaxAttributesV13, softmax, softmaxV13 } from './ops/softmax';\nimport { parseSplitAttributes, split } from './ops/split';\nimport { parseSqueezeAttributes, squeeze, squeezeV13 } from './ops/squeeze';\nimport { sum } from './ops/sum';\nimport { tile } from './ops/tile';\nimport { parseTransposeAttributes, transpose } from './ops/transpose';\nimport * as unaryOps from './ops/unary-op';\nimport { parseUnsqueezeAttributes, unsqueeze, unsqueezeV13 } from './ops/unsqueeze';\nimport { parseUpsampleAttributesV7, parseUpsampleAttributesV9, upsample } from './ops/upsample';\n\nexport const WEBGL_OP_RESOLVE_RULES: readonly OpSet.ResolveRule[] = [\n  ['Abs', '', '6+', unaryOps.abs],\n  ['Acos', '', '7+', unaryOps.acos],\n  ['Add', '', '7+', binaryOps.add],\n  ['And', '', '7+', binaryOps.and],\n  ['Asin', '', '7+', unaryOps.asin],\n  ['Atan', '', '7+', unaryOps.atan],\n  // TODO: support new attributes for AveragePool-10\n  ['AveragePool', '', '7+', averagePool, parseAveragePoolAttributes],\n  ['BatchNormalization', '', '7+', batchNormalization, parseBatchNormalizationAttributes],\n  ['Cast', '', '6+', cast, parseCastAttributes],\n  ['Ceil', '', '6+', unaryOps.ceil],\n  ['Clip', '', '6-10', unaryOps.clip, unaryOps.parseClipAttributes],\n  ['Clip', '', '11+', unaryOps.clipV11],\n  ['Concat', '', '4+', concat, parseConcatAttributes],\n  ['Conv', '', '1+', conv, parseConvAttributes],\n  ['ConvTranspose', '', '1+', convTranspose, parseConvTransposeAttributes],\n  ['Cos', '', '7+', unaryOps.cos],\n  ['Div', '', '7+', binaryOps.div],\n  ['Dropout', '', '7+', unaryOps.identity],\n  ['DepthToSpace', '', '1+', depthToSpace, parseDepthToSpaceAttributes],\n  ['Equal', '', '7+', binaryOps.equal],\n  ['Elu', '', '6+', unaryOps.elu, unaryOps.parseEluAttributes],\n  ['Exp', '', '6+', unaryOps.exp],\n  ['Flatten', '', '1+', flatten, parseFlattenAttributes],\n  ['Floor', '', '6+', unaryOps.floor],\n  ['FusedConv', 'com.microsoft', '1+', conv, parseConvAttributes],\n  ['Gather', '', '1+', gather, parseGatherAttributes],\n  ['Gemm', '', '7-10', gemm, parseGemmAttributesV7],\n  ['Gemm', '', '11+', gemm, parseGemmAttributesV11],\n  ['GlobalAveragePool', '', '1+', globalAveragePool, parseGlobalAveragePoolAttributes],\n  ['GlobalMaxPool', '', '1+', globalMaxPool],\n  ['Greater', '', '7+', binaryOps.greater],\n  ['Identity', '', '1+', unaryOps.identity],\n  ['ImageScaler', '', '1+', imageScaler, parseImageScalerAttributes],\n  ['InstanceNormalization', '', '6+', instanceNormalization, parseInstanceNormalizationAttributes],\n  ['LeakyRelu', '', '6+', unaryOps.leakyRelu, unaryOps.parseLeakyReluAttributes],\n  ['Less', '', '7+', binaryOps.less],\n  ['LRN', '', '1+', lrn, parseLrnAttributes],\n  ['Log', '', '6+', unaryOps.log],\n  ['MatMul', '', '1+', matMul, parseMatMulAttributes],\n  // TODO: support new attributes for MaxPool-8 and MaxPool-10\n  ['MaxPool', '', '1+', maxPool, parseMaxPoolAttributes],\n  ['Mul', '', '7+', binaryOps.mul],\n  ['Neg', '', '6+', unaryOps.neg],\n  ['Not', '', '1+', unaryOps.not],\n  ['Or', '', '7+', binaryOps.or],\n  ['Pad', '', '2-10', padV2, parsePadAttributesV2],\n  ['Pad', '', '11+', padV11, parsePadAttributesV11],\n  ['Pow', '', '7+', binaryOps.pow],\n  ['PRelu', '', '7+', binaryOps.pRelu],\n  ['ReduceLogSum', '', '1+', reduceLogSum, parseReduceAttributes],\n  ['ReduceMax', '', '1+', reduceMax, parseReduceAttributes],\n  ['ReduceMean', '', '1+', reduceMean, parseReduceAttributes],\n  ['ReduceMin', '', '1+', reduceMin, parseReduceAttributes],\n  ['ReduceProd', '', '1+', reduceProd, parseReduceAttributes],\n  ['ReduceSum', '', '1-12', reduceSum, parseReduceAttributes],\n  ['ReduceSumSquare', '', '1+', reduceLogSumSquare, parseReduceAttributes],\n  ['Relu', '', '6+', unaryOps.relu],\n  ['Reshape', '', '5+', reshape],\n  ['Resize', '', '10', resize, parseResizeAttributesV10],\n  ['Resize', '', '11+', resize, parseResizeAttributesV11],\n  ['Shape', '', '1+', shape],\n  ['Sigmoid', '', '6+', unaryOps.sigmoid],\n  ['Sin', '', '7+', unaryOps.sin],\n  ['Slice', '', '10+', sliceV10], // TODO: support 'steps' for Slice-10\n  ['Slice', '', '1-9', slice, parseSliceAttributes],\n  // The \"semantic\" meaning of axis has changed in opset-13.\n  ['Softmax', '', '1-12', softmax, parseSoftmaxAttributes],\n  ['Softmax', '', '13+', softmaxV13, parseSoftmaxAttributesV13],\n  // 'Split' operator has an optional attribute 'split'\n  // this attribute determines how the specified axis of input data is split.\n  // When the attribute is missing, we need the count of number of outputs\n  // so that we can determine the 'split' attribute from the runtime input to the Operator\n  ['Split', '', '2-12', split, parseSplitAttributes],\n  ['Sqrt', '', '6+', unaryOps.sqrt],\n  ['Squeeze', '', '1-12', squeeze, parseSqueezeAttributes],\n  ['Squeeze', '', '13+', squeezeV13],\n  ['Sub', '', '7+', binaryOps.sub],\n  ['Sum', '', '6+', sum],\n  ['Tan', '', '7+', unaryOps.tan],\n  ['Tanh', '', '6+', unaryOps.tanh],\n  ['Tile', '', '6+', tile],\n  ['Transpose', '', '1+', transpose, parseTransposeAttributes],\n  ['Upsample', '', '7-8', upsample, parseUpsampleAttributesV7],\n  ['Upsample', '', '9', upsample, parseUpsampleAttributesV9],\n  ['Unsqueeze', '', '1-12', unsqueeze, parseUnsqueezeAttributes],\n  ['Unsqueeze', '', '13+', unsqueezeV13],\n  ['Xor', '', '7+', binaryOps.xor],\n];\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst INLINE_FUNC_DEF_REGEX = /@inline[\\s\\n\\r]+(\\w+)[\\s\\n\\r]+([0-9a-zA-Z_]+)\\s*\\(([^)]*)\\)\\s*{(([^}]|[\\n\\r])*)}/gm;\nconst FUNC_CALL_REGEX = '(\\\\w+)?\\\\s+([_0-9a-zA-Z]+)\\\\s+=\\\\s+__FUNC__\\\\((.*)\\\\)\\\\s*;';\n/**\n * GLSL preprocessor responsible for resolving @inline directives\n */\nexport function replaceInlines(script: string): string {\n  const inlineDefs: { [name: string]: { params: Array<{ type: string; name: string } | null>; body: string } } = {};\n  let match;\n  while ((match = INLINE_FUNC_DEF_REGEX.exec(script)) !== null) {\n    const params = match[3]\n      .split(',')\n      .map((s) => {\n        const tokens = s.trim().split(' ');\n        if (tokens && tokens.length === 2) {\n          return { type: tokens[0], name: tokens[1] };\n        }\n        return null;\n      })\n      .filter((v) => v !== null);\n    inlineDefs[match[2]] = { params, body: match[4] };\n  }\n  for (const name in inlineDefs) {\n    const regexString = FUNC_CALL_REGEX.replace('__FUNC__', name);\n    const regex = new RegExp(regexString, 'gm');\n    while ((match = regex.exec(script)) !== null) {\n      const type = match[1];\n      const variable = match[2];\n      const params = match[3].split(',');\n      const declLine = type ? `${type} ${variable};` : '';\n      let newBody: string = inlineDefs[name].body;\n      let paramRedecLine = '';\n      inlineDefs[name].params.forEach((v, i) => {\n        if (v) {\n          paramRedecLine += `${v.type} ${v.name} = ${params[i]};\\n`;\n        }\n      });\n      newBody = `${paramRedecLine}\\n ${newBody}`;\n      newBody = newBody.replace('return', `${variable} = `);\n      const replacement = `\n      ${declLine}\n      {\n        ${newBody}\n      }\n      `;\n      script = script.replace(match[0], replacement);\n    }\n  }\n  script = script.replace(INLINE_FUNC_DEF_REGEX, '');\n  return script;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Logger } from '../../instrument';\nimport { assert } from '../../util';\n\n/** Layout preferences */\nexport interface WidthHeightPrefs {\n  breakAxis?: number;\n  isPacked?: boolean;\n  reverseWH?: boolean;\n}\n/**\n * TextureLayoutStrategy is an abstraction for different plans\n * for mapping n-dimensional arrays to 2D textures (and back)\n */\nexport interface TextureLayoutStrategy {\n  computeTextureWH(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number];\n}\n\n/**\n * This strategy try to find the minimal max(W,H) that fulfills (W * H == totalSize)\n */\nexport class AlwaysKeepOriginalSizeStrategy implements TextureLayoutStrategy {\n  constructor(public maxTextureSize: number) {}\n  computeTextureWH(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number] {\n    // scalar tensor\n    if (shape.length === 0) {\n      return [1, 1];\n    }\n    const maxTextureSize = this.maxTextureSize;\n    if (prefs && prefs.breakAxis !== undefined) {\n      // check to see if dims fit\n      const wsize = prefs.breakAxis >= shape.length ? 1 : shape.slice(prefs.breakAxis).reduce((a, b) => a * b);\n      const hsize = prefs.breakAxis <= 0 ? 1 : shape.slice(0, prefs.breakAxis).reduce((a, b) => a * b);\n      if (wsize > maxTextureSize || hsize > maxTextureSize) {\n        // ignore preferences\n        // continue with default layout\n        Logger.verbose(\n          'TextureLayout',\n          `Given width/height preferences were unattainable: shape:${shape}, breakAxis:${prefs.breakAxis}`,\n        );\n      } else {\n        return [wsize, hsize];\n      }\n    }\n    const totalSize = shape.reduce((a, b) => a * b);\n\n    let width = Math.floor(Math.sqrt(totalSize));\n\n    for (; width < maxTextureSize && width < totalSize; width++) {\n      if (totalSize % width === 0) {\n        break;\n      }\n    }\n\n    if (width >= maxTextureSize || totalSize % width !== 0) {\n      throw new Error(`The given dimensions are outside this GPU's boundaries: ${shape}`);\n    }\n    return [width, totalSize / width];\n  }\n}\n\nexport class PreferLogicalStrategy implements TextureLayoutStrategy {\n  constructor(public maxTextureSize: number) {}\n  computeTextureWH(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number] {\n    const wh = this.computeTexture(shape, prefs);\n    if (prefs && prefs.isPacked) {\n      wh[0] /= 2;\n      wh[1] /= 2;\n    }\n    if (prefs && prefs.reverseWH) {\n      return [wh[1], wh[0]];\n    }\n    return wh;\n  }\n\n  computeTexture(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number] {\n    const isPacked = prefs && prefs.isPacked;\n    // scalar tensor\n    if (shape.length === 0) {\n      return isPacked ? [2, 2] : [1, 1];\n    }\n    let maxTextureSize = this.maxTextureSize;\n    if (prefs && prefs.breakAxis !== undefined) {\n      // check to see if dims fit\n      const wsize = prefs.breakAxis >= shape.length ? 1 : shape.slice(prefs.breakAxis).reduce((a, b) => a * b);\n      const hsize = prefs.breakAxis <= 0 ? 1 : shape.slice(0, prefs.breakAxis).reduce((a, b) => a * b);\n      if (wsize > maxTextureSize || hsize > maxTextureSize) {\n        // ignore preferences\n        // continue with default layout\n        Logger.verbose(\n          'TextureLayout',\n          `Given width/height preferences were unattainable: shape:${shape}, breakAxis:${prefs.breakAxis}`,\n        );\n      } else {\n        return [wsize, hsize];\n      }\n    }\n    let logShape = shape.slice(0);\n    if (isPacked) {\n      maxTextureSize = maxTextureSize * 2;\n\n      // This logic ensures we accurately count the number of packed texels needed\n      // to accommodate the tensor. We can only pack values in the same texel if\n      // they are from adjacent pairs of rows/cols within the same batch. So if a\n      // tensor has 3 rows, we pretend it has 4 rows in order to account for the\n      // fact that the texels containing the third row are half empty.\n      logShape = logShape.map((_d, i) =>\n        i >= logShape.length - 2 ? (logShape[i] % 2 === 0 ? logShape[i] : logShape[i] + 1) : logShape[i],\n      );\n\n      // Packed texture height is at least 2 (the channel height of a single\n      // texel).\n      if (logShape.length === 1) {\n        logShape = [2, logShape[0]];\n      }\n    }\n\n    // If logical shape is 2, we don't squeeze, since we want to match physical.\n    if (logShape.length !== 2) {\n      const squeezeResult = squeezeShape(logShape);\n      logShape = squeezeResult.newShape;\n    }\n\n    const size = sizeFromShape(logShape);\n    if (logShape.length <= 1 && size <= maxTextureSize) {\n      return [1, size];\n    } else if (logShape.length === 2 && logShape[0] <= maxTextureSize && logShape[1] <= maxTextureSize) {\n      return logShape as [number, number];\n    } else if (logShape.length === 3 && logShape[0] * logShape[1] <= maxTextureSize && logShape[2] <= maxTextureSize) {\n      return [logShape[0] * logShape[1], logShape[2]];\n    } else if (logShape.length === 3 && logShape[0] <= maxTextureSize && logShape[1] * logShape[2] <= maxTextureSize) {\n      return [logShape[0], logShape[1] * logShape[2]];\n    } else if (\n      logShape.length === 4 &&\n      logShape[0] * logShape[1] * logShape[2] <= maxTextureSize &&\n      logShape[3] <= maxTextureSize\n    ) {\n      return [logShape[0] * logShape[1] * logShape[2], logShape[3]];\n    } else if (\n      logShape.length === 4 &&\n      logShape[0] <= maxTextureSize &&\n      logShape[1] * logShape[2] * logShape[3] <= maxTextureSize\n    ) {\n      return [logShape[0], logShape[1] * logShape[2] * logShape[3]];\n    } else {\n      if (isPacked) {\n        // For packed textures size equals the number of channels required to\n        // accommodate the texture data. However in order to squarify such that\n        // inner dimensions stay even, we rewrite size to equal the number of\n        // texels. Then in the return statement we rehydrate the squarified\n        // dimensions to channel units.\n        return sizeToSquarishShape(size / 4).map((d) => d * 2) as [number, number];\n      }\n      return sizeToSquarishShape(size);\n    }\n  }\n}\n\nexport function squeezeShape(shape: number[], axis?: number[]): { newShape: number[]; keptDims: number[] } {\n  const newShape: number[] = [];\n  const keptDims: number[] = [];\n  const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0;\n  const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort();\n  let j = 0;\n  for (let i = 0; i < shape.length; ++i) {\n    if (axes != null) {\n      if (axes[j] === i && shape[i] !== 1) {\n        throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`);\n      }\n      if ((axes[j] == null || axes[j] > i) && shape[i] === 1) {\n        newShape.push(shape[i]);\n        keptDims.push(i);\n      }\n      if (axes[j] <= i) {\n        j++;\n      }\n    }\n    if (shape[i] !== 1) {\n      newShape.push(shape[i]);\n      keptDims.push(i);\n    }\n  }\n  return { newShape, keptDims };\n}\n\nexport function parseAxisParam(axis: number | number[], shape: number[]): number[] {\n  const rank = shape.length;\n\n  // Normalize input\n  axis = axis == null ? shape.map((_s, i) => i) : ([] as number[]).concat(axis);\n\n  // Check for valid range\n  assert(\n    axis.every((ax) => ax >= -rank && ax < rank),\n    () => `All values in axis param must be in range [-${rank}, ${rank}) but ` + `got axis ${axis}`,\n  );\n\n  // Check for only integers\n  assert(axis.every(isInt), () => 'All values in axis param must be integers but ' + `got axis ${axis}`);\n\n  // Handle negative axis.\n  return axis.map((a) => (a < 0 ? rank + a : a));\n}\nexport function isInt(a: number): boolean {\n  return a % 1 === 0;\n}\nexport function sizeFromShape(shape: number[]): number {\n  if (shape.length === 0) {\n    // Scalar.\n    return 1;\n  }\n  let size = shape[0];\n  for (let i = 1; i < shape.length; i++) {\n    size *= shape[i];\n  }\n  return size;\n}\nexport function getRowsCols(shape: number[]): [number, number] {\n  if (shape.length === 0) {\n    throw Error('Cannot get rows and columns of an empty shape array.');\n  }\n\n  return [shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1]];\n}\nexport function sizeToSquarishShape(size: number): [number, number] {\n  const width = Math.ceil(Math.sqrt(size));\n  return [width, Math.ceil(size / width)];\n}\nexport function getBatchDim(shape: number[], dimsToSkip = 2): number {\n  return sizeFromShape(shape.slice(0, shape.length - dimsToSkip));\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ArrayUtil, BroadcastUtil, ShapeUtil } from '../../util';\n\nimport { GlslContext, GlslLib, GlslLibRoutine } from './glsl-definitions';\nimport { getGlsl } from './glsl-source';\nimport { squeezeShape } from './texture-layout-strategy';\nimport { TextureLayout } from './types';\nimport {\n  generateShaderFuncNameFromInputSamplerName,\n  generateShaderFuncNameFromInputSamplerNameAtOutCoords,\n  getCoordsDataType,\n  getGlChannels,\n  getSqueezedParams,\n  squeezeInputShape,\n} from './utils';\n\n/**\n * GLSL Library responsible for data types and routines for manipulating\n * coordinates and mapping to/from tensor indices\n */\nexport class CoordsGlslLib extends GlslLib {\n  returnType: string;\n\n  constructor(context: GlslContext) {\n    super(context);\n  }\n  getFunctions(): { [name: string]: GlslLibRoutine } {\n    return {\n      ...this.offsetToCoords(),\n      ...this.coordsToOffset(),\n      ...this.toVec(),\n      ...this.valueFrom(),\n      // TODO return these only when packing is enabled.\n      ...this.getCommonUtilFuncs(),\n      ...this.getInputsSamplingSnippets(),\n      ...this.getOutputSamplingSnippet(),\n    };\n  }\n  getCustomTypes() {\n    return {};\n  }\n  /**\n   * Produces a function that can map from\n   * 2D normalzied coordinates (s,t) to a flat offset\n   */\n  protected offsetToCoords(): { [name: string]: GlslLibRoutine } {\n    const funcName = 'offsetToCoords';\n    return {\n      offsetToCoords: new GlslLibRoutine(`\n      vec2 ${funcName}(int offset, int width, int height) {\n        int t = offset / width;\n        int s = offset - t*width;\n        vec2 coords = (vec2(s,t) + vec2(0.5,0.5)) / vec2(width, height);\n        return coords;\n      }\n      `),\n    };\n  }\n\n  /**\n   * Produces a function that can map from\n   * 2D normalzied coordinates (s,t) to a flat offset\n   */\n  protected coordsToOffset(): { [name: string]: GlslLibRoutine } {\n    const funcName = 'coordsToOffset';\n    return {\n      coordsToOffset: new GlslLibRoutine(`\n      int ${funcName}(vec2 coords, int width, int height) {\n        float s = coords.s * float(width);\n        float t = coords.t * float(height);\n        int offset = int(t) * width + int(s);\n        return offset;\n      }\n      `),\n    };\n  }\n\n  /**\n   * Generates code for output sampler.\n   */\n\n  protected getOutputSamplingSnippet(): { [name: string]: GlslLibRoutine } {\n    const outputLayout = this.context.outputTextureLayout;\n    if (outputLayout.isPacked) {\n      return this.getPackedOutputSamplingSnippet(outputLayout);\n    } else {\n      return this.getUnpackedOutputSamplingSnippet(outputLayout);\n    }\n  }\n\n  /**\n   * Generates code for packed output sampler.\n   */\n  protected getPackedOutputSamplingSnippet(outputLayout: TextureLayout): { [name: string]: GlslLibRoutine } {\n    const outShape = outputLayout.unpackedShape;\n    const outTexShape = [outputLayout.width, outputLayout.height];\n    const result: { [name: string]: GlslLibRoutine } = {};\n    const funcName = 'getOutputCoords';\n    switch (outShape.length) {\n      case 0:\n        result[funcName] = this.getOutputScalarCoords();\n        break;\n      case 1:\n        result[funcName] = this.getOutputPacked1DCoords(outShape as [number], outTexShape as [number, number]);\n        break;\n      case 2:\n        result[funcName] = this.getOutputPacked2DCoords(outShape as [number, number], outTexShape as [number, number]);\n        break;\n      case 3:\n        result[funcName] = this.getOutputPacked3DCoords(\n          outShape as [number, number, number],\n          outTexShape as [number, number],\n        );\n        break;\n      default:\n        result[funcName] = this.getOutputPackedNDCoords(outShape, outTexShape as [number, number]);\n    }\n    const glsl = getGlsl(this.context.glContext.version);\n    // TODO we need this to properly return a packed vec4 from kernels.\n    // Replace all '{glsl.output} = result' with 'setOutput(result)' in all kernels.\n    const floatTextureSetRGBASource = `\n      void setOutput(vec4 val) {\n        ${glsl.output} = val;\n      }\n    `;\n    const floatTextureSetRGBAFuncName = 'floatTextureSetRGBA';\n    result[floatTextureSetRGBAFuncName] = new GlslLibRoutine(floatTextureSetRGBASource);\n    return result;\n  }\n\n  /**\n   * Generates code for unpacked output sampler.\n   */\n  protected getUnpackedOutputSamplingSnippet(outputLayout: TextureLayout): { [name: string]: GlslLibRoutine } {\n    const outShape = outputLayout.unpackedShape;\n    const outTexShape = [outputLayout.width, outputLayout.height];\n    const result: { [name: string]: GlslLibRoutine } = {};\n    const funcName = 'getOutputCoords';\n    switch (outShape.length) {\n      case 0:\n        result[funcName] = this.getOutputScalarCoords();\n        break;\n      case 1:\n        result[funcName] = this.getOutputUnpacked1DCoords(outShape as [number], outTexShape as [number, number]);\n        break;\n      case 2:\n        result[funcName] = this.getOutputUnpacked2DCoords(\n          outShape as [number, number],\n          outTexShape as [number, number],\n        );\n        break;\n      case 3:\n        result[funcName] = this.getOutputUnpacked3DCoords(\n          outShape as [number, number, number],\n          outTexShape as [number, number],\n        );\n        break;\n      case 4:\n        result[funcName] = this.getOutputUnpacked4DCoords(\n          outShape as [number, number, number, number],\n          outTexShape as [number, number],\n        );\n        break;\n      case 5:\n        result[funcName] = this.getOutputUnpacked5DCoords(\n          outShape as [number, number, number, number, number],\n          outTexShape as [number, number],\n        );\n        break;\n      case 6:\n        result[funcName] = this.getOutputUnpacked6DCoords(\n          outShape as [number, number, number, number, number, number],\n          outTexShape as [number, number],\n        );\n        break;\n      default:\n        throw new Error(`Unsupported output dimensionality: ${outShape.length}`);\n    }\n    const glsl = getGlsl(this.context.glContext.version);\n    // TODO we need this to properly return a packed vec4 from kernels.\n    // Replace all '{glsl.output} = result' with 'setOutput(result)' in all kernels.\n    const floatTextureSetRSource = `\n        void setOutput(float val) {\n          ${glsl.output} = vec4(val, 0, 0, 0);\n        }\n    `;\n    const floatTextureSetRFuncName = 'floatTextureSetR';\n    result[floatTextureSetRFuncName] = new GlslLibRoutine(floatTextureSetRSource);\n    return result;\n  }\n\n  /**\n   * Scalar output coordinates.\n   */\n  protected getOutputScalarCoords(): GlslLibRoutine {\n    return new GlslLibRoutine(`\n      int getOutputCoords() {\n        return 0;\n      }\n    `);\n  }\n\n  /**\n   * 1D packed output coordinates.\n   */\n  protected getOutputPacked1DCoords(_shape: [number], texShape: [number, number]): GlslLibRoutine {\n    const packedTexShape = texShape;\n    let source = '';\n    if (packedTexShape[0] === 1) {\n      source = `\n          int getOutputCoords() {\n            return 2 * int(TexCoords.y * ${packedTexShape[1]}.0);\n          }\n        `;\n      return new GlslLibRoutine(source);\n    }\n\n    if (packedTexShape[1] === 1) {\n      source = `\n          int getOutputCoords() {\n            return 2 * int(TexCoords.x * ${packedTexShape[0]}.0);\n          }\n        `;\n      return new GlslLibRoutine(source);\n    }\n\n    source = `\n        int getOutputCoords() {\n          ivec2 resTexRC = ivec2(TexCoords.xy *\n                                 vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n          return 2 * (resTexRC.y * ${packedTexShape[0]} + resTexRC.x);\n        }\n      `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * 2D packed output coordinates.\n   */\n  protected getOutputPacked2DCoords(shape: [number, number], texShape: [number, number]): GlslLibRoutine {\n    let source = '';\n    if (ArrayUtil.arraysEqual(shape, texShape)) {\n      source = `\n        ivec2 getOutputCoords() {\n          return 2 * ivec2(TexCoords.xy * vec2(${texShape[0]}, ${texShape[1]}));\n        }\n      `;\n      return new GlslLibRoutine(source);\n    }\n\n    const packedTexShape = texShape;\n    // texels needed to accommodate a logical row\n    const texelsInLogicalRow = Math.ceil(shape[1] / 2);\n\n    /**\n     * getOutputCoords\n     *\n     * resTexRC: The rows and columns of the texels. If you move over one\n     * texel to the right in the packed texture, you are moving over one column\n     * (not two).\n     *\n     * index: The texel index\n     */\n    source = `\n        ivec2 getOutputCoords() {\n          ivec2 resTexRC = ivec2(TexCoords.xy *\n                                vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n\n          int index = resTexRC.y * ${packedTexShape[0]} + resTexRC.x;\n\n          // reverse r and c order for packed texture\n          int r = imod(index, ${texelsInLogicalRow}) * 2;\n          int c = 2 * (index / ${texelsInLogicalRow});\n\n          return ivec2(r, c);\n        }\n      `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * 3D packed output coordinates.\n   */\n  protected getOutputPacked3DCoords(shape: [number, number, number], texShape: [number, number]): GlslLibRoutine {\n    const packedTexShape = [texShape[0], texShape[1]];\n    const texelsInLogicalRow = Math.ceil(shape[2] / 2);\n    const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[1] / 2);\n    const source = `\n        ivec3 getOutputCoords() {\n          ivec2 resTexRC = ivec2(TexCoords.xy *\n                                vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n          int index = resTexRC.y * ${packedTexShape[0]} + resTexRC.x;\n\n          int b = index / ${texelsInBatch};\n          index -= b * ${texelsInBatch};\n\n          // reverse r and c order for packed texture\n          int r = imod(index, ${texelsInLogicalRow}) * 2;\n          int c = 2 * (index / ${texelsInLogicalRow});\n\n          return ivec3(b, r, c);\n        }\n      `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * ND packed output coordinates.\n   */\n  protected getOutputPackedNDCoords(shape: readonly number[], texShape: [number, number]): GlslLibRoutine {\n    const packedTexShape = [texShape[0], texShape[1]];\n\n    const texelsInLogicalRow = Math.ceil(shape[shape.length - 1] / 2);\n    const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[shape.length - 2] / 2);\n    let texelsInBatchN = texelsInBatch;\n    let batches = '';\n    let coords = 'b, r, c';\n\n    for (let b = 2; b < shape.length - 1; b++) {\n      texelsInBatchN *= shape[shape.length - b - 1];\n      batches =\n        `\n      int b${b} = index / ${texelsInBatchN};\n      index -= b${b} * ${texelsInBatchN};\n    ` + batches;\n      coords = `b${b}, ` + coords;\n    }\n    const source = `\n      ivec${shape.length} getOutputCoords() {\n        ivec2 resTexRC = ivec2(TexCoords.xy *\n                              vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n        int index = resTexRC.y * ${packedTexShape[0]} + resTexRC.x;\n\n        ${batches}\n\n        int b = index / ${texelsInBatch};\n        index -= b * ${texelsInBatch};\n\n        // reverse r and c order for packed texture\n        int r = imod(index, ${texelsInLogicalRow}) * 2;\n        int c = 2 * (index / ${texelsInLogicalRow});\n\n        return ivec${shape.length}(${coords});\n      }\n    `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * Unpacked 1D output coordinates.\n   */\n  protected getOutputUnpacked1DCoords(_shape: [number], texShape: [number, number]): GlslLibRoutine {\n    const source = `\n        int getOutputCoords() {\n          ivec2 resTexRC = ivec2(TexCoords.xy *\n                                vec2(${texShape[0]}, ${texShape[1]}));\n          return resTexRC.y * ${texShape[0]} + resTexRC.x;\n        }\n      `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * Unpacked 2D output coordinates.\n   */\n  protected getOutputUnpacked2DCoords(shape: [number, number], texShape: [number, number]): GlslLibRoutine {\n    const source = `\n        ivec2 getOutputCoords() {\n          ivec2 resTexRC = ivec2(TexCoords.xy *\n                                vec2(${texShape[0]}, ${texShape[1]}));\n          int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n          int r = index / ${shape[1]};\n          int c = index - r * ${shape[1]};\n          return ivec2(r, c);\n        }\n      `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * Unpacked 3D output coordinates.\n   */\n  protected getOutputUnpacked3DCoords(shape: [number, number, number], texShape: [number, number]): GlslLibRoutine {\n    let source = '';\n    const rank = shape.length;\n\n    let strides = null;\n    if (rank < 2) {\n      strides = [];\n    }\n\n    strides = new Array(rank - 1);\n    strides[rank - 2] = shape[rank - 1];\n    for (let i = rank - 3; i >= 0; --i) {\n      strides[i] = strides[i + 1] * shape[i + 1];\n    }\n    const coordsToCompute = ['r', 'c', 'd'];\n    const coordsFromIndexSnippet = strides\n      .map((stride, i) => {\n        const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n        const line2 =\n          i === strides.length - 1\n            ? `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}`\n            : `index -= ${coordsToCompute[i]} * ${stride}`;\n        return `${line1}; ${line2};`;\n      })\n      .join('');\n\n    source = `\n        ivec3 getOutputCoords() {\n          ivec2 resTexRC = ivec2(TexCoords.xy *\n                                vec2(${texShape[0]}, ${texShape[1]}));\n          int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n          ${coordsFromIndexSnippet}\n          return ivec3(r, c, d);\n        }\n      `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * Unpacked 4D output coordinates.\n   */\n  protected getOutputUnpacked4DCoords(\n    shape: [number, number, number, number],\n    texShape: [number, number],\n  ): GlslLibRoutine {\n    let source = '';\n    const rank = shape.length;\n\n    let strides = null;\n    if (rank < 2) {\n      strides = [];\n    }\n\n    strides = new Array(rank - 1);\n    strides[rank - 2] = shape[rank - 1];\n    for (let i = rank - 3; i >= 0; --i) {\n      strides[i] = strides[i + 1] * shape[i + 1];\n    }\n    const coordsToCompute = ['r', 'c', 'd', 'd2'];\n    const coordsFromIndexSnippet = strides\n      .map((stride, i) => {\n        const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n        const line2 =\n          i === strides.length - 1\n            ? `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}`\n            : `index -= ${coordsToCompute[i]} * ${stride}`;\n        return `${line1}; ${line2};`;\n      })\n      .join('');\n\n    source = `\n      ivec4 getOutputCoords() {\n          ivec2 resTexRC = ivec2(TexCoords.xy *\n                                vec2(${texShape[0]}, ${texShape[1]}));\n          int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n          ${coordsFromIndexSnippet}\n          return ivec4(r, c, d, d2);\n        }\n      `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * Unpacked 5D output coordinates.\n   */\n  protected getOutputUnpacked5DCoords(\n    shape: [number, number, number, number, number],\n    texShape: [number, number],\n  ): GlslLibRoutine {\n    let source = '';\n    const rank = shape.length;\n\n    let strides = null;\n    if (rank < 2) {\n      strides = [];\n    }\n\n    strides = new Array(rank - 1);\n    strides[rank - 2] = shape[rank - 1];\n    for (let i = rank - 3; i >= 0; --i) {\n      strides[i] = strides[i + 1] * shape[i + 1];\n    }\n    const coordsToCompute = ['r', 'c', 'd', 'd2', 'd3'];\n    const coordsFromIndexSnippet = strides\n      .map((stride, i) => {\n        const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n        const line2 =\n          i === strides.length - 1\n            ? `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}`\n            : `index -= ${coordsToCompute[i]} * ${stride}`;\n        return `${line1}; ${line2};`;\n      })\n      .join('');\n\n    source = `\n      ivec5 getOutputCoords() {\n          ivec2 resTexRC = ivec2(TexCoords.xy *\n                                vec2(${texShape[0]}, ${texShape[1]}));\n          int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n          ${coordsFromIndexSnippet}\n          return ivec5(r, c, d, d2, d3);\n        }\n      `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * Unpacked 6D output coordinates.\n   */\n  protected getOutputUnpacked6DCoords(\n    shape: [number, number, number, number, number, number],\n    texShape: [number, number],\n  ): GlslLibRoutine {\n    let source = '';\n    const rank = shape.length;\n\n    let strides = null;\n    if (rank < 2) {\n      strides = [];\n    }\n\n    strides = new Array(rank - 1);\n    strides[rank - 2] = shape[rank - 1];\n    for (let i = rank - 3; i >= 0; --i) {\n      strides[i] = strides[i + 1] * shape[i + 1];\n    }\n    const coordsToCompute = ['r', 'c', 'd', 'd2', 'd3', 'd4'];\n    const coordsFromIndexSnippet = strides\n      .map((stride, i) => {\n        const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n        const line2 =\n          i === strides.length - 1\n            ? `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}`\n            : `index -= ${coordsToCompute[i]} * ${stride}`;\n        return `${line1}; ${line2};`;\n      })\n      .join('');\n\n    source = `\n     ivec6 getOutputCoords() {\n         ivec2 resTexRC = ivec2(TexCoords.xy *\n                               vec2(${texShape[0]}, ${texShape[1]}));\n         int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n         ${coordsFromIndexSnippet}\n         return ivec6(r, c, d, d2, d3, d4);\n       }\n     `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * Generates code for common UV coords computation utility functions.\n   */\n  protected getCommonUtilFuncs(): { [name: string]: GlslLibRoutine } {\n    const result: { [name: string]: GlslLibRoutine } = {};\n    let funcName = 'uvFromFlat';\n    result[funcName] = new GlslLibRoutine(`\n    vec2 uvFromFlat(int texNumR, int texNumC, int index) {\n      int texC = index / texNumR;\n      int texR = index - texC * texNumR;\n      // TODO: swap texR, texC order in following function so row is corresponding to u and column is corresponding to\n      //       v.\n      return (vec2(texR, texC) + halfCR) / vec2(texNumR, texNumC);\n    }\n    `);\n    funcName = 'packedUVfrom1D';\n    result[funcName] = new GlslLibRoutine(`\n      vec2 packedUVfrom1D(int texNumR, int texNumC, int index) {\n        int texelIndex = index / 2;\n        int texR = texelIndex / texNumC;\n        int texC = texelIndex - texR * texNumC;\n        return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n      }\n      `);\n    funcName = 'packedUVfrom2D';\n    result[funcName] = new GlslLibRoutine(`\n      vec2 packedUVfrom2D(int texNumR, int texNumC, int texelsInLogicalRow, int row, int col) {\n        int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2);\n        int texR = texelIndex / texNumC;\n        int texC = texelIndex - texR * texNumC;\n        return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n      }\n      `);\n    funcName = 'packedUVfrom3D';\n    result[funcName] = new GlslLibRoutine(`\n      vec2 packedUVfrom3D(int texNumR, int texNumC,\n          int texelsInBatch, int texelsInLogicalRow, int b,\n          int row, int col) {\n        int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2);\n        int texR = index / texNumC;\n        int texC = index - texR * texNumC;\n        return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n      }\n      `);\n    funcName = 'sampleTexture';\n    const glsl = getGlsl(this.context.glContext.version);\n    result[funcName] = new GlslLibRoutine(`\n        float sampleTexture(sampler2D textureSampler, vec2 uv) {\n            return ${glsl.texture2D}(textureSampler, uv).r;\n        }`);\n    return result;\n  }\n\n  /**\n   * Constructing snippets for inputs\n   */\n  protected getInputsSamplingSnippets(): { [name: string]: GlslLibRoutine } {\n    const result: { [name: string]: GlslLibRoutine } = {};\n    const outputLayout = this.context.outputTextureLayout;\n    this.context.programInfo.inputNames.forEach((samplerName, i) => {\n      const inputLayout = this.context.inputTextureLayouts[i];\n      const funcName = generateShaderFuncNameFromInputSamplerName(samplerName);\n      if (inputLayout.isPacked) {\n        result[funcName] = this.getPackedSamplerFromInput(funcName, samplerName, inputLayout);\n      } else {\n        result[funcName] = this.getUnpackedSamplerFromInput(funcName, samplerName, inputLayout);\n      }\n\n      const outCoordFuncName = generateShaderFuncNameFromInputSamplerNameAtOutCoords(samplerName);\n      if (inputLayout.unpackedShape.length <= outputLayout.unpackedShape.length) {\n        if (inputLayout.isPacked) {\n          result[outCoordFuncName] = this.getPackedSamplerAtOutputCoords(\n            outCoordFuncName,\n            inputLayout,\n            outputLayout,\n            samplerName,\n          );\n        } else {\n          result[outCoordFuncName] = this.getUnpackedSamplerAtOutputCoords(\n            outCoordFuncName,\n            inputLayout,\n            outputLayout,\n            samplerName,\n          );\n        }\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * Constructing snippets for output coordinates of samplers\n   */\n  protected getPackedSamplerAtOutputCoords(\n    funcName: string,\n    inputLayout: TextureLayout,\n    outputLayout: TextureLayout,\n    name: string,\n  ): GlslLibRoutine {\n    const inShape = inputLayout.unpackedShape;\n    const outShape = outputLayout.unpackedShape;\n    const texName = name;\n    const texFuncSnippet = generateShaderFuncNameFromInputSamplerName(texName);\n\n    const inRank = inShape.length;\n    const outRank = outShape.length;\n\n    const broadcastDims = BroadcastUtil.getBroadcastDims(inShape, outShape);\n\n    const type = getCoordsDataType(outRank);\n    const rankDiff = outRank - inRank;\n    let coordsSnippet: string;\n    const fields = getGlChannels();\n\n    if (inRank === 0) {\n      coordsSnippet = '';\n    } else if (outRank < 2 && broadcastDims.length >= 1) {\n      coordsSnippet = 'coords = 0;';\n    } else {\n      coordsSnippet = broadcastDims.map((d) => `coords.${fields[d + rankDiff]} = 0;`).join('\\n');\n    }\n    let unpackedCoordsSnippet = '';\n    if (outRank < 2 && inRank > 0) {\n      unpackedCoordsSnippet = 'coords';\n    } else {\n      unpackedCoordsSnippet = inShape.map((_s, i) => `coords.${fields[i + rankDiff]}`).join(', ');\n    }\n\n    let output = 'return outputValue;';\n    const inSize = ShapeUtil.size(inShape);\n    const isInputScalar = inSize === 1;\n    const outSize = ShapeUtil.size(outShape);\n    const isOutputScalar = outSize === 1;\n\n    if (inRank === 1 && !isInputScalar && !isOutputScalar) {\n      output = `\n        return vec4(outputValue.xy, outputValue.xy);\n      `;\n    } else if (isInputScalar && !isOutputScalar) {\n      if (outRank === 1) {\n        output = `\n          return vec4(outputValue.x, outputValue.x, 0., 0.);\n        `;\n      } else {\n        output = `\n          return vec4(outputValue.x);\n        `;\n      }\n    } else if (broadcastDims.length) {\n      const rows = inRank - 2;\n      const cols = inRank - 1;\n\n      if (broadcastDims.indexOf(rows) > -1 && broadcastDims.indexOf(cols) > -1) {\n        output = 'return vec4(outputValue.x);';\n      } else if (broadcastDims.indexOf(rows) > -1) {\n        output = 'return vec4(outputValue.x, outputValue.y, ' + 'outputValue.x, outputValue.y);';\n      } else if (broadcastDims.indexOf(cols) > -1) {\n        output = 'return vec4(outputValue.xx, outputValue.zz);';\n      }\n    }\n\n    const swapLastDimsSnippet = `\n        int lastDim = coords.${fields[outRank - 1]};\n        coords.${fields[outRank - 1]} = coords.${fields[outRank - 2]};\n        coords.${fields[outRank - 2]} = lastDim;\n      `;\n    const source = `\n      vec4 ${funcName}() {\n        ${type} coords = getOutputCoords();\n        ${swapLastDimsSnippet}\n        ${coordsSnippet}\n        vec4 outputValue = ${texFuncSnippet}(${unpackedCoordsSnippet});\n        ${output}\n      }\n    `;\n    return new GlslLibRoutine(source, ['coordinates.getOutputCoords']);\n  }\n\n  /**\n   * Constructing snippets for unpacked output coordinates of samplers\n   */\n  protected getUnpackedSamplerAtOutputCoords(\n    funcName: string,\n    inputLayout: TextureLayout,\n    outputLayout: TextureLayout,\n    name: string,\n  ): GlslLibRoutine {\n    const outTexShape = [outputLayout.width, outputLayout.height];\n    const inTexShape = [inputLayout.width, inputLayout.height];\n    const inRank = inputLayout.unpackedShape.length;\n    const outRank = outputLayout.unpackedShape.length;\n    const inShape = inputLayout.unpackedShape;\n    const outShape = outputLayout.unpackedShape;\n    const texFuncSnippet = generateShaderFuncNameFromInputSamplerName(name);\n\n    if (inRank === outRank && ArrayUtil.arraysEqual(inTexShape, outTexShape)) {\n      const source = `\n          float ${funcName}() {\n            return sampleTexture(${name}, TexCoords);\n          }\n        `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n    }\n\n    const type = getCoordsDataType(outRank);\n    const broadcastDims = BroadcastUtil.getBroadcastDims(inShape, outShape);\n    const rankDiff = outRank - inRank;\n    let coordsSnippet: string;\n    const fields = getGlChannels();\n\n    if (inRank === 0) {\n      coordsSnippet = '';\n    } else if (outRank < 2 && broadcastDims.length >= 1) {\n      coordsSnippet = 'coords = 0;';\n    } else {\n      coordsSnippet = broadcastDims.map((d) => `coords.${fields[d + rankDiff]} = 0;`).join('\\n');\n    }\n    let unpackedCoordsSnippet = '';\n    if (outRank < 2 && inRank > 0) {\n      unpackedCoordsSnippet = 'coords';\n    } else {\n      unpackedCoordsSnippet = inputLayout.unpackedShape.map((_s, i) => `coords.${fields[i + rankDiff]}`).join(', ');\n    }\n    const source = `\n        float ${funcName}() {\n          ${type} coords = getOutputCoords();\n          ${coordsSnippet}\n          return ${texFuncSnippet}(${unpackedCoordsSnippet});\n        }\n      `;\n    return new GlslLibRoutine(source, ['coordinates.getOutputCoords']);\n  }\n\n  /**\n   * Constructing snippets for packed operations.\n   */\n  protected getPackedSamplerFromInput(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    switch (inputLayout.unpackedShape.length) {\n      case 0:\n        return this.getPackedSamplerScalar(funcName, name);\n      case 1:\n        return this.getPackedSampler1D(funcName, name, inputLayout);\n      case 2:\n        return this.getPackedSampler2D(funcName, name, inputLayout);\n      case 3:\n        return this.getPackedSampler3D(funcName, name, inputLayout);\n      default:\n        return this.getPackedSamplerND(funcName, name, inputLayout);\n    }\n  }\n\n  /**\n   * Constructing snippets for unpacked operations.\n   */\n  protected getUnpackedSamplerFromInput(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const shape = inputLayout.unpackedShape;\n    switch (shape.length) {\n      case 0:\n        return this.getUnpackedSamplerScalar(funcName, name, inputLayout);\n      case 1:\n        return this.getUnpackedSampler1D(funcName, name, inputLayout);\n      case 2:\n        return this.getUnpackedSampler2D(funcName, name, inputLayout);\n      case 3:\n        return this.getUnpackedSampler3D(funcName, name, inputLayout);\n      case 4:\n        return this.getUnpackedSampler4D(funcName, name, inputLayout);\n      case 5:\n        return this.getUnpackedSampler5D(funcName, name, inputLayout);\n      case 6:\n        return this.getUnpackedSampler6D(funcName, name, inputLayout);\n      default:\n        // TODO support more dimensionalities\n        throw new Error(`Unsupported dimension ${shape.length}-D`);\n    }\n  }\n\n  /**\n   * Packed scalar snippet.\n   */\n  protected getPackedSamplerScalar(funcName: string, name: string): GlslLibRoutine {\n    const glsl = getGlsl(this.context.glContext.version);\n    const source = `\n          vec4 ${funcName}() {\n            return ${glsl.texture2D}(${name}, halfCR);\n          }\n        `;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * Packed 1D snippet.\n   */\n  protected getPackedSampler1D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const texShape = [inputLayout.width, inputLayout.height];\n    const packedTexShape = [texShape[1], texShape[0]];\n    const glsl = getGlsl(this.context.glContext.version);\n\n    const packedSampler = `vec4 ${funcName}(int index) {\n      vec2 uv = packedUVfrom1D(\n      ${packedTexShape[0]}, ${packedTexShape[1]}, index);\n      return ${glsl.texture2D}(${name}, uv);\n    }`;\n    const source = packedSampler;\n    return new GlslLibRoutine(source, ['coordinates.packedUVfrom1D']);\n  }\n\n  /**\n   * Packed 2D snippet.\n   */\n  protected getPackedSampler2D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const shape = inputLayout.unpackedShape;\n    const texShape = [inputLayout.width, inputLayout.height];\n    const glsl = getGlsl(this.context.glContext.version);\n    const texNumR = texShape[0];\n    const texNumC = texShape[1];\n\n    if (texShape != null && ArrayUtil.arraysEqual(shape, texShape)) {\n      const packedSampler = `vec4 ${funcName}(int row, int col) {\n        vec2 uv = (vec2(col, row) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0);\n        return ${glsl.texture2D}(${name}, uv);\n      }`;\n\n      return new GlslLibRoutine(packedSampler);\n    }\n    const packedTexShape = texShape;\n    const valuesPerRow = Math.ceil(shape[1] / 2);\n    const packedSampler = `vec4 ${funcName}(int row, int col) {\n      vec2 uv = packedUVfrom2D(${packedTexShape[1]}, ${packedTexShape[0]}, ${valuesPerRow}, row, col);\n      return ${glsl.texture2D}(${name}, uv);\n    }`;\n    const source = packedSampler;\n    return new GlslLibRoutine(source, ['coordinates.packedUVfrom2D']);\n  }\n\n  /**\n   * Packed 3D snippet.\n   */\n  protected getPackedSampler3D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const shape = inputLayout.unpackedShape;\n    const texShape = [inputLayout.width, inputLayout.height];\n    const packedTexShape = [texShape[0], texShape[1]];\n    const glsl = getGlsl(this.context.glContext.version);\n\n    if (shape[0] === 1) {\n      const squeezedShape = shape.slice(1);\n      const keptDims = [1, 2];\n      const newInputShape = squeezeInputShape(shape, squeezedShape);\n      const params = ['b', 'row', 'col'];\n      // Deep copy of input texture layout.\n      const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n      newInputLayout.unpackedShape = newInputShape;\n      const samplerRoutine = this.getPackedSamplerFromInput(funcName, name, newInputLayout);\n      const packedSampler = `${samplerRoutine.routineBody}\n      vec4 ${funcName}(int b, int row, int col) {\n        return ${funcName}(${getSqueezedParams(params, keptDims)});\n      } `;\n      const source = packedSampler;\n      return new GlslLibRoutine(source, samplerRoutine.dependencies);\n    }\n    const texNumR = packedTexShape[0];\n    const texNumC = packedTexShape[1];\n\n    const valuesPerRow = Math.ceil(shape[2] / 2);\n    const texelsInBatch = valuesPerRow * Math.ceil(shape[1] / 2);\n\n    const packedSampler = `vec4 ${funcName}(int b, int row, int col) {\n      vec2 uv = packedUVfrom3D(\n        ${texNumC}, ${texNumR}, ${texelsInBatch}, ${valuesPerRow}, b, row, col);\n      return ${glsl.texture2D}(${name}, uv);}`;\n    const source = packedSampler;\n    return new GlslLibRoutine(source, ['coordinates.packedUVfrom3D']);\n  }\n  /*\n   * Packed ND snippet.\n   */\n  protected getPackedSamplerND(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const shape = inputLayout.unpackedShape;\n    const rank = shape.length;\n    const texShape = [inputLayout.width, inputLayout.height];\n    const glsl = getGlsl(this.context.glContext.version);\n\n    const packedTexShape = [texShape[0], texShape[1]];\n    const texNumR = packedTexShape[1];\n    const texNumC = packedTexShape[0];\n    const valuesPerRow = Math.ceil(shape[rank - 1] / 2);\n    let texelsInBatch = valuesPerRow * Math.ceil(shape[rank - 2] / 2);\n    let params = 'int b, int row, int col';\n    let index = `b * ${texelsInBatch} + (row / 2) * ${valuesPerRow} + (col / 2)`;\n    for (let b = 2; b < rank - 1; b++) {\n      params = `int b${b}, ` + params;\n      texelsInBatch *= shape[rank - b - 1];\n      index = `b${b} * ${texelsInBatch} + ` + index;\n    }\n    const packedSampler = `vec4 ${funcName}(${params}) {\n      int index = ${index};\n      int texR = index / ${texNumC};\n      int texC = index - texR * ${texNumC};\n      vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texNumC}, ${texNumR});\n      return ${glsl.texture2D}(${name}, uv);\n    }`;\n    const source = packedSampler;\n    return new GlslLibRoutine(source);\n  }\n\n  /**\n   * Unpacked scalar snippet.\n   */\n  protected getUnpackedSamplerScalar(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const [texNumR, texNumC] = [inputLayout.width, inputLayout.height];\n    if (texNumR === 1 && texNumC === 1) {\n      const source = `\n          float ${funcName}() {\n            return sampleTexture(${name}, halfCR);\n          }\n        `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n    }\n\n    const source = `\n        float ${funcName}() {\n          int offset_${name} = coordsToOffset(TexCoords, ${texNumR}, ${texNumC});\n          vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, offset_${name});\n          return sampleTexture(${name}, uv);\n        }\n      `;\n    return new GlslLibRoutine(source, [\n      'coordinates.uvFromFlat',\n      'coordinates.sampleTexture',\n      'coordinates.coordsToOffset',\n    ]);\n  }\n\n  /**\n   * Unpacked 1D snippet.\n   */\n  protected getUnpackedSampler1D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const tNumR = inputLayout.width;\n    const tNumC = inputLayout.height;\n\n    if (tNumC === 1 && tNumR === 1) {\n      const source = `\n        float ${funcName}(int index) {\n          return sampleTexture(${name}, halfCR);\n        }\n      `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n    }\n\n    if (tNumC === 1) {\n      const source = `\n          float ${funcName}(int index) {\n            vec2 uv = vec2((float(index) + 0.5) / ${tNumR}.0, 0.5);\n            return sampleTexture(${name}, uv);\n          }\n        `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n    }\n    if (tNumR === 1) {\n      const source = `\n          float ${funcName}(int index) {\n            vec2 uv = vec2(0.5, (float(index) + 0.5) / ${tNumC}.0);\n            return sampleTexture(${name}, uv);\n          }\n        `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n    }\n    const source = `\n        float ${funcName}(int index) {\n          vec2 uv = uvFromFlat(${tNumR}, ${tNumC}, index);\n          return sampleTexture(${name}, uv);\n        }\n      `;\n    return new GlslLibRoutine(source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture']);\n  }\n\n  /**\n   * Unpacked 2D snippet.\n   */\n\n  protected getUnpackedSampler2D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const shape = inputLayout.unpackedShape;\n\n    // TODO: modify row/col order for other dimensions.\n    const texShape = [inputLayout.height, inputLayout.width];\n\n    if (texShape != null && ArrayUtil.arraysEqual(shape, texShape)) {\n      const texNumR = texShape[1];\n      const texNumC = texShape[0];\n      const source = `\n          float ${funcName}(int row, int col) {\n            vec2 uv = (vec2(row, col) + halfCR) / vec2(${texNumR}.0, ${texNumC}.0);\n            return sampleTexture(${name}, uv);\n          }\n        `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n    }\n\n    const { newShape, keptDims } = squeezeShape(shape as number[]);\n    const squeezedShape = newShape;\n    if (squeezedShape.length < shape.length) {\n      const newInputShape = squeezeInputShape(shape, squeezedShape);\n      // Deep copy of input texture layout.\n      const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n      newInputLayout.unpackedShape = newInputShape;\n\n      const params = ['col', 'row'];\n      const source = `\n          ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n          float ${funcName}(int row, int col) {\n            return ${funcName}(${getSqueezedParams(params, keptDims)});\n          }\n        `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n    }\n\n    const texNumR = texShape[1];\n    const texNumC = texShape[0];\n    if (texNumC === 1) {\n      const source = `\n          float ${funcName}(int row, int col) {\n            int offset_${name} = coordsToOffset(TexCoords, ${texNumR}, ${texNumC});\n            float index = dot(vec3(row, col, offset_${name}), vec3(${shape[1]}, 1, 1));\n            vec2 uv = vec2(0.5, (index + 0.5) / ${texNumR}.0);\n            return sampleTexture(${name}, uv);\n          }\n        `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n    }\n\n    if (texNumR === 1) {\n      const source = `\n          float ${funcName}(int row, int col) {\n            int offset_${name} = coordsToOffset(TexCoords, ${texNumR}, ${texNumC});\n            float index = dot(vec3(row, col, offset_${name}), vec3(${shape[1]}, 1, 1));\n            vec2 uv = vec2((index + 0.5) / ${texNumC}.0, 0.5);\n            return sampleTexture(${name}, uv);\n          }\n        `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n    }\n\n    const source = `\n        float ${funcName}(int row, int col) {\n          int index = col * ${shape[1]} + row;\n          vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n          return sampleTexture(${name}, uv);\n        }\n      `;\n    return new GlslLibRoutine(source, [\n      'coordinates.uvFromFlat',\n      'coordinates.sampleTexture',\n      'coordinates.coordsToOffset',\n    ]);\n  }\n\n  /**\n   * Unpacked 3D snippet.\n   */\n\n  protected getUnpackedSampler3D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const shape = inputLayout.unpackedShape;\n    const stride0 = shape[1] * shape[2];\n    const stride1 = shape[2];\n\n    const { newShape, keptDims } = squeezeShape(shape as number[]);\n    const squeezedShape = newShape;\n    if (squeezedShape.length < shape.length) {\n      const newInputShape = squeezeInputShape(shape, squeezedShape);\n      const params = ['batch', 'col', 'row'];\n      // Deep copy of input texture layout.\n      const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n      newInputLayout.unpackedShape = newInputShape;\n      const routine = this.getUnpackedSamplerFromInput(funcName, name, newInputLayout);\n      // TODO: revisit the logic here to make it simpler\n      const revDims = keptDims.reverse();\n      const source = `\n          ${routine.routineBody}\n          float ${funcName}(int batch, int row, int col) {\n            return ${funcName}(${getSqueezedParams(params, revDims)});\n          }\n        `;\n      return new GlslLibRoutine(source, routine.dependencies);\n    }\n\n    const texNumR = inputLayout.width;\n    const texNumC = inputLayout.height;\n    const source = `\n          float ${funcName}(int depth, int row, int col) {\n            // Explicitly use integer operations as dot() only works on floats.\n            int index = depth * ${stride0} + col * ${stride1} + row;\n            vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n            return sampleTexture(${name}, uv);\n          }\n      `;\n    return new GlslLibRoutine(source, [\n      'coordinates.uvFromFlat',\n      'coordinates.sampleTexture',\n      'coordinates.coordsToOffset',\n    ]);\n  }\n\n  /**\n   * Unpacked 4D snippet.\n   */\n\n  protected getUnpackedSampler4D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const shape = inputLayout.unpackedShape;\n    const stride2 = shape[3];\n    const stride1 = shape[2] * stride2;\n    const stride0 = shape[1] * stride1;\n\n    //\n    // TODO: re-enable this shortcut once the index calculation bug is fixed.\n    //\n    // const {newShape, keptDims} = squeezeShape(shape as number[]);\n    // if (newShape.length < shape.length) {\n    //   const newInputShape = squeezeInputShape(shape, newShape);\n    //   const params = ['row', 'col', 'depth', 'depth2'];\n    //   // Deep copy of input texture layout.\n    //   const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n    //   newInputLayout.unpackedShape = newInputShape;\n    //   const source = `\n    //       ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n    //       float ${funcName}(int row, int col, int depth, int depth2) {\n    //         return ${funcName}(${getSqueezedParams(params, keptDims)});\n    //       }\n    //     `;\n    //   return new GlslLibRoutine(\n    //       source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n    // }\n\n    const texNumR = inputLayout.width;\n    const texNumC = inputLayout.height;\n    const source = `\n        float ${funcName}(int row, int col, int depth, int depth2) {\n          int index = row * ${stride0} + col * ${stride1} +\n              depth2 * ${stride2} + depth;\n          vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n          return sampleTexture(${name}, uv);\n        }\n      `;\n    return new GlslLibRoutine(source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture']);\n  }\n\n  /**\n   * Unpacked 5D snippet.\n   */\n  protected getUnpackedSampler5D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const shape = inputLayout.unpackedShape;\n    const stride3 = shape[4];\n    const stride2 = shape[3] * stride3;\n    const stride1 = shape[2] * stride2;\n    const stride0 = shape[1] * stride1;\n\n    const { newShape, keptDims } = squeezeShape(shape as number[]);\n    if (newShape.length < shape.length) {\n      const newInputShape = squeezeInputShape(shape, newShape);\n      const params = ['row', 'col', 'depth', 'depth2', 'depth3'];\n      // Deep copy of input texture layout.\n      const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n      newInputLayout.unpackedShape = newInputShape;\n\n      const source = `\n          ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n          float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n            return ${funcName}(${getSqueezedParams(params, keptDims)});\n          }\n        `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.uvFromFlat']);\n    }\n\n    const texNumR = inputLayout.width;\n    const texNumC = inputLayout.height;\n    const source = `\n        float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n          int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n          depth3 * ${stride3} + depth2;\n          vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n          return sampleTexture(${name}, uv);\n        }\n      `;\n    return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.uvFromFlat']);\n  }\n\n  /**\n   * Unpacked 6D snippet.\n   */\n  protected getUnpackedSampler6D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n    const shape = inputLayout.unpackedShape;\n    const stride4 = shape[5];\n    const stride3 = shape[4] * stride4;\n    const stride2 = shape[3] * stride3;\n    const stride1 = shape[2] * stride2;\n    const stride0 = shape[1] * stride1;\n\n    const { newShape, keptDims } = squeezeShape(shape as number[]);\n    if (newShape.length < shape.length) {\n      const newInputShape = squeezeInputShape(shape, newShape);\n      const params = ['row', 'col', 'depth', 'depth2', 'depth3', 'depth4'];\n      // Deep copy of input texture layout.\n      const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n      newInputLayout.unpackedShape = newInputShape;\n\n      const source = `\n            ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n            float ${funcName}(int row, int col, int depth,\n              int depth2, int depth3, int depth4) {\n              return ${funcName}(${getSqueezedParams(params, keptDims)});\n            }\n          `;\n      return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.uvFromFlat']);\n    }\n\n    const texNumR = inputLayout.width;\n    const texNumC = inputLayout.height;\n    const source = `\n          float ${funcName}(int row, int col, int depth,\n            int depth2, int depth3, int depth4) {\n            int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n            depth2 * ${stride3} + depth3 * ${stride4} + depth4;\n            vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n            return sampleTexture(${name}, uv);\n          }\n        `;\n    return new GlslLibRoutine(source, [\n      'coordinates.uvFromFlat',\n      'coordinates.sampleTexture',\n      'coordinates.coordsToOffset',\n    ]);\n  }\n\n  /**\n   * This is the main function to map from the given texture coordinates (s,t)\n   * to logical indices for the output\n   * There will only be one single variation of this\n   * Also see coordsToOffset and offsetToIndices for input-specific versions\n   */\n  protected toVec(): { [name: string]: GlslLibRoutine } {\n    const output = this.context.outputTextureLayout;\n    const rank = output.shape.length;\n    const strides = output.strides;\n    const xScale = output.width;\n    const yScale = output.height;\n\n    const stridesBlock = [];\n    for (let i = 0; i < rank - 1; ++i) {\n      stridesBlock.push(`\n        c[${i}] = offset / ${strides[i]};`);\n      stridesBlock.push(`\n        offset -= c[${i}] * ${strides[i]};`);\n    }\n    stridesBlock.push(`\n        c[${rank - 1}] = offset;`);\n    const body = `\n      void toVec(vec2 texCoords, out int c[${rank}]) {\n        int offset = coordsToOffset(texCoords, ${xScale}, ${yScale});\n        ${stridesBlock.join('')}\n      }\n      void toVec(int offset, out int c[${rank}]) {\n        ${stridesBlock.join('')}\n      }\n    `;\n    return { toVec: new GlslLibRoutine(body, ['coordinates.coordsToOffset']) };\n  }\n  /**\n   * These are value getter functions generated for each input\n   * Each function is hardwired to the name and dimensions of the input\n   * An '_T' variation is also produced which accesses values as if the\n   * input was transposed\n   */\n  protected valueFrom(): { [name: string]: GlslLibRoutine } {\n    const result: { [name: string]: GlslLibRoutine } = {};\n    this.context.programInfo.inputNames.forEach((name, i) => {\n      const layout = this.context.inputTextureLayouts[i];\n      const shape = layout.unpackedShape.length > 0 ? layout.unpackedShape : layout.shape;\n      const rank = shape.length;\n      let funcName = `_${name}`;\n      result[funcName] = new GlslLibRoutine(this.getValueFromSingle(name, rank, layout.width, layout.height, false), [\n        `shapeUtils.indicesToOffset${funcName}`,\n        'coordinates.offsetToCoords',\n        'fragcolor.getColorAsFloat',\n      ]);\n      funcName = funcName + '_T';\n      result[funcName] = new GlslLibRoutine(this.getValueFromSingle(name, rank, layout.width, layout.height, true), [\n        `shapeUtils.indicesToOffset${funcName}`,\n        'coordinates.offsetToCoords',\n        'fragcolor.getColorAsFloat',\n      ]);\n    });\n    return result;\n  }\n  /**\n   * Produces one value getter function for the name and rank given\n   * If a transpose is set proper offsetToCoords mapping will be used\n   * @param name name of the function\n   * @param rank rank of the input\n   * @param transpose whether or not should generate a transpose variation\n   */\n  protected getValueFromSingle(\n    varName: string,\n    rank: number,\n    width: number,\n    height: number,\n    transpose: boolean,\n  ): string {\n    let name = `_${varName}`;\n    if (transpose) {\n      name = name + '_T';\n    }\n    const glsl = getGlsl(this.context.glContext.version);\n    return `\n        float ${name}(int m[${rank}]) {\n          int offset = indicesToOffset${name}(m);\n          vec2 coords = offsetToCoords(offset, ${width}, ${height});\n          float value = getColorAsFloat(${glsl.texture2D}(${varName}, coords));\n          return value;\n        }\n        `;\n  }\n\n  /**\n   * Produces a packed value getter function for the name and rank given\n   * If a transpose is set proper offsetToCoords mapping will be used\n   * @param name name of the function\n   * @param rank rank of the input\n   * @param transpose whether or not should generate a transpose variation\n   */\n  protected getPackedValueFrom(\n    varName: string,\n    rank: number,\n    width: number,\n    height: number,\n    transpose: boolean,\n  ): string {\n    let name = `_${varName}_Pack`;\n    if (transpose) {\n      name = name + '_T';\n    }\n    const glsl = getGlsl(this.context.glContext.version);\n    return `\n        vec4 ${name}(int m[${rank}]) {\n          int offset = indicesToOffset_${varName}(m);\n          vec2 coords = offsetToCoords(offset, ${width}, ${height});\n          return ${glsl.texture2D}(${varName}, coords);\n        }\n        `;\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { GlslContext, GlslLib, GlslLibRoutine } from './glsl-definitions';\n\n/**\n * This GLSL library handles routines converting\n * float32 to/from Unsigned byte or float 16\n */\nexport class EncodingGlslLib extends GlslLib {\n  constructor(context: GlslContext) {\n    super(context);\n  }\n  getFunctions(): { [name: string]: GlslLibRoutine } {\n    return { ...this.encodeFloat32(), ...this.decodeFloat32() };\n  }\n  getCustomTypes(): { [name: string]: string } {\n    return {};\n  }\n  protected encodeFloat32(): { [name: string]: GlslLibRoutine } {\n    return {\n      encode: new GlslLibRoutine(`highp vec4 encode(highp float f) {\n        return vec4(f, 0.0, 0.0, 0.0);\n      }\n        `),\n    };\n  }\n  protected decodeFloat32(): { [name: string]: GlslLibRoutine } {\n    return {\n      decode: new GlslLibRoutine(`highp float decode(highp vec4 rgba) {\n        return rgba.r;\n      }\n        `),\n    };\n  }\n  /**\n   * returns the routine to encode encode a 32bit float to a vec4 (of unsigned bytes)\n   * @credit: https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float\n   */\n  protected encodeUint8(): { [name: string]: GlslLibRoutine } {\n    const endianness = EncodingGlslLib.isLittleEndian() ? 'rgba.rgba=rgba.abgr;' : '';\n    return {\n      encode: new GlslLibRoutine(`\n      highp vec4 encode(highp float f) {\n        highp float F = abs(f);\n        highp float Sign = step(0.0,-f);\n        highp float Exponent = floor(log2(F));\n        highp float Mantissa = (exp2(- Exponent) * F);\n        Exponent = floor(log2(F) + 127.0) + floor(log2(Mantissa));\n        highp vec4 rgba;\n        rgba[0] = 128.0 * Sign  + floor(Exponent*exp2(-1.0));\n        rgba[1] = 128.0 * mod(Exponent,2.0) + mod(floor(Mantissa*128.0),128.0);\n        rgba[2] = floor(mod(floor(Mantissa*exp2(23.0 -8.0)),exp2(8.0)));\n        rgba[3] = floor(exp2(23.0)*mod(Mantissa,exp2(-15.0)));\n        ${endianness}\n        rgba = rgba / 255.0; // values need to be normalized to [0,1]\n        return rgba;\n    }\n        `),\n    };\n  }\n  /**\n   * returns the routine to encode a vec4 of unsigned bytes to float32\n   * @credit: https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float\n   */\n  protected decodeUint8(): { [name: string]: GlslLibRoutine } {\n    const endianness = EncodingGlslLib.isLittleEndian() ? 'rgba.rgba=rgba.abgr;' : '';\n    return {\n      decode: new GlslLibRoutine(`\n        highp float decode(highp vec4 rgba) {\n          rgba = rgba * 255.0; // values need to be de-normalized from [0,1] to [0,255]\n          ${endianness}\n          highp float Sign = 1.0 - step(128.0,rgba[0])*2.0;\n          highp float Exponent = 2.0 * mod(rgba[0],128.0) + step(128.0,rgba[1]) - 127.0;\n          highp float Mantissa = mod(rgba[1],128.0)*65536.0 + rgba[2]*256.0 +rgba[3] + float(0x800000);\n          highp float Result =  Sign * exp2(Exponent) * (Mantissa * exp2(-23.0 ));\n          return Result;\n      }\n        `),\n    };\n  }\n  /**\n   * Determines if the machine is little endian or not\n   * @credit: https://gist.github.com/TooTallNate/4750953\n   */\n  static isLittleEndian(): boolean {\n    const b = new ArrayBuffer(4);\n    const a = new Uint32Array(b);\n    const c = new Uint8Array(b);\n    a[0] = 0xdeadbeef;\n    if (c[0] === 0xef) {\n      return true;\n    }\n    if (c[0] === 0xde) {\n      return false;\n    }\n    throw new Error('unknown endianness');\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { GlslContext, GlslLib, GlslLibRoutine } from './glsl-definitions';\nimport { getGlsl } from './glsl-source';\n\n/**\n * This GLSL library handles routines around reading a texlet and writing to it\n * Reading and writing could be more than just dealing with one channel\n * It may require encoding/decoding to/from 4 channels into one\n */\nexport class FragColorGlslLib extends GlslLib {\n  constructor(context: GlslContext) {\n    super(context);\n  }\n  getFunctions(): { [name: string]: GlslLibRoutine } {\n    return { ...this.setFragColor(), ...this.getColorAsFloat() };\n  }\n  getCustomTypes(): { [name: string]: string } {\n    return {};\n  }\n  protected setFragColor(): { [name: string]: GlslLibRoutine } {\n    const glsl = getGlsl(this.context.glContext.version);\n    return {\n      setFragColor: new GlslLibRoutine(\n        `\n        void setFragColor(float value) {\n            ${glsl.output} = encode(value);\n        }\n        `,\n        ['encoding.encode'],\n      ),\n    };\n  }\n  protected getColorAsFloat(): { [name: string]: GlslLibRoutine } {\n    return {\n      getColorAsFloat: new GlslLibRoutine(\n        `\n        float getColorAsFloat(vec4 color) {\n            return decode(color);\n        }\n        `,\n        ['encoding.decode'],\n      ),\n    };\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { GlslContext, GlslLib, GlslLibRoutine } from './glsl-definitions';\n\n/**\n * GLSL Library responsible for data types and routines for manipulating\n * coordinates and mapping to/from tensor indices\n */\nexport class ShapeUtilsGlslLib extends GlslLib {\n  constructor(context: GlslContext) {\n    super(context);\n  }\n  getFunctions(): { [name: string]: GlslLibRoutine } {\n    return {\n      ...this.bcastIndex(),\n      ...this.bcastMatmulIndex(),\n      ...this.offsetToIndices(),\n      ...this.indicesToOffset(),\n      ...this.incrementIndices(),\n    };\n  }\n  getCustomTypes() {\n    return {};\n  }\n  protected bcastIndex(): { [name: string]: GlslLibRoutine } {\n    const outputRank = this.context.outputTextureLayout.shape.length;\n    const result: { [name: string]: GlslLibRoutine } = {};\n    this.context.programInfo.inputNames.forEach((name, i) => {\n      const shape = this.context.inputTextureLayouts[i].unpackedShape;\n      if (shape.length <= outputRank) {\n        const rank = shape.length;\n        const dimOffset = outputRank - rank;\n        const funcName = `bcastIndices_${name}`;\n        let block = '';\n        for (let i = 0; i < rank; ++i) {\n          block += `\n          realIndices[${i}] = int( mod(float(bcastedIndices[${dimOffset + i}]), ${shape[i]}.0) );\n          `;\n        }\n        const body = `\n        void ${funcName} (int bcastedIndices[${outputRank}], out int realIndices[${rank}]) {\n          ${block}\n        }\n        `;\n        result[funcName] = new GlslLibRoutine(body);\n      }\n    });\n    return result;\n  }\n  protected bcastMatmulIndex(): { [name: string]: GlslLibRoutine } {\n    const outputRank = this.context.outputTextureLayout.shape.length;\n    const result: { [name: string]: GlslLibRoutine } = {};\n    this.context.programInfo.inputNames.forEach((name, i) => {\n      const shape = this.context.inputTextureLayouts[i].shape;\n      if (!(shape.length < 2 || shape.length > outputRank)) {\n        const rank = shape.length;\n        const dimOffset = outputRank - rank;\n        const funcName = `bcastMatmulIndices_${name}`;\n        let block = '';\n        for (let i = 0; i < rank - 2; ++i) {\n          block += `\n          realIndices[${i}] = int( mod(float(bcastedIndices[${dimOffset + i}]), ${shape[i]}.0) );\n          `;\n        }\n        const body = `\n        void ${funcName}(int bcastedIndices[${outputRank}], out int realIndices[${rank}]) {\n          ${block}\n          realIndices[${rank - 1}] = bcastedIndices[${outputRank - 1}];\n          realIndices[${rank - 2}] = bcastedIndices[${outputRank - 2}];\n        }\n        `;\n        result[funcName] = new GlslLibRoutine(body);\n      }\n    });\n    return result;\n  }\n  protected indicesToOffset(): { [name: string]: GlslLibRoutine } {\n    const result: { [name: string]: GlslLibRoutine } = {};\n    this.context.programInfo.inputNames.forEach((name, i) => {\n      const shape = this.context.inputTextureLayouts[i].shape;\n      const strides = this.context.inputTextureLayouts[i].strides;\n      const rank = shape.length;\n      let funcName = `indicesToOffset_${name}`;\n      result[funcName] = new GlslLibRoutine(ShapeUtilsGlslLib.indexToOffsetSingle(funcName, rank, strides));\n      funcName = `indicesToOffset_${name}_T`;\n      result[funcName] = new GlslLibRoutine(\n        ShapeUtilsGlslLib.indexToOffsetSingle(funcName, rank, strides.slice().reverse()),\n      );\n    });\n    return result;\n  }\n  static indexToOffsetSingle(name: string, rank: number, strides: readonly number[]): string {\n    let block = '';\n    for (let i = rank - 1; i >= 0; --i) {\n      block += `\n        offset += indices[${i}] * ${strides[i]};\n        `;\n    }\n    return `\n      int ${name}(int indices[${rank}]) {\n        int offset = 0;\n        ${block}\n        return offset;\n      }\n      `;\n  }\n  protected offsetToIndices(): { [name: string]: GlslLibRoutine } {\n    const result: { [name: string]: GlslLibRoutine } = {};\n    this.context.programInfo.inputNames.forEach((name, i) => {\n      const shape = this.context.inputTextureLayouts[i].shape;\n      const strides = this.context.inputTextureLayouts[i].strides;\n      const rank = shape.length;\n      let funcName = `offsetToIndices_${name}`;\n      result[funcName] = new GlslLibRoutine(ShapeUtilsGlslLib.offsetToIndicesSingle(funcName, rank, strides));\n      funcName = `offsetToIndices_${name}_T`;\n      result[funcName] = new GlslLibRoutine(\n        ShapeUtilsGlslLib.offsetToIndicesSingle(funcName, rank, strides.slice().reverse()),\n      );\n    });\n    return result;\n  }\n  static offsetToIndicesSingle(name: string, rank: number, strides: readonly number[]): string {\n    const stridesBlock = [];\n    for (let i = 0; i < rank - 1; ++i) {\n      stridesBlock.push(`\n      indices[${i}] = offset / ${strides[i]};`);\n      stridesBlock.push(`\n        offset -= indices[${i}] * ${strides[i]};`);\n    }\n    stridesBlock.push(`\n      indices[${rank - 1}] = offset;`);\n    return `\n      void ${name}(int offset, out int indices[${rank}]) {\n        ${stridesBlock.join('')}\n      }\n      `;\n  }\n  protected incrementIndices(): { [name: string]: GlslLibRoutine } {\n    const result: { [name: string]: GlslLibRoutine } = {};\n    this.context.programInfo.inputNames.forEach((name, i) => {\n      const shape = this.context.inputTextureLayouts[i].shape;\n      const rank = shape.length;\n      const funcName = `incrementIndices_${name}`;\n      let shapeInit = '';\n      for (let i = 0; i < rank; ++i) {\n        shapeInit += `\n        shape[${i}] = ${shape[i]};`;\n      }\n      const body = `\n        void ${funcName}(int axis, out int indices[${rank}]) {\n          int shape[${rank}];\n          ${shapeInit};\n          for(int i = ${rank} -1 ; i >= 0; --i) {\n            if(i > axis) continue;\n            indices[i] += 1;\n            if(indices[i] < shape[i]) {\n              break;\n            }\n            indices[i] = 0;\n          }\n        }\n        `;\n      result[funcName] = new GlslLibRoutine(body);\n    });\n    return result;\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { GlslContext, GlslLib, GlslLibRoutine } from './glsl-definitions';\n\n/**\n * GLSL Library responsible for vec routines\n * Vec is an varible length int array. The length is fixed at the time of\n * generating the library functions from the dimensions of the output.\n */\nexport class VecGlslLib extends GlslLib {\n  constructor(context: GlslContext) {\n    super(context);\n  }\n  getCustomTypes(): { [name: string]: string } {\n    return {};\n  }\n  getFunctions(): { [name: string]: GlslLibRoutine } {\n    return { ...this.binaryVecFunctions(), ...this.copyVec(), ...this.setVecItem(), ...this.getVecItem() };\n  }\n  protected binaryVecFunctions(): { [name: string]: GlslLibRoutine } {\n    const outputLayout = this.context.outputTextureLayout;\n    const rank = outputLayout.shape.length;\n    const nameOp: { [name: string]: string } = { add: '+=', sub: '-=', mul: '*=', div: '/=' };\n    const result: { [name: string]: GlslLibRoutine } = {};\n    for (const name in nameOp) {\n      const fname = `${name}Vec`;\n      let assignmentBlock = '';\n      for (let i = 0; i < rank; ++i) {\n        assignmentBlock += `\n          dest[${i}] ${nameOp[name]} src[${i}];\n          `;\n      }\n      const body = `\n        void ${fname}(int src[${rank}], out int dest[${rank}]) {\n          ${assignmentBlock}\n        }\n        `;\n      result[fname] = new GlslLibRoutine(body);\n    }\n\n    return result;\n  }\n  protected copyVec(): { [name: string]: GlslLibRoutine } {\n    const outputLayout = this.context.outputTextureLayout;\n    const rank = outputLayout.shape.length;\n    let assignmentBlock = '';\n    for (let i = 0; i < rank; ++i) {\n      assignmentBlock += `\n        dest[${i}] = src[${i}];\n        `;\n    }\n    const body = `\n      void copyVec(int src[${rank}], out int dest[${rank}]) {\n        ${assignmentBlock}\n      }\n      `;\n    return { copyVec: new GlslLibRoutine(body) };\n  }\n\n  protected setVecItem(): { [name: string]: GlslLibRoutine } {\n    const outputLayout = this.context.outputTextureLayout;\n    const rank = outputLayout.shape.length;\n    let block = `\n        if(index < 0)\n            index =${rank} + index;\n        if (index == 0)\n            m[0] = value;\n        `;\n    for (let i = 1; i < rank - 1; ++i) {\n      block += `\n        else if (index == ${i})\n            m[${i}] = value;\n            `;\n    }\n    block += `\n        else\n            m[${rank - 1}] = value;\n        `;\n    const body = `\n      void setVecItem(out int m[${rank}], int index, int value) {\n        ${block}\n      }\n        `;\n    return { setVecItem: new GlslLibRoutine(body) };\n  }\n  protected getVecItem(): { [name: string]: GlslLibRoutine } {\n    const outputLayout = this.context.outputTextureLayout;\n    const rank = outputLayout.shape.length;\n    let block = `\n        if(index < 0)\n            index = ${rank} + index;\n        if (index == 0)\n            return m[0];\n      `;\n    for (let i = 1; i < rank - 1; ++i) {\n      block += `\n        else if (index == ${i})\n            return m[${i}];\n      `;\n    }\n    block += `\n        else\n            return m[${rank - 1}];\n        `;\n    const body = `\n      int getVecItem(int m[${rank}], int index) {\n        ${block}\n      }\n    `;\n    return { getVecItem: new GlslLibRoutine(body) };\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { CoordsGlslLib } from './glsl-coordinate-lib';\nimport { GlslContext, GlslLib } from './glsl-definitions';\nimport { EncodingGlslLib } from './glsl-encoding-lib';\nimport { FragColorGlslLib } from './glsl-fragcolor-lib';\nimport { ShapeUtilsGlslLib } from './glsl-shape-utils-lib';\nimport { VecGlslLib } from './glsl-vec-lib';\n\nexport const glslRegistry: { [name: string]: new (context: GlslContext) => GlslLib } = {\n  encoding: EncodingGlslLib,\n  fragcolor: FragColorGlslLib,\n  vec: VecGlslLib,\n  shapeUtils: ShapeUtilsGlslLib,\n  coordinates: CoordsGlslLib,\n  //  'arrays': ArrayGlslSLib\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { GlslContext, GlslLib, GlslLibRoutineNode, TopologicalSortGlslRoutines } from './glsl-definitions';\nimport { replaceInlines } from './glsl-function-inliner';\nimport { glslRegistry } from './glsl-registered-libs';\nimport { getDefaultFragShaderMain, getFragShaderPreamble } from './glsl-source';\nimport { ProgramInfo, TextureLayout, VariableInfo } from './types';\nimport { WebGLContext } from './webgl-context';\n\n/**\n * Preprocessor for the additions to the GLSL language\n * It deals with:\n *  @include directives\n *  @inline\n *  Loop unrolling (not implemented)\n *  Macro resolution (not implemented)\n */\nexport class GlslPreprocessor {\n  readonly context: GlslContext;\n  readonly libs: { [name: string]: GlslLib } = {};\n  readonly glslLibRoutineDependencyGraph: { [routineName: string]: GlslLibRoutineNode } = {};\n\n  constructor(\n    glContext: WebGLContext,\n    programInfo: ProgramInfo,\n    inputTextureLayouts: TextureLayout[],\n    outputTextureLayout: TextureLayout,\n  ) {\n    this.context = new GlslContext(glContext, programInfo, inputTextureLayouts, outputTextureLayout);\n\n    // construct GlslLibs\n    Object.keys(glslRegistry).forEach((name: string) => {\n      const lib = new glslRegistry[name](this.context);\n      this.libs[name] = lib;\n    });\n\n    // construct GlslRoutineDependencyGraph\n    const map = this.glslLibRoutineDependencyGraph;\n    for (const libName in this.libs) {\n      const lib = this.libs[libName];\n      const routinesInLib = lib.getFunctions();\n      for (const routine in routinesInLib) {\n        const key = libName + '.' + routine;\n        let currentNode: GlslLibRoutineNode;\n        if (map[key]) {\n          currentNode = map[key];\n          currentNode.routineBody = routinesInLib[routine].routineBody;\n        } else {\n          currentNode = new GlslLibRoutineNode(key, routinesInLib[routine].routineBody);\n          map[key] = currentNode;\n        }\n        const dependencies = routinesInLib[routine].dependencies;\n        if (dependencies) {\n          for (let i = 0; i < dependencies.length; ++i) {\n            if (!map[dependencies[i]]) {\n              const node = new GlslLibRoutineNode(dependencies[i]);\n              map[dependencies[i]] = node;\n              currentNode.addDependency(node);\n            } else {\n              currentNode.addDependency(map[dependencies[i]]);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  preprocess(): string {\n    const programInfo = this.context.programInfo;\n    let source = programInfo.shaderSource;\n\n    // append main() function\n    if (!this.context.programInfo.hasMain) {\n      source = `${source}\n      ${getDefaultFragShaderMain(this.context.glContext.version, this.context.outputTextureLayout.shape.length)}`;\n    }\n    // replace inlines\n    source = replaceInlines(source);\n\n    // concat final source string\n    return `${getFragShaderPreamble(this.context.glContext.version)}\n    ${this.getUniforms(programInfo.inputNames, programInfo.variables)}\n    ${this.getImports(source)}\n    ${source}`;\n  }\n\n  protected getImports(script: string): string {\n    const routinesIncluded = this.selectGlslLibRoutinesToBeIncluded(script);\n\n    if (routinesIncluded.length === 0) {\n      return '';\n    }\n\n    let routines = '';\n    for (let i = 0; i < routinesIncluded.length; ++i) {\n      if (routinesIncluded[i].routineBody) {\n        routines += routinesIncluded[i].routineBody + '\\n';\n      } else {\n        throw new Error(`Missing body for the Glsl Library routine: ${routinesIncluded[i].name}`);\n      }\n    }\n\n    return routines;\n  }\n  private selectGlslLibRoutinesToBeIncluded(script: string): GlslLibRoutineNode[] {\n    const nodes: GlslLibRoutineNode[] = [];\n\n    Object.keys(this.glslLibRoutineDependencyGraph).forEach((classAndRoutine) => {\n      const routine = classAndRoutine.split('.')[1];\n      if (script.indexOf(routine) !== -1) {\n        nodes.push(this.glslLibRoutineDependencyGraph[classAndRoutine]);\n      }\n    });\n\n    return TopologicalSortGlslRoutines.returnOrderedNodes(nodes);\n  }\n\n  protected getUniforms(samplers?: string[], variables?: VariableInfo[]): string {\n    const uniformLines: string[] = [];\n    if (samplers) {\n      for (const sampler of samplers) {\n        uniformLines.push(`uniform sampler2D ${sampler};`);\n      }\n    }\n    if (variables) {\n      for (const variable of variables) {\n        uniformLines.push(\n          `uniform ${variable.type} ${variable.name}${variable.arrayLength ? `[${variable.arrayLength}]` : ''};`,\n        );\n      }\n    }\n    return uniformLines.join('\\n');\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { env } from 'onnxruntime-common';\n\nimport { Logger, Profiler } from '../../instrument';\n\nimport { GlslPreprocessor } from './glsl-preprocessor';\nimport { getVertexShaderSource } from './glsl-source';\nimport { TextureLayoutStrategy } from './texture-layout-strategy';\nimport { Artifact, ProgramInfo, ProgramVariable, TextureData, TextureLayout, VariableInfo } from './types';\nimport { WebGLContext } from './webgl-context';\n\n/**\n * ProgramManager is the main class behind running computations\n * It builds ProgramInfo's into Artifacts\n * It compiles given ProgramInfo's into WebGL Prorams (cached as Artifacts)\n * Uses the artifact to run the computation by calling Draw on\n * the WebGL drawing buffer\n * ProgramManager automatically maps (binds) input variables to their\n * corresponding Location's in the binary program\n */\nexport class ProgramManager {\n  repo: Map<unknown, Artifact>; // this should be per-session object\n  vertexShader: WebGLShader;\n  attributesBound: boolean;\n\n  constructor(\n    public profiler: Readonly<Profiler>,\n    public glContext: WebGLContext,\n    public textureLayoutStrategy: TextureLayoutStrategy,\n  ) {\n    this.repo = new Map();\n    this.attributesBound = false;\n  }\n  getArtifact(key: unknown): Artifact | undefined {\n    return this.repo.get(key);\n  }\n  setArtifact(key: unknown, artifact: Artifact): void {\n    this.repo.set(key, artifact);\n  }\n  run(buildArtifact: Artifact, inputs: TextureData[], output: TextureData): void {\n    this.profiler.event(\n      'op',\n      `ProgramManager.run ${buildArtifact.programInfo.name ?? 'unknown kernel'}`,\n      () => {\n        const gl = this.glContext.gl;\n        const program = buildArtifact.program;\n        gl.useProgram(program);\n        try {\n          this.bindOutput(output);\n          if (!this.attributesBound) {\n            this.bindAttributes(buildArtifact.attribLocations);\n          }\n          this.bindUniforms(buildArtifact.uniformLocations, buildArtifact.programInfo.variables ?? [], inputs);\n        } catch (err) {\n          Logger.error('ProgramManager', buildArtifact.programInfo.shaderSource);\n          throw err;\n        }\n        this.profiler.event('backend', 'GlContext.draw()', () => {\n          this.glContext.draw();\n        });\n      },\n      this.glContext,\n    );\n  }\n  dispose(): void {\n    if (this.vertexShader) {\n      this.glContext.deleteShader(this.vertexShader);\n    }\n    this.repo.forEach((a) => this.glContext.deleteProgram(a.program));\n  }\n  build(programInfo: ProgramInfo, inputTextureLayouts: TextureLayout[], outputTextureLayout: TextureLayout): Artifact {\n    return this.profiler.event('backend', 'ProgramManager.build', () => {\n      const preprocessor = new GlslPreprocessor(this.glContext, programInfo, inputTextureLayouts, outputTextureLayout);\n      const fragScript = preprocessor.preprocess();\n      const program = this.compile(fragScript);\n      const artifact = {\n        programInfo,\n        program,\n        uniformLocations: this.getUniformLocations(\n          program,\n          preprocessor.context.programInfo.inputNames,\n          preprocessor.context.programInfo.variables,\n        ),\n        attribLocations: this.getAttribLocations(program),\n      };\n      return artifact;\n    });\n  }\n  protected compile(fragShaderScript: string): WebGLProgram {\n    if (!this.vertexShader) {\n      Logger.verbose('ProrgramManager', 'Compiling and caching Vertex shader for the first time');\n      const vertexShaderScript = getVertexShaderSource(this.glContext.version);\n      this.vertexShader = this.glContext.compileShader(vertexShaderScript, this.glContext.gl.VERTEX_SHADER);\n    }\n    if (env.debug) {\n      Logger.verbose(\n        'ProrgramManager',\n        `FragShader:\n${fragShaderScript}\n`,\n      );\n    }\n    const fragShader = this.glContext.compileShader(fragShaderScript, this.glContext.gl.FRAGMENT_SHADER);\n    const program = this.glContext.createProgram(this.vertexShader, fragShader);\n    this.glContext.deleteShader(fragShader);\n    return program;\n  }\n  bindOutput(td: TextureData): void {\n    const width = td.width;\n    const height = td.height;\n    Logger.verbose(\n      'ProrgramManager',\n      `Binding output texture to Framebuffer: w/h=${width}/${height}, shape=${td.shape}, type=${td.tensor.type}`,\n    );\n    this.glContext.attachFramebuffer(td.texture, width, height);\n  }\n  bindAttributes(attribLocations: Artifact.AttribLocations): void {\n    const positionHandle = attribLocations.position;\n    const textureCoordHandle = attribLocations.textureCoord;\n    this.glContext.setVertexAttributes(positionHandle, textureCoordHandle);\n    this.attributesBound = true;\n  }\n  bindUniforms(\n    uniformLocations: Artifact.UniformLocations,\n    variables: ProgramVariable[],\n    textures: TextureData[],\n  ): void {\n    const gl = this.glContext.gl;\n    let texturePosition = 0;\n    for (const { name, type, location, arrayLength } of uniformLocations) {\n      const value = variables.find((v) => v.name === name)?.data;\n      if (type !== 'sampler2D' && !value) {\n        throw new Error(`variable '${name}' does not have data defined in program info`);\n      }\n      switch (type) {\n        case 'sampler2D':\n          this.bindTexture(textures[texturePosition], location, texturePosition);\n          texturePosition++;\n          break;\n        case 'float':\n          if (arrayLength) {\n            gl.uniform1fv(location, value as number[]);\n          } else {\n            gl.uniform1f(location, value as number);\n          }\n          break;\n        case 'int':\n          if (arrayLength) {\n            gl.uniform1iv(location, value as number[]);\n          } else {\n            gl.uniform1i(location, value as number);\n          }\n          break;\n        default:\n          throw new Error(`Uniform not implemented: ${type}`);\n      }\n    }\n  }\n  bindTexture(td: TextureData, uniformHandle: WebGLUniformLocation, position: number): void {\n    this.glContext.bindTextureToUniform(td.texture, position, uniformHandle);\n  }\n  getAttribLocations(program: WebGLProgram): Artifact.AttribLocations {\n    return {\n      position: this.getAttribLocation(program, 'position'),\n      textureCoord: this.getAttribLocation(program, 'textureCoord'),\n    };\n  }\n  getUniformLocations(\n    program: WebGLProgram,\n    samplers?: string[],\n    variables?: VariableInfo[],\n  ): Artifact.UniformLocations {\n    const uniformLocations: Artifact.UniformLocations = [];\n    if (samplers) {\n      for (const sampler of samplers) {\n        uniformLocations.push({\n          name: sampler,\n          type: 'sampler2D',\n          location: this.getUniformLocation(program, sampler),\n        });\n      }\n    }\n    if (variables) {\n      for (const variable of variables) {\n        uniformLocations.push({ ...variable, location: this.getUniformLocation(program, variable.name) });\n      }\n    }\n    return uniformLocations;\n  }\n  getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation {\n    const gl = this.glContext.gl;\n    const reference = gl.getUniformLocation(program, name);\n    if (reference === null) {\n      throw new Error(`Uniform ${name} not found.`);\n    }\n    return reference;\n  }\n  getAttribLocation(program: WebGLProgram, name: string): number {\n    const gl = this.glContext.gl;\n    const attributeLocation: number = gl.getAttribLocation(program, name);\n    return attributeLocation;\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Logger, Profiler } from '../../instrument';\nimport { Tensor } from '../../tensor';\n\nimport { Encoder, EncoderUsage } from './texture-data-encoder';\nimport { TextureLayoutStrategy } from './texture-layout-strategy';\nimport { TextureData, TextureLayout } from './types';\nimport { WebGLContext } from './webgl-context';\n\nexport interface TextureManagerConfig {\n  reuseTextures?: boolean;\n}\n\n/**\n * TextureManager is the mainly responsible for caching Textures\n * Textures are cached in 2 levels:\n *   1. the texures which are associated with a dataId (from Tensor)\n *    Caching these is crucial to performance. These are In-use Textures\n *   2. textures which are not in use by any current ProgramInfo/Tensor\n *     These are called Free Textures\n * TextureManager is also used to help creating textures. For this it\n * uses WebGLContext and TextureLayoutStrategy\n */\nexport class TextureManager {\n  private readonly inUseTextures: Map<string, WebGLTexture[]>;\n  private readonly idleTextures: Map<string, WebGLTexture[]>;\n  private readonly textureLookup: Map<WebGLTexture, string>;\n  private readonly pendingRead: Map<Tensor.Id, Array<(arr: Tensor.NumberType) => void>> = new Map();\n\n  constructor(\n    public glContext: WebGLContext,\n    public layoutStrategy: TextureLayoutStrategy,\n    public profiler: Readonly<Profiler>,\n    private config: TextureManagerConfig,\n  ) {\n    if (config.reuseTextures) {\n      this.inUseTextures = new Map();\n      this.idleTextures = new Map();\n      this.textureLookup = new Map();\n    }\n  }\n  createTextureFromLayout(\n    dataType: Tensor.DataType,\n    layout: TextureLayout,\n    data?: Tensor.NumberType,\n    usage?: EncoderUsage,\n  ) {\n    const textureDataType = this.toEncoderType(dataType);\n\n    const encoder = this.glContext.getEncoder(textureDataType, layout.channels || 1, usage);\n    if (layout.isPacked && usage === EncoderUsage.UploadOnly) {\n      throw new Error('not implemented');\n    }\n    const width = layout.width;\n    const height = layout.height;\n\n    let key: string | undefined;\n    let inUseTextures: WebGLTexture[] | undefined;\n    if (this.config.reuseTextures) {\n      key = `${width}x${height}_${encoder.format}_${encoder.internalFormat}_${encoder.textureType}`;\n      inUseTextures = this.inUseTextures.get(key);\n      if (!inUseTextures) {\n        inUseTextures = [];\n        this.inUseTextures.set(key, inUseTextures);\n      }\n\n      const idleTextures = this.idleTextures.get(key);\n      if (idleTextures && idleTextures.length > 0) {\n        const texture = idleTextures.pop()!;\n        inUseTextures.push(texture);\n        if (usage === EncoderUsage.UploadOnly) {\n          this.glContext.updateTexture(texture, width, height, encoder, this.toTextureData(dataType, data)!);\n        }\n        return texture;\n      }\n    }\n\n    Logger.verbose('TextureManager', `Creating new texture of size ${layout.width}x${layout.height}`);\n    const texture = this.glContext.allocateTexture(width, height, encoder, this.toTextureData(dataType, data));\n\n    if (this.config.reuseTextures) {\n      inUseTextures!.push(texture);\n      this.textureLookup.set(texture, key!);\n    }\n    return texture;\n  }\n  readTexture(td: TextureData, dataType: Tensor.DataType, channels?: number): Tensor.NumberType {\n    if (!channels) {\n      channels = 1;\n    }\n    return this.profiler.event('backend', 'TextureManager.readTexture', () => {\n      const dataSize = td.shape.reduce((a, b) => a * b) * channels!;\n      const data = this.glContext.readTexture(\n        td.texture,\n        td.width,\n        td.height,\n        dataSize,\n        this.toEncoderType(dataType),\n        channels!,\n      );\n      return this.toTensorData(dataType, data);\n    });\n  }\n  async readTextureAsync(td: TextureData, dataType: Tensor.DataType, channels?: number): Promise<Tensor.NumberType> {\n    const dataId = td.tensor.dataId;\n    if (!channels) {\n      channels = 1;\n    }\n    if (this.pendingRead.has(dataId)) {\n      const subscribers = this.pendingRead.get(dataId);\n      return new Promise<Tensor.NumberType>((resolve) => subscribers?.push(resolve));\n    }\n    return this.profiler.event('backend', 'TextureManager.readTextureAsync', async () => {\n      this.pendingRead.set(dataId, []);\n      const dataSize = td.shape.reduce((a, b) => a * b) * channels!;\n      // add a fence waiting for the data to be ready\n      await this.glContext.createAndWaitForFence();\n      const data = this.glContext.readTexture(\n        td.texture,\n        td.width,\n        td.height,\n        dataSize,\n        this.toEncoderType(dataType),\n        channels!,\n      );\n      const tensorData = this.toTensorData(dataType, data);\n      const subscribers = this.pendingRead.get(dataId);\n      this.pendingRead.delete(dataId);\n      subscribers?.forEach((resolve) => resolve(tensorData));\n      return tensorData;\n    });\n  }\n  readUint8TextureAsFloat(td: TextureData): Float32Array {\n    return this.profiler.event('backend', 'TextureManager.readUint8TextureAsFloat', () => {\n      const dataSize = td.shape.reduce((a, b) => a * b);\n      const data = this.glContext.readTexture(td.texture, td.width, td.height, dataSize * 4, 'byte', 4);\n      return new Float32Array(data.buffer, data.byteOffset, dataSize);\n    });\n  }\n  releaseTexture(textureData: TextureData, deleteTexture?: boolean): void {\n    let key: string | undefined;\n    if (this.config.reuseTextures) {\n      key = this.textureLookup.get(textureData.texture);\n      if (key) {\n        if (deleteTexture) {\n          this.textureLookup.delete(key);\n        }\n        const inUseTextures = this.inUseTextures.get(key);\n        if (inUseTextures) {\n          const index = inUseTextures.indexOf(textureData.texture);\n          if (index !== -1) {\n            inUseTextures.splice(index, 1);\n            let idleTextures = this.idleTextures.get(key);\n            if (!idleTextures) {\n              idleTextures = [];\n              this.idleTextures.set(key, idleTextures);\n            }\n            idleTextures.push(textureData.texture);\n          }\n        }\n      }\n    }\n\n    if (!key || deleteTexture) {\n      Logger.verbose('TextureManager', `Deleting texture of size ${textureData.width}x${textureData.height}`);\n      this.glContext.deleteTexture(textureData.texture);\n    }\n  }\n  toTensorData(dataType: Tensor.DataType, data: Encoder.DataArrayType): Tensor.NumberType {\n    switch (dataType) {\n      case 'int16':\n        return data instanceof Int16Array ? data : Int16Array.from(data);\n      case 'int32':\n        return data instanceof Int32Array ? data : Int32Array.from(data);\n      case 'int8':\n        return data instanceof Int8Array ? data : Int8Array.from(data);\n      case 'uint16':\n        return data instanceof Uint16Array ? data : Uint16Array.from(data);\n      case 'uint32':\n        return data instanceof Uint32Array ? data : Uint32Array.from(data);\n      case 'uint8':\n      case 'bool':\n        return data instanceof Uint8Array ? data : Uint8Array.from(data);\n      case 'float32':\n        return data instanceof Float32Array ? data : Float32Array.from(data);\n      case 'float64':\n        return data instanceof Float64Array ? data : Float64Array.from(data);\n      default:\n        throw new Error(`TensorData type ${dataType} is not supported`);\n    }\n  }\n  toTextureData(_dataType: Tensor.DataType, data: Tensor.NumberType | undefined): Encoder.DataArrayType | undefined {\n    if (!data) {\n      return undefined;\n    }\n    return data instanceof Float32Array ? data : new Float32Array(data);\n    /*\n    switch (dataType) {\n      case 'int16':\n      case 'int32':\n      case 'uint16':\n      case 'uint32':\n        return (data.constructor === Uint32Array) ? data as Uint32Array : new Uint32Array(data);\n      case 'int8':\n      case 'uint8':\n      case 'bool':\n        return (data.constructor === Uint8Array) ? data as Uint8Array : new Uint8Array(data);\n      case 'float32':\n      case 'float64':\n        return (data.constructor === Float32Array) ? data as Float32Array : new Float32Array(data);\n      default:\n        throw new Error(`TensorData type ${dataType} is not supported`);\n    }\n    */\n  }\n  toEncoderType(_dataType: Tensor.DataType): Encoder.DataType {\n    return 'float';\n    // switch (dataType) {\n    //   case 'int16':\n    //   case 'int32':\n    //   case 'uint16':\n    //   case 'uint32':\n    //     return 'int';\n    //   case 'uint8':\n    //   case 'bool':\n    //     return 'byte';\n    //   case 'float32':\n    //   case 'float64':\n    //     return 'float';\n    //   default:\n    //     throw new Error(`TensorData type ${dataType} is not supported`);\n    // }\n  }\n  clearActiveTextures(): void {\n    this.glContext.clearActiveTextures();\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { SessionHandler } from '../../backend';\nimport { Graph } from '../../graph';\nimport { Logger } from '../../instrument';\nimport { Operator } from '../../operators';\nimport { OpSet, resolveOperator } from '../../opset';\nimport { Session } from '../../session';\nimport { Tensor } from '../../tensor';\nimport { WebGLBackend } from '../backend-webgl';\n\nimport { WebGLInferenceHandler } from './inference-handler';\nimport { WEBGL_OP_RESOLVE_RULES } from './op-resolve-rules';\nimport { ProgramManager } from './program-manager';\nimport { PreferLogicalStrategy, TextureLayoutStrategy } from './texture-layout-strategy';\nimport { TextureManager } from './texture-manager';\nimport { TextureData } from './types';\n\nexport class WebGLSessionHandler implements SessionHandler {\n  programManager: ProgramManager;\n  textureManager: TextureManager;\n  layoutStrategy: TextureLayoutStrategy;\n  packedTextureDataCache: Map<Tensor.Id, TextureData>;\n  unpackedTextureDataCache: Map<Tensor.Id, TextureData>;\n  pack2unpackMap: Map<Tensor.Id, Tensor.Id>;\n  unpack2packMap: Map<Tensor.Id, Tensor.Id>;\n  initializers: Set<Tensor.Id>;\n  pack?: boolean;\n\n  constructor(\n    public readonly backend: WebGLBackend,\n    public readonly context: Session.Context,\n  ) {\n    this.layoutStrategy = new PreferLogicalStrategy(backend.glContext.maxTextureSize);\n    this.programManager = new ProgramManager(this.context.profiler, backend.glContext, this.layoutStrategy);\n    this.textureManager = new TextureManager(backend.glContext, this.layoutStrategy, this.context.profiler, {\n      reuseTextures: backend.textureCacheMode === 'full',\n    });\n    this.packedTextureDataCache = new Map();\n    this.unpackedTextureDataCache = new Map();\n    this.pack = backend.pack;\n    this.pack2unpackMap = new Map();\n    this.unpack2packMap = new Map();\n  }\n\n  createInferenceHandler() {\n    return new WebGLInferenceHandler(this);\n  }\n  onGraphInitialized(graph: Graph): void {\n    const initializers = graph\n      .getValues()\n      .filter((v) => v.from === -1 && v.tensor)\n      .map((v) => v.tensor!.dataId);\n    this.initializers = new Set(initializers);\n  }\n  isInitializer(tensorId: Tensor.Id): boolean {\n    return this.initializers ? this.initializers.has(tensorId) : false;\n  }\n  addInitializer(tensorId: Tensor.Id): void {\n    this.initializers.add(tensorId);\n  }\n  getTextureData(tensorId: Tensor.Id, isPacked: boolean): TextureData | undefined {\n    if (isPacked) {\n      return this.packedTextureDataCache.get(tensorId);\n    } else {\n      return this.unpackedTextureDataCache.get(tensorId);\n    }\n  }\n  setTextureData(tensorId: Tensor.Id, textureData: TextureData, isPacked = false): void {\n    Logger.verbose('WebGLSessionHandler', 'Storing Texture data in cache');\n    if (isPacked) {\n      this.packedTextureDataCache.set(tensorId, textureData);\n    } else {\n      this.unpackedTextureDataCache.set(tensorId, textureData);\n    }\n  }\n  dispose(): void {\n    this.programManager.dispose();\n    this.textureManager.clearActiveTextures();\n    this.packedTextureDataCache.forEach((td) => this.textureManager.releaseTexture(td, true));\n    this.packedTextureDataCache = new Map();\n    this.unpackedTextureDataCache.forEach((td) => this.textureManager.releaseTexture(td, true));\n    this.unpackedTextureDataCache = new Map();\n  }\n  resolve(node: Graph.Node, opsets: readonly OpSet[], graph: Graph): Operator {\n    const op = resolveOperator(node, opsets, WEBGL_OP_RESOLVE_RULES);\n    return { impl: op.opImpl, context: op.opInit ? op.opInit(node, graph) : node };\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { env } from 'onnxruntime-common';\n\nimport * as DataEncoders from './texture-data-encoder';\nimport { DataEncoder, Encoder, EncoderUsage } from './texture-data-encoder';\nimport { repeatedTry } from './utils';\n\nexport interface FenceContext {\n  query: WebGLSync | null;\n  isFencePassed(): boolean;\n}\n\ntype PollItem = {\n  isDoneFn: () => boolean;\n  resolveFn: () => void;\n};\n\nexport function linearSearchLastTrue(arr: Array<() => boolean>): number {\n  let i = 0;\n  for (; i < arr.length; ++i) {\n    const isDone = arr[i]();\n    if (!isDone) {\n      break;\n    }\n  }\n  return i - 1;\n}\n\n/**\n * Abstraction and wrapper around WebGLRenderingContext and its operations\n */\nexport class WebGLContext {\n  gl: WebGLRenderingContext;\n  version: 1 | 2;\n\n  private vertexbuffer: WebGLBuffer;\n  private framebuffer: WebGLFramebuffer;\n\n  // WebGL flags and vital parameters\n  private isFloatTextureAttachableToFrameBuffer: boolean;\n  isFloat32DownloadSupported: boolean;\n  isRenderFloat32Supported: boolean;\n  isBlendSupported: boolean;\n  maxTextureSize: number;\n  // private maxCombinedTextureImageUnits: number;\n  private maxTextureImageUnits: number;\n  // private maxCubeMapTextureSize: number;\n  // private shadingLanguageVersion: string;\n  // private webglVendor: string;\n  // private webglVersion: string;\n\n  // WebGL2 flags and vital parameters\n  // private max3DTextureSize: number;\n  // private maxArrayTextureLayers: number;\n  // private maxColorAttachments: number;\n  // private maxDrawBuffers: number;\n\n  // WebGL extensions\n  // eslint-disable-next-line camelcase\n  textureFloatExtension: OES_texture_float | null;\n  // eslint-disable-next-line camelcase\n  textureHalfFloatExtension: OES_texture_half_float | null;\n\n  // WebGL2 extensions\n  colorBufferFloatExtension: unknown | null;\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  disjointTimerQueryWebgl2Extension: { TIME_ELAPSED_EXT: GLenum; GPU_DISJOINT_EXT: GLenum } | null;\n\n  private disposed: boolean;\n  private frameBufferBound = false;\n\n  constructor(gl: WebGLRenderingContext, version: 1 | 2) {\n    this.gl = gl;\n    this.version = version;\n\n    this.getExtensions();\n    this.vertexbuffer = this.createVertexbuffer();\n    this.framebuffer = this.createFramebuffer();\n    this.queryVitalParameters();\n  }\n\n  allocateTexture(width: number, height: number, encoder: DataEncoder, data?: Encoder.DataArrayType): WebGLTexture {\n    const gl = this.gl;\n    // create the texture\n    const texture = gl.createTexture();\n    // bind the texture so the following methods effect this texture.\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    const buffer = data ? encoder.encode(data, width * height) : null;\n    gl.texImage2D(\n      gl.TEXTURE_2D,\n      0, // Level of detail.\n      encoder.internalFormat,\n      width,\n      height,\n      0, // Always 0 in OpenGL ES.\n      encoder.format,\n      encoder.textureType,\n      buffer,\n    );\n    this.checkError();\n    return texture as WebGLTexture;\n  }\n  updateTexture(\n    texture: WebGLTexture,\n    width: number,\n    height: number,\n    encoder: DataEncoder,\n    data: Encoder.DataArrayType,\n  ): void {\n    const gl = this.gl;\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    const buffer = encoder.encode(data, width * height);\n    gl.texSubImage2D(\n      gl.TEXTURE_2D,\n      0, // level\n      0, // xoffset\n      0, // yoffset\n      width,\n      height,\n      encoder.format,\n      encoder.textureType,\n      buffer,\n    );\n    this.checkError();\n  }\n  attachFramebuffer(texture: WebGLTexture, width: number, height: number): void {\n    const gl = this.gl;\n    // Make it the target for framebuffer operations - including rendering.\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); // 0, we aren't using MIPMAPs\n    this.checkError();\n    gl.viewport(0, 0, width, height);\n    gl.scissor(0, 0, width, height);\n  }\n  readTexture(\n    texture: WebGLTexture,\n    width: number,\n    height: number,\n    dataSize: number,\n    dataType: Encoder.DataType,\n    channels: number,\n  ): Encoder.DataArrayType {\n    const gl = this.gl;\n    if (!channels) {\n      channels = 1;\n    }\n    if (!this.frameBufferBound) {\n      this.attachFramebuffer(texture, width, height);\n    }\n    const encoder = this.getEncoder(dataType, channels);\n    const buffer = encoder.allocate(width * height);\n    // bind texture to framebuffer\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); // 0, we aren't using MIPMAPs\n    // TODO: Check if framebuffer is ready\n    gl.readPixels(0, 0, width, height, gl.RGBA, encoder.textureType, buffer);\n    this.checkError();\n    // unbind FB\n    return encoder.decode(buffer, dataSize);\n  }\n\n  isFramebufferReady(): boolean {\n    // TODO: Implement logic to check if the framebuffer is ready\n    return true;\n  }\n  getActiveTexture(): string {\n    const gl = this.gl;\n    const n = gl.getParameter(this.gl.ACTIVE_TEXTURE);\n    return `TEXTURE${n - gl.TEXTURE0}`;\n  }\n  getTextureBinding(): WebGLTexture {\n    return this.gl.getParameter(this.gl.TEXTURE_BINDING_2D);\n  }\n  getFramebufferBinding(): WebGLFramebuffer {\n    return this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING);\n  }\n  setVertexAttributes(positionHandle: number, textureCoordHandle: number): void {\n    const gl = this.gl;\n    gl.vertexAttribPointer(positionHandle, 3, gl.FLOAT, false, 20, 0);\n    gl.enableVertexAttribArray(positionHandle);\n    if (textureCoordHandle !== -1) {\n      gl.vertexAttribPointer(textureCoordHandle, 2, gl.FLOAT, false, 20, 12);\n      gl.enableVertexAttribArray(textureCoordHandle);\n    }\n    this.checkError();\n  }\n  createProgram(vertexShader: WebGLShader, fragShader: WebGLShader): WebGLProgram {\n    const gl = this.gl;\n    const program = gl.createProgram()!;\n\n    // the program consists of our shaders\n    gl.attachShader(program, vertexShader);\n    gl.attachShader(program, fragShader);\n    gl.linkProgram(program);\n    return program;\n  }\n  compileShader(shaderSource: string, shaderType: number): WebGLShader {\n    const gl = this.gl;\n    const shader = gl.createShader(shaderType);\n    if (!shader) {\n      throw new Error(`createShader() returned null with type ${shaderType}`);\n    }\n\n    gl.shaderSource(shader, shaderSource);\n    gl.compileShader(shader);\n    if (gl.getShaderParameter(shader, gl.COMPILE_STATUS) === false) {\n      throw new Error(`Failed to compile shader: ${gl.getShaderInfoLog(shader)}\nShader source:\n${shaderSource}`);\n    }\n    return shader;\n  }\n  deleteShader(shader: WebGLShader): void {\n    this.gl.deleteShader(shader);\n  }\n  bindTextureToUniform(texture: WebGLTexture, position: number, uniformHandle: WebGLUniformLocation): void {\n    const gl = this.gl;\n    gl.activeTexture(gl.TEXTURE0 + position);\n    this.checkError();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    this.checkError();\n    gl.uniform1i(uniformHandle, position);\n    this.checkError();\n  }\n  draw(): void {\n    this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n    this.checkError();\n  }\n  checkError(): void {\n    if (env.debug) {\n      const gl = this.gl;\n      const error = gl.getError();\n      let label = '';\n      switch (error) {\n        case gl.NO_ERROR:\n          return;\n        case gl.INVALID_ENUM:\n          label = 'INVALID_ENUM';\n          break;\n        case gl.INVALID_VALUE:\n          label = 'INVALID_VALUE';\n          break;\n        case gl.INVALID_OPERATION:\n          label = 'INVALID_OPERATION';\n          break;\n        case gl.INVALID_FRAMEBUFFER_OPERATION:\n          label = 'INVALID_FRAMEBUFFER_OPERATION';\n          break;\n        case gl.OUT_OF_MEMORY:\n          label = 'OUT_OF_MEMORY';\n          break;\n        case gl.CONTEXT_LOST_WEBGL:\n          label = 'CONTEXT_LOST_WEBGL';\n          break;\n        default:\n          label = `Unknown WebGL Error: ${error.toString(16)}`;\n      }\n      throw new Error(label);\n    }\n  }\n  deleteTexture(texture: WebGLTexture): void {\n    this.gl.deleteTexture(texture);\n  }\n  deleteProgram(program: WebGLProgram): void {\n    this.gl.deleteProgram(program);\n  }\n  getEncoder(dataType: Encoder.DataType, channels: number, usage: EncoderUsage = EncoderUsage.Default): DataEncoder {\n    if (this.version === 2) {\n      return new DataEncoders.RedFloat32DataEncoder(this.gl as WebGL2RenderingContext, channels);\n    }\n\n    switch (dataType) {\n      case 'float':\n        if (usage === EncoderUsage.UploadOnly || this.isRenderFloat32Supported) {\n          return new DataEncoders.RGBAFloatDataEncoder(this.gl, channels);\n        } else {\n          return new DataEncoders.RGBAFloatDataEncoder(\n            this.gl,\n            channels,\n            this.textureHalfFloatExtension!.HALF_FLOAT_OES,\n          );\n        }\n      case 'int':\n        throw new Error('not implemented');\n      case 'byte':\n        return new DataEncoders.Uint8DataEncoder(this.gl, channels);\n      default:\n        throw new Error(`Invalid dataType: ${dataType}`);\n    }\n  }\n  clearActiveTextures(): void {\n    const gl = this.gl;\n    for (let unit = 0; unit < this.maxTextureImageUnits; ++unit) {\n      gl.activeTexture(gl.TEXTURE0 + unit);\n      gl.bindTexture(gl.TEXTURE_2D, null);\n    }\n  }\n  dispose(): void {\n    if (this.disposed) {\n      return;\n    }\n    const gl = this.gl;\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    gl.deleteFramebuffer(this.framebuffer);\n    gl.bindBuffer(gl.ARRAY_BUFFER, null);\n    gl.deleteBuffer(this.vertexbuffer);\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n    gl.finish();\n    this.disposed = true;\n  }\n\n  private createDefaultGeometry(): Float32Array {\n    // Sets of x,y,z(=0),s,t coordinates.\n    return new Float32Array([\n      -1.0,\n      1.0,\n      0.0,\n      0.0,\n      1.0, // upper left\n      -1.0,\n      -1.0,\n      0.0,\n      0.0,\n      0.0, // lower left\n      1.0,\n      1.0,\n      0.0,\n      1.0,\n      1.0, // upper right\n      1.0,\n      -1.0,\n      0.0,\n      1.0,\n      0.0, // lower right\n    ]);\n  }\n  private createVertexbuffer(): WebGLBuffer {\n    const gl = this.gl;\n    const buffer = gl.createBuffer();\n    if (!buffer) {\n      throw new Error('createBuffer() returned null');\n    }\n    const geometry = this.createDefaultGeometry();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, geometry, gl.STATIC_DRAW);\n    this.checkError();\n    return buffer;\n  }\n  private createFramebuffer(): WebGLFramebuffer {\n    const fb = this.gl.createFramebuffer();\n    if (!fb) {\n      throw new Error('createFramebuffer returned null');\n    }\n    return fb;\n  }\n\n  private queryVitalParameters(): void {\n    const gl = this.gl;\n\n    this.isFloatTextureAttachableToFrameBuffer = this.checkFloatTextureAttachableToFrameBuffer();\n    this.isRenderFloat32Supported = this.checkRenderFloat32();\n    this.isFloat32DownloadSupported = this.checkFloat32Download();\n\n    if (this.version === 1 && !this.textureHalfFloatExtension && !this.isRenderFloat32Supported) {\n      throw new Error('both float32 and float16 TextureType are not supported');\n    }\n\n    this.isBlendSupported = !this.isRenderFloat32Supported || this.checkFloat32Blend();\n\n    // this.maxCombinedTextureImageUnits = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);\n    this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n    this.maxTextureImageUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n    // this.maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n    // this.shadingLanguageVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);\n    // this.webglVendor = gl.getParameter(gl.VENDOR);\n    // this.webglVersion = gl.getParameter(gl.VERSION);\n\n    if (this.version === 2) {\n      // this.max3DTextureSize = gl.getParameter(WebGL2RenderingContext.MAX_3D_TEXTURE_SIZE);\n      // this.maxArrayTextureLayers = gl.getParameter(WebGL2RenderingContext.MAX_ARRAY_TEXTURE_LAYERS);\n      // this.maxColorAttachments = gl.getParameter(WebGL2RenderingContext.MAX_COLOR_ATTACHMENTS);\n      // this.maxDrawBuffers = gl.getParameter(WebGL2RenderingContext.MAX_DRAW_BUFFERS);\n    }\n  }\n  private getExtensions(): void {\n    if (this.version === 2) {\n      this.colorBufferFloatExtension = this.gl.getExtension('EXT_color_buffer_float');\n      this.disjointTimerQueryWebgl2Extension = this.gl.getExtension('EXT_disjoint_timer_query_webgl2');\n    } else {\n      this.textureFloatExtension = this.gl.getExtension('OES_texture_float');\n      this.textureHalfFloatExtension = this.gl.getExtension('OES_texture_half_float');\n    }\n  }\n\n  private checkFloatTextureAttachableToFrameBuffer(): boolean {\n    // test whether Float32 texture is supported:\n    // STEP.1 create a float texture\n    const gl = this.gl;\n    const texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    const internalFormat = this.version === 2 ? (gl as unknown as { RGBA32F: number }).RGBA32F : gl.RGBA;\n    gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, 1, 1, 0, gl.RGBA, gl.FLOAT, null);\n    // STEP.2 bind a frame buffer\n    const frameBuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n    // STEP.3 attach texture to framebuffer\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n    // STEP.4 test whether framebuffer is complete\n    const isComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    gl.deleteTexture(texture);\n    gl.deleteFramebuffer(frameBuffer);\n    return isComplete;\n  }\n\n  private checkRenderFloat32(): boolean {\n    if (this.version === 2) {\n      if (!this.colorBufferFloatExtension) {\n        return false;\n      }\n    } else {\n      if (!this.textureFloatExtension) {\n        return false;\n      }\n    }\n    return this.isFloatTextureAttachableToFrameBuffer;\n  }\n\n  private checkFloat32Download(): boolean {\n    if (this.version === 2) {\n      if (!this.colorBufferFloatExtension) {\n        return false;\n      }\n    } else {\n      if (!this.textureFloatExtension) {\n        return false;\n      }\n      if (!this.gl.getExtension('WEBGL_color_buffer_float')) {\n        return false;\n      }\n    }\n    return this.isFloatTextureAttachableToFrameBuffer;\n  }\n\n  /**\n   * Check whether GL_BLEND is supported\n   */\n  private checkFloat32Blend(): boolean {\n    // it looks like currently (2019-05-08) there is no easy way to detect whether BLEND is supported\n    // https://github.com/microsoft/onnxjs/issues/145\n\n    const gl = this.gl;\n\n    let texture: WebGLTexture | null | undefined;\n    let frameBuffer: WebGLFramebuffer | null | undefined;\n    let vertexShader: WebGLShader | null | undefined;\n    let fragmentShader: WebGLShader | null | undefined;\n    let program: WebGLProgram | null | undefined;\n\n    try {\n      texture = gl.createTexture();\n      frameBuffer = gl.createFramebuffer();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n\n      // eslint-disable-next-line @typescript-eslint/naming-convention\n      const internalFormat = this.version === 2 ? (gl as unknown as { RGBA32F: number }).RGBA32F : gl.RGBA;\n      gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, 1, 1, 0, gl.RGBA, gl.FLOAT, null);\n\n      gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n\n      gl.enable(gl.BLEND);\n\n      vertexShader = gl.createShader(gl.VERTEX_SHADER);\n      if (!vertexShader) {\n        return false;\n      }\n      gl.shaderSource(vertexShader, 'void main(){}');\n      gl.compileShader(vertexShader);\n\n      fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n      if (!fragmentShader) {\n        return false;\n      }\n      gl.shaderSource(fragmentShader, 'precision highp float;void main(){gl_FragColor=vec4(0.5);}');\n      gl.compileShader(fragmentShader);\n\n      program = gl.createProgram();\n      if (!program) {\n        return false;\n      }\n      gl.attachShader(program, vertexShader);\n      gl.attachShader(program, fragmentShader);\n      gl.linkProgram(program);\n      gl.useProgram(program);\n\n      gl.drawArrays(gl.POINTS, 0, 1);\n      return gl.getError() === gl.NO_ERROR;\n    } finally {\n      gl.disable(gl.BLEND);\n\n      if (program) {\n        gl.deleteProgram(program);\n      }\n      if (vertexShader) {\n        gl.deleteShader(vertexShader);\n      }\n      if (fragmentShader) {\n        gl.deleteShader(fragmentShader);\n      }\n      if (frameBuffer) {\n        gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n        gl.deleteFramebuffer(frameBuffer);\n      }\n      if (texture) {\n        gl.bindTexture(gl.TEXTURE_2D, null);\n        gl.deleteTexture(texture);\n      }\n    }\n  }\n\n  beginTimer(): WebGLQuery {\n    if (this.version === 2 && this.disjointTimerQueryWebgl2Extension) {\n      const gl2 = this.gl as WebGL2RenderingContext;\n      const ext = this.disjointTimerQueryWebgl2Extension;\n\n      const query = gl2.createQuery() as WebGLQuery;\n      gl2.beginQuery(ext.TIME_ELAPSED_EXT, query);\n      return query;\n    } else {\n      // TODO: add webgl 1 handling.\n      throw new Error('WebGL1 profiling currently not supported.');\n    }\n  }\n\n  endTimer() {\n    if (this.version === 2 && this.disjointTimerQueryWebgl2Extension) {\n      const gl2 = this.gl as WebGL2RenderingContext;\n      const ext = this.disjointTimerQueryWebgl2Extension;\n      gl2.endQuery(ext.TIME_ELAPSED_EXT);\n      return;\n    } else {\n      // TODO: add webgl 1 handling.\n      throw new Error('WebGL1 profiling currently not supported');\n    }\n  }\n\n  isTimerResultAvailable(query: WebGLQuery): boolean {\n    let available = false,\n      disjoint = false;\n    if (this.version === 2 && this.disjointTimerQueryWebgl2Extension) {\n      const gl2 = this.gl as WebGL2RenderingContext;\n      const ext = this.disjointTimerQueryWebgl2Extension;\n\n      available = gl2.getQueryParameter(query, gl2.QUERY_RESULT_AVAILABLE);\n      disjoint = gl2.getParameter(ext.GPU_DISJOINT_EXT);\n    } else {\n      // TODO: add webgl 1 handling.\n      throw new Error('WebGL1 profiling currently not supported');\n    }\n\n    return available && !disjoint;\n  }\n\n  getTimerResult(query: WebGLQuery): number {\n    let timeElapsed = 0;\n    if (this.version === 2) {\n      const gl2 = this.gl as WebGL2RenderingContext;\n      timeElapsed = gl2.getQueryParameter(query, gl2.QUERY_RESULT);\n      gl2.deleteQuery(query);\n    } else {\n      // TODO: add webgl 1 handling.\n      throw new Error('WebGL1 profiling currently not supported');\n    }\n    // return miliseconds\n    return timeElapsed / 1000000;\n  }\n\n  async waitForQueryAndGetTime(query: WebGLQuery): Promise<number> {\n    await repeatedTry(() => this.isTimerResultAvailable(query));\n    return this.getTimerResult(query);\n  }\n\n  public async createAndWaitForFence(): Promise<void> {\n    const fenceContext = this.createFence(this.gl);\n    return this.pollFence(fenceContext);\n  }\n\n  private createFence(gl: WebGLRenderingContext): FenceContext {\n    let isFencePassed: () => boolean;\n    const gl2 = gl as WebGL2RenderingContext;\n    const query = gl2.fenceSync(gl2.SYNC_GPU_COMMANDS_COMPLETE, 0);\n    gl.flush();\n    if (query === null) {\n      isFencePassed = () => true;\n    } else {\n      isFencePassed = () => {\n        const status = gl2.clientWaitSync(query, 0, 0);\n        return status === gl2.ALREADY_SIGNALED || status === gl2.CONDITION_SATISFIED;\n      };\n    }\n    return { query, isFencePassed };\n  }\n\n  async pollFence(fenceContext: FenceContext) {\n    return new Promise<void>((resolve) => {\n      void this.addItemToPoll(\n        () => fenceContext.isFencePassed(),\n        () => resolve(),\n      );\n    });\n  }\n\n  private itemsToPoll: PollItem[] = [];\n\n  pollItems(): void {\n    // Find the last query that has finished.\n    const index = linearSearchLastTrue(this.itemsToPoll.map((x) => x.isDoneFn));\n    for (let i = 0; i <= index; ++i) {\n      const { resolveFn } = this.itemsToPoll[i];\n      resolveFn();\n    }\n    this.itemsToPoll = this.itemsToPoll.slice(index + 1);\n  }\n\n  private async addItemToPoll(isDoneFn: () => boolean, resolveFn: () => void) {\n    this.itemsToPoll.push({ isDoneFn, resolveFn });\n    if (this.itemsToPoll.length > 1) {\n      // We already have a running loop that polls.\n      return;\n    }\n    // Start a new loop that polls.\n    await repeatedTry(() => {\n      this.pollItems();\n      // End the loop if no more items to poll.\n      return this.itemsToPoll.length === 0;\n    });\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Logger } from '../../instrument';\n\nimport { WebGLContext } from './webgl-context';\n\nconst cache: { [contextId: string]: WebGLContext } = {};\n\n/**\n * This factory function creates proper WebGLRenderingContext based on\n * the current browsers capabilities\n * The order is from higher/most recent versions to most basic\n */\nexport function createWebGLContext(contextId?: 'webgl' | 'webgl2'): WebGLContext {\n  let context: WebGLContext | undefined;\n  if ((!contextId || contextId === 'webgl2') && 'webgl2' in cache) {\n    context = cache.webgl2;\n  } else if ((!contextId || contextId === 'webgl') && 'webgl' in cache) {\n    context = cache.webgl;\n  }\n\n  if (!context) {\n    try {\n      // try to create webgl context from an offscreen canvas\n      const offscreenCanvas = createOffscreenCanvas();\n      context = createNewWebGLContext(offscreenCanvas, contextId);\n    } catch (e) {\n      // if failed, fallback to try to use a normal canvas element\n      const canvas = createCanvas();\n      context = createNewWebGLContext(canvas, contextId);\n    }\n  }\n\n  contextId = contextId || context.version === 1 ? 'webgl' : 'webgl2';\n  const gl = context.gl;\n\n  cache[contextId] = context;\n\n  if (gl.isContextLost()) {\n    delete cache[contextId];\n    return createWebGLContext(contextId);\n  }\n\n  gl.disable(gl.DEPTH_TEST);\n  gl.disable(gl.STENCIL_TEST);\n  gl.disable(gl.BLEND);\n  gl.disable(gl.DITHER);\n  gl.disable(gl.POLYGON_OFFSET_FILL);\n  gl.disable(gl.SAMPLE_COVERAGE);\n  gl.enable(gl.SCISSOR_TEST);\n  gl.enable(gl.CULL_FACE);\n  gl.cullFace(gl.BACK);\n\n  return context;\n}\n\nexport function createNewWebGLContext(canvas: HTMLCanvasElement, contextId?: 'webgl' | 'webgl2'): WebGLContext {\n  const contextAttributes: WebGLContextAttributes = {\n    alpha: false,\n    depth: false,\n    antialias: false,\n    stencil: false,\n    preserveDrawingBuffer: false,\n    premultipliedAlpha: false,\n    failIfMajorPerformanceCaveat: false,\n  };\n  let gl: WebGLRenderingContext | null;\n  const ca = contextAttributes;\n  if (!contextId || contextId === 'webgl2') {\n    gl = canvas.getContext('webgl2', ca);\n    if (gl) {\n      try {\n        return new WebGLContext(gl, 2);\n      } catch (err) {\n        Logger.warning('GlContextFactory', `failed to create WebGLContext using contextId 'webgl2'. Error: ${err}`);\n      }\n    }\n  }\n  if (!contextId || contextId === 'webgl') {\n    gl = canvas.getContext('webgl', ca) || (canvas.getContext('experimental-webgl', ca) as WebGLRenderingContext);\n    if (gl) {\n      try {\n        return new WebGLContext(gl, 1);\n      } catch (err) {\n        Logger.warning(\n          'GlContextFactory',\n          `failed to create WebGLContext using contextId 'webgl' or 'experimental-webgl'. Error: ${err}`,\n        );\n      }\n    }\n  }\n\n  throw new Error('WebGL is not supported');\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare let OffscreenCanvas: { new (width: number, height: number): HTMLCanvasElement };\n\nfunction createCanvas(): HTMLCanvasElement {\n  if (typeof document === 'undefined') {\n    throw new TypeError('failed to create canvas: document is not supported');\n  }\n  const canvas: HTMLCanvasElement = document.createElement('canvas');\n  canvas.width = 1;\n  canvas.height = 1;\n  return canvas;\n}\n\nfunction createOffscreenCanvas(): HTMLCanvasElement {\n  if (typeof OffscreenCanvas === 'undefined') {\n    throw new TypeError('failed to create offscreen canvas: OffscreenCanvas is not supported');\n  }\n  return new OffscreenCanvas(1, 1);\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { env } from 'onnxruntime-common';\n\nimport { Backend, SessionHandler } from '../backend';\nimport { Logger } from '../instrument';\nimport { Session } from '../session';\n\nimport { WebGLSessionHandler } from './webgl/session-handler';\nimport { WebGLContext } from './webgl/webgl-context';\nimport { createWebGLContext } from './webgl/webgl-context-factory';\n\n/**\n * WebGLBackend is the entry point for all WebGL opeartions\n * When it starts it created the WebGLRenderingContext\n * and other main framework components such as Program and Texture Managers\n */\nexport class WebGLBackend implements Backend {\n  glContext: WebGLContext;\n\n  get contextId(): 'webgl' | 'webgl2' | undefined {\n    return env.webgl.contextId;\n  }\n  set contextId(value: 'webgl' | 'webgl2' | undefined) {\n    env.webgl.contextId = value;\n  }\n\n  get matmulMaxBatchSize(): number | undefined {\n    return env.webgl.matmulMaxBatchSize;\n  }\n  set matmulMaxBatchSize(value: number | undefined) {\n    env.webgl.matmulMaxBatchSize = value;\n  }\n\n  get textureCacheMode(): 'initializerOnly' | 'full' | undefined {\n    return env.webgl.textureCacheMode;\n  }\n  set textureCacheMode(value: 'initializerOnly' | 'full' | undefined) {\n    env.webgl.textureCacheMode = value;\n  }\n\n  get pack(): boolean | undefined {\n    return env.webgl.pack;\n  }\n  set pack(value: boolean | undefined) {\n    env.webgl.pack = value;\n  }\n\n  get async(): boolean | undefined {\n    return env.webgl.async;\n  }\n  set async(value: boolean | undefined) {\n    env.webgl.async = value;\n  }\n\n  initialize(): boolean {\n    try {\n      this.glContext = createWebGLContext(this.contextId);\n      if (typeof this.matmulMaxBatchSize !== 'number') {\n        this.matmulMaxBatchSize = 16;\n      }\n      if (typeof this.textureCacheMode !== 'string') {\n        this.textureCacheMode = 'full';\n      }\n      if (typeof this.pack !== 'boolean') {\n        this.pack = false;\n      }\n      if (typeof this.async !== 'boolean') {\n        this.async = false;\n      }\n\n      Logger.setWithEnv(env);\n\n      if (!env.webgl.context) {\n        Object.defineProperty(env.webgl, 'context', { value: this.glContext.gl });\n      }\n\n      Logger.verbose(\n        'WebGLBackend',\n        `Created WebGLContext: ${typeof this.glContext} with matmulMaxBatchSize: ${\n          this.matmulMaxBatchSize\n        }; textureCacheMode: ${this.textureCacheMode}; pack: ${this.pack}; async: ${this.async}.`,\n      );\n      return true;\n    } catch (e) {\n      Logger.warning('WebGLBackend', `Unable to initialize WebGLBackend. ${e}`);\n      return false;\n    }\n  }\n  createSessionHandler(context: Session.Context): SessionHandler {\n    return new WebGLSessionHandler(this, context);\n  }\n  dispose(): void {\n    this.glContext.dispose();\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { WebGLBackend } from './backends/backend-webgl';\nimport { Graph } from './graph';\nimport { Operator } from './operators';\nimport { OpSet } from './opset';\nimport { Session } from './session';\n\nexport interface InferenceHandler {\n  /**\n   * dispose the inference handler. it will be called as the last step in Session.run()\n   */\n  dispose(): void;\n}\n\nexport interface SessionHandler {\n  /**\n   * transform the graph at initialization time\n   * @param graphTransformer the graph transformer to manipulate the model graph\n   */\n  transformGraph?(graphTransformer: Graph.Transformer): void;\n\n  /**\n   * create an instance of InferenceHandler to use in a Session.run() call\n   */\n  createInferenceHandler(): InferenceHandler;\n\n  /**\n   * dispose the session handler. it will be called when a session is being disposed explicitly\n   */\n  dispose(): void;\n\n  /**\n   * Resolves the operator from the name and opset version; backend specific\n   * @param node the node to resolve\n   * @param opsets a list of opsets that exported from the model\n   * @param graph the completely initialized graph\n   */\n  resolve(node: Graph.Node, opsets: readonly OpSet[], graph: Graph): Operator;\n\n  /**\n   * This method let's the sessionHandler know that the graph initialization is complete\n   * @param graph the completely initialized graph\n   */\n  onGraphInitialized?(graph: Graph): void;\n\n  /**\n   * a reference to the corresponding backend\n   */\n  readonly backend: Backend;\n\n  /**\n   * a reference to the session context\n   */\n  readonly context: Session.Context;\n}\n\nexport interface Backend {\n  /**\n   * initialize the backend. will be called only once, when the first time the\n   * backend it to be used\n   */\n  initialize(): boolean | Promise<boolean>;\n\n  /**\n   * create an instance of SessionHandler to use in a Session object's lifecycle\n   */\n  createSessionHandler(context: Session.Context): SessionHandler;\n\n  /**\n   * dispose the backend. currently this will not be called\n   */\n  dispose(): void;\n}\n\n// caches all initialized backend instances\nconst backendsCache: Map<string, Backend> = new Map();\n\nexport const backend: { [name: string]: Backend } = {\n  webgl: new WebGLBackend(),\n};\n\n/**\n * Resolve a reference to the backend. If a hint is specified, the corresponding\n * backend will be used.\n */\nexport async function resolveBackend(hint?: string | readonly string[]): Promise<Backend> {\n  if (!hint) {\n    return resolveBackend(['webgl']);\n  } else {\n    const hints = typeof hint === 'string' ? [hint] : hint;\n\n    for (const backendHint of hints) {\n      const cache = backendsCache.get(backendHint);\n      if (cache) {\n        return cache;\n      }\n\n      const backend = await tryLoadBackend(backendHint);\n      if (backend) {\n        return backend;\n      }\n    }\n  }\n\n  throw new Error('no available backend to use');\n}\n\nasync function tryLoadBackend(backendHint: string): Promise<Backend | undefined> {\n  const backendObj = backend;\n\n  if (typeof backendObj[backendHint] !== 'undefined' && isBackend(backendObj[backendHint])) {\n    const backend = backendObj[backendHint];\n    let init = backend.initialize();\n    if (typeof init === 'object' && 'then' in init) {\n      init = await init;\n    }\n    if (init) {\n      backendsCache.set(backendHint, backend);\n      return backend;\n    }\n  }\n\n  return undefined;\n}\n\nfunction isBackend(obj: unknown) {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const o = obj as any;\n\n  // check if an object is a Backend instance\n  if (\n    'initialize' in o &&\n    typeof o.initialize === 'function' && // initialize()\n    'createSessionHandler' in o &&\n    typeof o.createSessionHandler === 'function' && // createSessionHandler()\n    'dispose' in o &&\n    typeof o.dispose === 'function' // dispose()\n  ) {\n    return true;\n  }\n\n  return false;\n}\n\nexport type BackendType = Backend;\nexport type SessionHandlerType = ReturnType<BackendType['createSessionHandler']>;\nexport type InferenceHandlerType = ReturnType<SessionHandlerType['createInferenceHandler']>;\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { SessionHandler } from './backend';\nimport { Graph } from './graph';\nimport { Logger, Profiler } from './instrument';\nimport { Operator } from './operators';\nimport { Tensor } from './tensor';\n\nclass KernelOp {\n  constructor(\n    public op: Operator,\n    public node: Graph.Node,\n  ) {}\n}\n\nexport class ExecutionPlan {\n  constructor(\n    private graph: Graph,\n    ops: Operator[],\n    private profiler: Readonly<Profiler>,\n  ) {\n    this.initialize(ops);\n  }\n\n  initialize(ops: Operator[]) {\n    this.profiler.event('session', 'ExecutionPlan.initialize', () => {\n      const graphNodes = this.graph.getNodes();\n      if (graphNodes.length !== ops.length) {\n        throw new Error('The size of nodes and OPs do not match.');\n      }\n\n      this._ops = ops.map((op, i) => new KernelOp(op, graphNodes[i]));\n      this.reset();\n\n      // look for starter node(s)\n      this._starter = [];\n      this._ops.forEach((op, i) => {\n        let resolved = true;\n        for (const input of op.node.inputs) {\n          if (\n            !this._values[input] && // not an initialized input\n            this.graph.getInputIndices().indexOf(input) === -1 // not model input\n          ) {\n            resolved = false;\n            break;\n          }\n        }\n        if (resolved) {\n          this._starter.push(i);\n        }\n      });\n    });\n  }\n\n  reset() {\n    this._values = this.graph.getValues().map((i) => i.tensor);\n  }\n\n  async execute(sessionHandler: SessionHandler, modelInputs: Tensor[]): Promise<Tensor[]> {\n    return this.profiler.event('session', 'ExecutionPlan.execute', async () => {\n      // reset mediem result\n      this.reset();\n\n      // create inference handler\n      const inferenceHandler = sessionHandler.createInferenceHandler();\n\n      // populate inputs value\n      const graphInputs = this.graph.getInputIndices();\n      if (modelInputs.length !== graphInputs.length) {\n        throw new Error(\n          `number of input tensors don't match the number of inputs to the model: actual: ${\n            modelInputs.length\n          } expected: ${graphInputs.length}`,\n        );\n      }\n\n      modelInputs.forEach((input, i) => {\n        const index = graphInputs[i];\n        this._values[index] = input;\n      });\n\n      // prepare running sequence\n      const sequence: number[] = this._starter.slice(0);\n\n      // execution iterations\n      const graphValues = this.graph.getValues();\n      const graphNodes = this.graph.getNodes();\n\n      let rear = 0;\n      while (rear < sequence.length) {\n        const thisOpIndex = sequence[rear++];\n        const thisOp = this._ops[thisOpIndex];\n\n        // check input\n        const inputList = thisOp.node.inputs.map((i) => this._values[i]);\n        if (inputList.indexOf(undefined) !== -1) {\n          throw new Error(`unresolved input detected: op: ${thisOp.node}`);\n        }\n\n        // run\n        const inputTensors = inputList as Tensor[];\n        Logger.verbose(\n          'ExecPlan',\n          `Running op:${thisOp.node.name} (${inputTensors\n            .map((t, i) => `'${thisOp.node.inputs[i]}': ${t.type}[${t.dims.join(',')}]`)\n            .join(', ')})`,\n        );\n\n        const outputList = await this.profiler.event('node', thisOp.node.name, async () =>\n          thisOp.op.impl(inferenceHandler, inputTensors, thisOp.op.context),\n        );\n\n        // check output\n        if (outputList.length !== thisOp.node.outputs.length) {\n          throw new Error('the size of output does not match model definition.');\n        }\n\n        // fill value\n        outputList.forEach((output, i) => {\n          const j = thisOp.node.outputs[i];\n          if (this._values[j]) {\n            throw new Error(`output [${j}] already has value: op:${thisOp.node.name}`);\n          }\n          this._values[j] = output;\n        });\n\n        // resolve downstream nodes\n        const downstreamNodes = new Set<number>();\n        outputList.forEach((_output, i) => {\n          const j = thisOp.node.outputs[i];\n          for (const currentDownstreamNodeIndex of graphValues[j].to) {\n            const currentDownstreamNode = graphNodes[currentDownstreamNodeIndex];\n            let resolved = true;\n            for (const k of currentDownstreamNode.inputs) {\n              if (!this._values[k]) {\n                resolved = false;\n                break;\n              }\n            }\n            if (resolved) {\n              downstreamNodes.add(currentDownstreamNodeIndex);\n            }\n          }\n        });\n        sequence.push(...downstreamNodes);\n      }\n\n      const output: Tensor[] = [];\n      for (let i = 0; i < this.graph.getOutputIndices().length; i++) {\n        const outputIndex = this.graph.getOutputIndices()[i];\n        const outputTensor = this._values[outputIndex];\n        if (outputTensor === undefined) {\n          throw new Error(`required output [${outputIndex}] does not have value`);\n        }\n        if (outputIndex === 0) {\n          await outputTensor.getData();\n        } else {\n          // eslint-disable-next-line no-unused-expressions\n          outputTensor.data;\n        }\n        output.push(outputTensor);\n      }\n      Logger.verbose('ExecPlan', 'disposing of inferenceHandler');\n      inferenceHandler.dispose();\n      return output;\n    });\n  }\n\n  _values: Array<Tensor | undefined>;\n  _ops: KernelOp[];\n  _starter: number[];\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport Long from 'long';\n\nimport { onnxruntime } from './ort-schema/flatbuffers/ort-generated';\nimport { onnx } from './ort-schema/protobuf/onnx';\nimport { Tensor } from './tensor';\nimport { decodeUtf8String, LongUtil } from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport declare namespace Attribute {\n  export interface DataTypeMap {\n    float: number;\n    int: number;\n    string: string;\n    tensor: Tensor;\n    floats: number[];\n    ints: number[];\n    strings: string[];\n    tensors: Tensor[];\n  }\n\n  export type DataType = keyof DataTypeMap;\n}\n\ntype ValueTypes = Attribute.DataTypeMap[Attribute.DataType];\n\ntype Value = [ValueTypes, Attribute.DataType];\n\nexport class Attribute {\n  constructor(attributes: onnx.IAttributeProto[] | ortFbs.Attribute[] | null | undefined) {\n    this._attributes = new Map();\n    if (attributes !== null && attributes !== undefined) {\n      for (const attr of attributes) {\n        if (attr instanceof onnx.AttributeProto) {\n          this._attributes.set(attr.name, [Attribute.getValue(attr), Attribute.getType(attr)]);\n        } else if (attr instanceof ortFbs.Attribute) {\n          this._attributes.set(attr.name()!, [Attribute.getValue(attr), Attribute.getType(attr)]);\n        }\n      }\n      if (this._attributes.size < attributes.length) {\n        throw new Error('duplicated attribute names');\n      }\n    }\n  }\n\n  set(key: string, type: Attribute.DataType, value: ValueTypes): void {\n    this._attributes.set(key, [value, type]);\n  }\n  delete(key: string): void {\n    this._attributes.delete(key);\n  }\n  getFloat(key: string, defaultValue?: Attribute.DataTypeMap['float']) {\n    return this.get(key, 'float', defaultValue);\n  }\n\n  getInt(key: string, defaultValue?: Attribute.DataTypeMap['int']) {\n    return this.get(key, 'int', defaultValue);\n  }\n\n  getString(key: string, defaultValue?: Attribute.DataTypeMap['string']) {\n    return this.get(key, 'string', defaultValue);\n  }\n\n  getTensor(key: string, defaultValue?: Attribute.DataTypeMap['tensor']) {\n    return this.get(key, 'tensor', defaultValue);\n  }\n\n  getFloats(key: string, defaultValue?: Attribute.DataTypeMap['floats']) {\n    return this.get(key, 'floats', defaultValue);\n  }\n\n  getInts(key: string, defaultValue?: Attribute.DataTypeMap['ints']) {\n    return this.get(key, 'ints', defaultValue);\n  }\n\n  getStrings(key: string, defaultValue?: Attribute.DataTypeMap['strings']) {\n    return this.get(key, 'strings', defaultValue);\n  }\n\n  getTensors(key: string, defaultValue?: Attribute.DataTypeMap['tensors']) {\n    return this.get(key, 'tensors', defaultValue);\n  }\n\n  private get<V extends Attribute.DataTypeMap[Attribute.DataType]>(\n    key: string,\n    type: Attribute.DataType,\n    defaultValue?: V,\n  ): V {\n    const valueAndType = this._attributes.get(key);\n    if (valueAndType === undefined) {\n      if (defaultValue !== undefined) {\n        return defaultValue;\n      }\n      throw new Error(`required attribute not found: ${key}`);\n    }\n    if (valueAndType[1] !== type) {\n      throw new Error(`type mismatch: expected ${type} but got ${valueAndType[1]}`);\n    }\n    return valueAndType[0] as V;\n  }\n\n  private static getType(attr: onnx.IAttributeProto | ortFbs.Attribute): Attribute.DataType {\n    const type = attr instanceof onnx.AttributeProto ? attr.type : (attr as ortFbs.Attribute).type();\n    switch (type) {\n      case onnx.AttributeProto.AttributeType.FLOAT:\n        return 'float';\n      case onnx.AttributeProto.AttributeType.INT:\n        return 'int';\n      case onnx.AttributeProto.AttributeType.STRING:\n        return 'string';\n      case onnx.AttributeProto.AttributeType.TENSOR:\n        return 'tensor';\n      case onnx.AttributeProto.AttributeType.FLOATS:\n        return 'floats';\n      case onnx.AttributeProto.AttributeType.INTS:\n        return 'ints';\n      case onnx.AttributeProto.AttributeType.STRINGS:\n        return 'strings';\n      case onnx.AttributeProto.AttributeType.TENSORS:\n        return 'tensors';\n      default:\n        throw new Error(`attribute type is not supported yet: ${onnx.AttributeProto.AttributeType[type]}`);\n    }\n  }\n\n  private static getValue(attr: onnx.IAttributeProto | ortFbs.Attribute) {\n    const attrType = attr instanceof onnx.AttributeProto ? attr.type : (attr as ortFbs.Attribute).type();\n    if (attrType === onnx.AttributeProto.AttributeType.GRAPH || attrType === onnx.AttributeProto.AttributeType.GRAPHS) {\n      throw new Error('graph attribute is not supported yet');\n    }\n\n    const value = this.getValueNoCheck(attr);\n\n    // cast LONG to number\n    if (attrType === onnx.AttributeProto.AttributeType.INT && LongUtil.isLong(value)) {\n      return LongUtil.longToNumber(value as Long | flatbuffers.Long);\n    }\n\n    // cast LONG[] to number[]\n    if (attrType === onnx.AttributeProto.AttributeType.INTS) {\n      const arr = value as Array<number | Long | flatbuffers.Long>;\n      const numberValue: number[] = new Array<number>(arr.length);\n\n      for (let i = 0; i < arr.length; i++) {\n        const maybeLong = arr[i];\n        numberValue[i] = LongUtil.longToNumber(maybeLong);\n      }\n\n      return numberValue;\n    }\n\n    // cast onnx.TensorProto to onnxjs.Tensor\n    if (attrType === onnx.AttributeProto.AttributeType.TENSOR) {\n      return attr instanceof onnx.AttributeProto\n        ? Tensor.fromProto(value as onnx.ITensorProto)\n        : Tensor.fromOrtTensor(value as ortFbs.Tensor);\n    }\n\n    // cast onnx.TensorProto[] to onnxjs.Tensor[]\n    if (attrType === onnx.AttributeProto.AttributeType.TENSORS) {\n      if (attr instanceof onnx.AttributeProto) {\n        const tensorProtos = value as onnx.ITensorProto[];\n        return tensorProtos.map((value) => Tensor.fromProto(value));\n      } else if (attr instanceof ortFbs.Attribute) {\n        const tensorProtos = value as ortFbs.Tensor[];\n        return tensorProtos.map((value) => Tensor.fromOrtTensor(value));\n      }\n    }\n\n    // cast Uint8Array to string\n    if (attrType === onnx.AttributeProto.AttributeType.STRING) {\n      // string in onnx attribute is of uint8array type, so we need to convert it to string below. While in ort format,\n      // string attributes are returned as string, so no conversion is needed.\n      if (attr instanceof onnx.AttributeProto) {\n        const utf8String = value as Uint8Array;\n        return decodeUtf8String(utf8String);\n      }\n    }\n\n    // cast Uint8Array[] to string[]\n    if (attrType === onnx.AttributeProto.AttributeType.STRINGS) {\n      // strings in onnx attribute is returned as uint8array[], so we need to convert it to string[] below. While in ort\n      // format strings attributes are returned as string[], so no conversion is needed.\n      if (attr instanceof onnx.AttributeProto) {\n        const utf8Strings = value as Uint8Array[];\n        return utf8Strings.map(decodeUtf8String);\n      }\n    }\n\n    return value as ValueTypes;\n  }\n\n  private static getValueNoCheck(attr: onnx.IAttributeProto | ortFbs.Attribute) {\n    return attr instanceof onnx.AttributeProto\n      ? this.getValueNoCheckFromOnnxFormat(attr)\n      : this.getValueNoCheckFromOrtFormat(attr as ortFbs.Attribute);\n  }\n\n  private static getValueNoCheckFromOnnxFormat(attr: onnx.IAttributeProto) {\n    switch (attr.type!) {\n      case onnx.AttributeProto.AttributeType.FLOAT:\n        return attr.f;\n      case onnx.AttributeProto.AttributeType.INT:\n        return attr.i;\n      case onnx.AttributeProto.AttributeType.STRING:\n        return attr.s;\n      case onnx.AttributeProto.AttributeType.TENSOR:\n        return attr.t;\n      case onnx.AttributeProto.AttributeType.GRAPH:\n        return attr.g;\n      case onnx.AttributeProto.AttributeType.FLOATS:\n        return attr.floats;\n      case onnx.AttributeProto.AttributeType.INTS:\n        return attr.ints;\n      case onnx.AttributeProto.AttributeType.STRINGS:\n        return attr.strings;\n      case onnx.AttributeProto.AttributeType.TENSORS:\n        return attr.tensors;\n      case onnx.AttributeProto.AttributeType.GRAPHS:\n        return attr.graphs;\n      default:\n        throw new Error(`unsupported attribute type: ${onnx.AttributeProto.AttributeType[attr.type!]}`);\n    }\n  }\n\n  private static getValueNoCheckFromOrtFormat(attr: ortFbs.Attribute) {\n    switch (attr.type()) {\n      case ortFbs.AttributeType.FLOAT:\n        return attr.f();\n      case ortFbs.AttributeType.INT:\n        return attr.i();\n      case ortFbs.AttributeType.STRING:\n        return attr.s();\n      case ortFbs.AttributeType.TENSOR:\n        return attr.t();\n      case ortFbs.AttributeType.GRAPH:\n        return attr.g();\n      case ortFbs.AttributeType.FLOATS:\n        return attr.floatsArray();\n      case ortFbs.AttributeType.INTS: {\n        const ints = [];\n        for (let i = 0; i < attr.intsLength(); i++) {\n          ints.push(attr.ints(i)!);\n        }\n        return ints;\n      }\n      case ortFbs.AttributeType.STRINGS: {\n        const strings = [];\n        for (let i = 0; i < attr.stringsLength(); i++) {\n          strings.push(attr.strings(i));\n        }\n        return strings;\n      }\n      case ortFbs.AttributeType.TENSORS: {\n        const tensors = [];\n        for (let i = 0; i < attr.tensorsLength(); i++) {\n          tensors.push(attr.tensors(i)!);\n        }\n        return tensors;\n      }\n      // case ortFbs.AttributeType.GRAPHS:\n      // TODO: Subgraph not supported yet.\n      // const graphs = [];\n      // for (let i = 0; i < attr.graphsLength(); i++) {\n      //   graphs.push(attr.graphs(i)!);\n      // }\n      // return graphs;\n      default:\n        throw new Error(`unsupported attribute type: ${ortFbs.AttributeType[attr.type()]}`);\n    }\n  }\n\n  protected _attributes: Map<string, Value>;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Attribute } from './attribute';\nimport { onnxruntime } from './ort-schema/flatbuffers/ort-generated';\nimport { onnx } from './ort-schema/protobuf/onnx';\nimport { Tensor } from './tensor';\nimport { LongUtil, MAX_CLIP, MIN_CLIP, ProtoUtil } from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport declare namespace Graph {\n  export interface Shape {\n    readonly dims: readonly number[];\n  }\n  export interface ValueType {\n    readonly tensorType: Tensor.DataType;\n    readonly shape: Shape;\n  }\n  export interface Value {\n    // the tensor data. empty for non-initialized inputs\n    readonly tensor?: Tensor;\n\n    // index to the Node where the value comes from. -1 for initializer.\n    readonly from: number;\n\n    // indices to the Nodes where the values go to.\n    readonly to: readonly number[];\n\n    // value type specification. empty for non-input values.\n    readonly type?: ValueType;\n  }\n  export interface Node {\n    // name of the node\n    readonly name: string;\n\n    // the operator type\n    readonly opType: string;\n\n    // indices to the Values where the inputs come from.\n    readonly inputs: readonly number[];\n\n    // indices to the Values where the outpus go to.\n    readonly outputs: readonly number[];\n\n    // the attributes that used by the operator\n    readonly attributes: Attribute;\n  }\n\n  /**\n   * a Transformer is an instance that allows all possible transformation operations that applied to a graph\n   */\n  export interface Transformer {\n    removeAllIdentityNodes(): void;\n    removeAllDropoutNodes(): void;\n    fuseConvActivationNodes(): void;\n    // TODO: add generic functions to manipulate the graph\n  }\n\n  // an initializer can use transformer to transform the graph\n  export interface Initializer {\n    transformGraph(transformer: Transformer): void;\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport interface Graph {\n  getInputIndices(): readonly number[];\n  getInputNames(): readonly string[];\n  getOutputIndices(): readonly number[];\n  getOutputNames(): readonly string[];\n  getValues(): readonly Graph.Value[];\n  getNodes(): readonly Graph.Node[];\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-redeclare\nexport const Graph = {\n  /**\n   * construct a graph from a graph protobuf type\n   */\n  from: (graphProto: onnx.IGraphProto | ortFbs.Graph, initializer?: Graph.Initializer) =>\n    new GraphImpl(graphProto, initializer),\n};\n\nclass Value implements Graph.Value {\n  constructor(valueInfo?: onnx.IValueInfoProto) {\n    this._from = undefined;\n    this._to = [];\n    this.tensor = undefined;\n    this.type = undefined;\n\n    if (valueInfo) {\n      this.type = ProtoUtil.tensorValueTypeFromProto(valueInfo.type!.tensorType!);\n    }\n  }\n\n  _from?: number; // -1 represent from initializer\n  get from() {\n    return this._from!;\n  }\n  _to: number[];\n  get to() {\n    return this._to;\n  }\n  type?: Graph.ValueType;\n  tensor?: Tensor;\n}\n\nclass Node implements Graph.Node {\n  constructor(_nodeProto: onnx.INodeProto | ortFbs.Node, name?: string) {\n    if (_nodeProto instanceof onnx.NodeProto) {\n      this.name = _nodeProto.name;\n      this.opType = _nodeProto.opType;\n      this.attributes = new Attribute(_nodeProto.attribute);\n    } else if (_nodeProto instanceof ortFbs.Node) {\n      this.name = name ?? _nodeProto.name()!;\n      this.opType = _nodeProto.opType()!;\n      this.attributes = new Attribute(ProtoUtil.tensorAttributesFromORTFormat(_nodeProto));\n    }\n\n    this.inputs = [];\n    this.outputs = [];\n    this.executeNode = true;\n  }\n\n  name: string;\n  opType: string;\n  inputs: number[];\n  outputs: number[];\n  attributes: Attribute;\n  executeNode: boolean;\n}\n\nclass GraphImpl implements Graph, Graph.Transformer {\n  private _allData: Value[];\n\n  private _allInputIndices: number[];\n  private _allInputNames: string[];\n\n  private _allOutputIndices: number[];\n  private _allOutputNames: string[];\n\n  private _nodes: Node[];\n\n  constructor(graph: onnx.IGraphProto | ortFbs.Graph, graphInitializer?: Graph.Initializer) {\n    if (!graph) {\n      throw new TypeError('graph is empty');\n    }\n\n    // build the graph - will throw exceptions if something fatal is detected\n    this.buildGraph(graph);\n\n    // execute any transformation logic for the graph (if applicable)\n    this.transformGraph(graphInitializer);\n\n    // check for cycles and other inconsistencies - will throw exceptions if something fatal is detected\n    this.checkIsAcyclic();\n  }\n\n  getInputIndices(): readonly number[] {\n    return this._allInputIndices;\n  }\n\n  getInputNames(): readonly string[] {\n    return this._allInputNames;\n  }\n\n  getOutputIndices(): readonly number[] {\n    return this._allOutputIndices;\n  }\n\n  getOutputNames(): readonly string[] {\n    return this._allOutputNames;\n  }\n\n  getValues(): readonly Graph.Value[] {\n    return this._allData;\n  }\n\n  getNodes(): readonly Graph.Node[] {\n    return this._nodes;\n  }\n\n  private buildGraph(graph: onnx.IGraphProto | ortFbs.Graph) {\n    // build the graph - will throw exceptions if something fatal is detected\n    if (graph instanceof onnx.GraphProto) {\n      this.buildGraphFromOnnxFormat(graph);\n    } else if (graph instanceof ortFbs.Graph) {\n      this.buildGraphFromOrtFormat(graph);\n    } else {\n      throw new TypeError('Graph type is not supported.');\n    }\n  }\n  private buildGraphFromOnnxFormat(graph: onnx.IGraphProto) {\n    const dataIndices = new Map<string, number>();\n    this._allData = [];\n\n    this._allInputIndices = [];\n    this._allInputNames = [];\n\n    this._allOutputIndices = [];\n    this._allOutputNames = [];\n\n    this._nodes = [];\n\n    const nodesIndices = new Map<string, number>();\n\n    // scan all inputs\n    if (!graph.input) {\n      throw new Error('missing information in graph: input');\n    }\n    const inputValueNames = [];\n    for (const i of graph.input) {\n      if (dataIndices.has(i.name!)) {\n        throw new Error(`duplicated input name: ${i.name}`);\n      }\n      const currentIndex = this._allData.push(new Value(i)) - 1;\n      dataIndices.set(i.name!, currentIndex);\n      inputValueNames.push(i.name!);\n    }\n\n    // scan all initializers\n    if (!graph.initializer) {\n      throw new Error('missing information in graph: initializer');\n    }\n    for (const i of graph.initializer) {\n      let index = dataIndices.get(i.name!);\n      if (index === undefined) {\n        const value = new Value();\n        value.type = {\n          shape: { dims: ProtoUtil.tensorDimsFromProto(i.dims!) },\n          tensorType: ProtoUtil.tensorDataTypeFromProto(i.dataType!),\n        };\n        index = this._allData.push(value) - 1;\n        dataIndices.set(i.name!, index);\n      }\n      this._allData[index]._from = -1;\n      this._allData[index].tensor = Tensor.fromProto(i);\n    }\n\n    // filter out input indices\n    for (let i = 0; i < this._allData.length; i++) {\n      if (!this._allData[i].tensor) {\n        this._allInputIndices.push(i);\n        this._allInputNames.push(inputValueNames[i]);\n      }\n    }\n\n    // scan all outputs\n    if (!graph.output) {\n      throw new Error('missing information in graph: output');\n    }\n    for (const i of graph.output) {\n      if (dataIndices.has(i.name!)) {\n        throw new Error(`duplicated output name: ${i.name}`);\n      }\n      const currentIndex = this._allData.push(new Value(i)) - 1;\n      dataIndices.set(i.name!, currentIndex);\n      this._allOutputIndices.push(currentIndex);\n      this._allOutputNames.push(i.name!);\n    }\n\n    // scan all nodes\n    if (!graph.node) {\n      throw new Error('missing information in graph: node');\n    }\n    for (const nodeProto of graph.node) {\n      if (!nodeProto.name) {\n        // assign a name to the node if it doesn't have one\n        for (let pick = 0; ; pick++) {\n          const name = `unnamed_${nodeProto.opType}_${pick}`;\n          if (!nodesIndices.has(name)) {\n            nodeProto.name = name;\n            break;\n          }\n        }\n      }\n\n      if (nodesIndices.has(nodeProto.name)) {\n        throw new Error(`duplicated node name: ${nodeProto.name}`);\n      }\n      const currentIndex = this._nodes.push(new Node(nodeProto)) - 1;\n      nodesIndices.set(nodeProto.name, currentIndex);\n    }\n\n    // scan node's outputs\n    for (let i = 0; i < this._nodes.length; i++) {\n      const node = this._nodes[i];\n      const nodeProto = graph.node[i];\n      if (!nodeProto.output) {\n        throw new Error(`missing output for node: ${nodeProto.name}`);\n      }\n      for (const output of nodeProto.output) {\n        let dataIndex = dataIndices.get(output);\n        if (typeof dataIndex === 'undefined') {\n          dataIndex = this._allData.push(new Value()) - 1;\n          dataIndices.set(output, dataIndex);\n        }\n        node.outputs.push(dataIndex);\n\n        if (this._allData[dataIndex]._from !== undefined) {\n          throw new Error(`multiple nodes output to one data value: ${dataIndex}`);\n        }\n        this._allData[dataIndex]._from = i;\n\n        // for the 'Constant' operator, just create a new edge in the graph corresponding to the 'output' of the\n        // operator and ignore the node from the graph\n        if (nodeProto.opType === 'Constant') {\n          if (!nodeProto.attribute || nodeProto.attribute.length !== 1 || !nodeProto.attribute[0].t) {\n            throw new Error('missing attributes or missing tensor value in attributes for this Constant operator');\n          }\n          if (!nodeProto.output || nodeProto.output.length !== 1) {\n            throw new Error('missing output or incorrect number of outputs for this Constant operator');\n          }\n          node.outputs.pop();\n          node.executeNode = false;\n\n          this._allData[dataIndex]._from = -1;\n          this._allData[dataIndex].tensor = Tensor.fromProto(nodeProto.attribute[0].t);\n        }\n      }\n    }\n\n    // scan node's inputs\n    for (let i = 0; i < this._nodes.length; i++) {\n      const node = this._nodes[i];\n      const nodeProto = graph.node[i];\n\n      if (!nodeProto.input) {\n        throw new Error(`missing input for node: ${nodeProto.name}`);\n      }\n      for (const input of nodeProto.input) {\n        const dataIndex = dataIndices.get(input);\n        if (typeof dataIndex === 'undefined') {\n          // handle exception when opset > 9 and roi / scales not given\n          if (\n            input === '' &&\n            (nodeProto.input.length === 3 || nodeProto.input.length === 4) &&\n            nodeProto.opType === 'Resize'\n          ) {\n            continue;\n          }\n          throw new Error(`unrecognized input '${input}' for node: ${nodeProto.name}`);\n        }\n        node.inputs.push(dataIndex);\n\n        this._allData[dataIndex]._to.push(i);\n      }\n    }\n\n    return true;\n  }\n\n  private buildGraphFromOrtFormat(graph: ortFbs.Graph) {\n    const dataIndices = new Map<string, number>();\n    this._allData = [];\n\n    this._allInputIndices = [];\n    this._allInputNames = [];\n\n    this._allOutputIndices = [];\n    this._allOutputNames = [];\n\n    this._nodes = [];\n\n    const nodesIndices = new Map<string, number>();\n\n    // scan all inputs\n    const inputValueNames = [];\n    for (let i = 0; i < graph.inputsLength(); i++) {\n      const inputName = graph.inputs(i);\n      if (dataIndices.has(inputName)) {\n        throw new Error(`duplicated input name: ${inputName}`);\n      }\n      // Find the input typeInfo from nodeargs\n      for (let j = 0; j < graph.nodeArgsLength(); j++) {\n        if (graph.nodeArgs(j)?.name() === inputName) {\n          const value = new Value();\n          const valueType = graph.nodeArgs(j)?.type()?.valueType();\n          if (valueType !== ortFbs.TypeInfoValue.tensor_type) {\n            throw new Error('Unexpected value type for the nodeArg.');\n          }\n          const valueInfo = graph.nodeArgs(j)!.type()!.value(new ortFbs.TensorTypeAndShape())!;\n          const type = ProtoUtil.tensorDataTypeFromProto(valueInfo.elemType());\n          const shape = valueInfo.shape()!;\n          const dims = [];\n          for (let k = 0; k < shape.dimLength()!; k++) {\n            dims.push(LongUtil.longToNumber(shape.dim(k)!.value()!.dimValue()!));\n          }\n          value.type = { shape: { dims }, tensorType: type };\n          const currentIndex = this._allData.push(value) - 1;\n          dataIndices.set(inputName, currentIndex);\n          inputValueNames.push(inputName);\n        }\n      }\n    }\n    // check initializers\n    for (let i = 0; i < graph.initializersLength(); i++) {\n      const initializer = graph.initializers(i)!;\n      let index = dataIndices.get(initializer.name()!);\n      if (index === undefined) {\n        const value = new Value();\n        const dims = ProtoUtil.tensorDimsFromORTFormat(initializer);\n        const type = ProtoUtil.tensorDataTypeFromProto(initializer.dataType());\n        value.type = { shape: { dims }, tensorType: type };\n        index = this._allData.push(value) - 1;\n        dataIndices.set(initializer.name()!, index);\n      }\n      this._allData[index]._from = -1;\n      this._allData[index].tensor = Tensor.fromOrtTensor(initializer);\n    }\n\n    // filter out input indices\n    for (let i = 0; i < this._allData.length; i++) {\n      if (!this._allData[i].tensor) {\n        this._allInputIndices.push(i);\n        this._allInputNames.push(inputValueNames[i]);\n      }\n    }\n\n    // scan all outputs\n    for (let i = 0; i < graph.outputsLength(); i++) {\n      const outputName = graph.outputs(i);\n      if (dataIndices.has(outputName)) {\n        throw new Error(`duplicated output name: ${outputName}`);\n      }\n      const currentIndex = this._allData.push(new Value()) - 1;\n      dataIndices.set(outputName, currentIndex);\n      this._allOutputIndices.push(currentIndex);\n      this._allOutputNames.push(outputName);\n    }\n\n    // scan all nodes\n    if (!graph.nodes) {\n      throw new Error('missing information in graph: node');\n    }\n    for (let i = 0; i < graph.nodesLength(); i++) {\n      const nodeProto = graph.nodes(i);\n      let name = nodeProto!.name();\n      if (!name) {\n        // assign a name to the node if it doesn't have one\n        for (let pick = 0; ; pick++) {\n          name = `unnamed_${nodeProto!.opType()}_${pick}`;\n          if (!nodesIndices.has(name)) {\n            // an unique name is found. break.\n            break;\n          }\n        }\n      }\n\n      if (nodesIndices.has(name)) {\n        throw new Error(`duplicated node name: ${name}`);\n      }\n      const currentIndex = this._nodes.push(new Node(nodeProto!, name)) - 1;\n      nodesIndices.set(name, currentIndex);\n    }\n\n    // scan node's outputs\n    for (let i = 0; i < this._nodes.length; i++) {\n      const node = this._nodes[i];\n      const nodeProto = graph.nodes(i);\n      if (nodeProto == null) {\n        throw new Error(`No node exists at index ${i}`);\n      }\n      if (nodeProto?.outputsLength() === 0) {\n        throw new Error(`missing output for node: ${nodeProto.name}`);\n      }\n      for (let j = 0; j < nodeProto?.outputsLength(); j++) {\n        const output = nodeProto?.outputs(j);\n        let dataIndex = dataIndices.get(output);\n        if (typeof dataIndex === 'undefined') {\n          dataIndex = this._allData.push(new Value()) - 1;\n          dataIndices.set(output, dataIndex);\n        }\n        node.outputs.push(dataIndex);\n\n        if (this._allData[dataIndex]._from !== undefined) {\n          throw new Error(`multiple nodes output to one data value: ${dataIndex}`);\n        }\n        this._allData[dataIndex]._from = i;\n\n        // for the 'Constant' operator, just create a new edge in the graph corresponding to the 'output' of the\n        // operator and ignore the node from the graph\n        if (nodeProto.opType() === 'Constant') {\n          if (nodeProto.attributesLength() !== 1 || !nodeProto.attributes(0)!.t()) {\n            throw new Error('missing attributes or missing tensor value in attributes for this Constant operator');\n          }\n          if (nodeProto.outputsLength() !== 1) {\n            throw new Error('missing output or incorrect number of outputs for this Constant operator');\n          }\n          node.outputs.pop();\n          node.executeNode = false;\n\n          this._allData[dataIndex]._from = -1;\n          this._allData[dataIndex].tensor = Tensor.fromOrtTensor(nodeProto.attributes(0)!.t()!);\n        }\n      }\n    }\n\n    // scan node's inputs\n    for (let i = 0; i < this._nodes.length; i++) {\n      const node = this._nodes[i];\n      const nodeProto = graph.nodes(i)!;\n\n      if (nodeProto.inputsLength() === 0) {\n        throw new Error(`missing input for node: ${nodeProto.name}`);\n      }\n      for (let j = 0; j < nodeProto.inputsLength()!; j++) {\n        const input = nodeProto.inputs(j)!;\n        const dataIndex = dataIndices.get(input);\n        if (typeof dataIndex === 'undefined') {\n          throw new Error(`unrecognized input '${input}' for node: ${nodeProto!.name()}`);\n        }\n        node.inputs.push(dataIndex);\n\n        this._allData[dataIndex]._to.push(i);\n      }\n    }\n  }\n\n  private checkIsAcyclic() {\n    // go through the graph and check for cycles or other fatal inconsistencies\n    const starters: Set<number> = new Set<number>();\n    this._allInputIndices.forEach((i) => {\n      const data = this._allData[i];\n      data._to.forEach((j) => {\n        starters.add(j);\n      });\n    });\n\n    // Iterative DFS to check for cycles\n    const nodesStack = Array.from(starters);\n    const nodesState = new Array<string>(this._nodes.length).fill('white');\n\n    while (nodesStack.length > 0) {\n      const nodeIndex = nodesStack.pop()!;\n      // this node has now been processed completely. Mark this node 'black' to denote this.\n      if (nodesState[nodeIndex] === 'gray') {\n        nodesState[nodeIndex] = 'black';\n      } else {\n        // this node is under processing stage. mark this node 'gray' to denote this.\n        nodesStack.push(nodeIndex);\n        nodesState[nodeIndex] = 'gray';\n\n        this._nodes[nodeIndex].outputs.forEach((outgoingEdgeIndex) => {\n          const data = this._allData[outgoingEdgeIndex];\n          if (typeof data.tensor !== 'undefined') {\n            throw new Error('node outputs should not be initialized');\n          }\n          if (data._from !== nodeIndex) {\n            throw new Error(\"from property of the Value object doesn't match index of Node being processed\");\n          }\n          data._to.forEach((downstreamNodeIndex) => {\n            // back edge found - cyclic\n            if (nodesState[downstreamNodeIndex] === 'gray') {\n              throw new Error('model graph is cyclic');\n            }\n            // tree edge found - continue processing by adding it to stack\n            else if (nodesState[downstreamNodeIndex] === 'white') {\n              nodesStack.push(downstreamNodeIndex);\n            }\n          });\n        });\n      }\n    }\n  }\n\n  private transformGraph(graphInitializer?: Graph.Initializer): void {\n    // apply common transform\n    this.removeAllIdentityNodes();\n    this.removeAllDropoutNodes();\n    this.fuseConvActivationNodes();\n    // apply initializer specific transform\n    if (graphInitializer) {\n      graphInitializer.transformGraph(this);\n    }\n\n    // finalize graph\n    this.finalizeGraph();\n  }\n\n  /**\n   * finalize the graph.\n   *\n   * this function should be called after all the transformation completed.\n   * this function removes all unnecessary nodes and values from the graph\n   */\n  finalizeGraph() {\n    let offset = 0;\n    // delete all nodes that are not being executed\n    // The graph is represented using these two arrays\n    // this._nodes - Array holding the kernels to execute - each entry is a kernel pointing to this._allData\n    // this._allData - hold 2 fields - to [] & from - these feileds hold the graph map for inputs and outputs per node\n    // newIndices - remapping the graph after reading the flag 'executeNode'\n    const newIndices = new Array<number>(this._nodes.length, 0);\n    let nodePossition = 0;\n\n    for (let i = 0; i < this._nodes.length; i++) {\n      // giving new indexes to the nodes based on execution flag\n      newIndices[i] = nodePossition;\n      if (this._nodes[i].executeNode) {\n        if (nodePossition !== i) {\n          this._nodes[nodePossition] = this._nodes[i];\n        }\n        nodePossition++;\n      } else {\n        // delete all output values\n        this._nodes[i].outputs.forEach((ind) => {\n          this._allData[ind]._from = -2;\n        });\n      }\n    }\n\n    // removing the unused nodes\n    this._nodes.splice(nodePossition, this._nodes.length - nodePossition);\n\n    // Updating this._allData according to the new this._nodes\n    for (let i = 0; i < this._allData.length; i++) {\n      const currentData = this._allData[i];\n      if (currentData._from !== undefined && currentData._from !== -1 && currentData._from !== -2) {\n        currentData._from = newIndices[currentData._from];\n      }\n\n      for (let j = 0; j < currentData._to.length; j++) {\n        if (currentData._to[j] >= 0) {\n          currentData._to[j] = newIndices[currentData._to[j]];\n        } else {\n          throw new Error('Trying to update a removed node');\n        }\n      }\n    }\n\n    offset = 0;\n    // delete all values that are not being referenced\n    for (let i = 0; i < this._allData.length; i++) {\n      // if current value is neither linked to next node, nor an output value, remove it.\n      if (this._allData[i].from === -2 && this._allOutputIndices.indexOf(i + offset) === -1) {\n        offset++;\n        this._allData.splice(i, 1);\n        i--;\n        continue;\n      }\n      if (offset > 0) {\n        let ind = -1;\n        // if current value is neither an input value nor an initializer, find the node it's\n        // coming from and update the corresponding node output\n        if (this._allData[i].from !== undefined && this._allData[i].from !== -1) {\n          ind = this._nodes[this._allData[i].from].outputs.indexOf(i + offset);\n          if (ind !== -1) {\n            this._nodes[this._allData[i].from].outputs[ind] = i;\n          }\n        } else {\n          // if current value is an input value, update its reference in inputIndices\n          ind = this._allInputIndices.indexOf(i + offset);\n          if (ind !== -1) {\n            this._allInputIndices[ind] = i;\n          }\n        }\n\n        // find the node that the current value is linking to and update its input reference\n        this._allData[i].to.forEach((node) => {\n          ind = this._nodes[node].inputs.indexOf(i + offset);\n          if (ind !== -1) {\n            this._nodes[node].inputs[ind] = i;\n          }\n        });\n        if (this._allData[i].to.length === 0) {\n          // if current value is a graph output, update its reference in outputIndices\n          ind = this._allOutputIndices.indexOf(i + offset);\n          if (ind !== -1) {\n            this._allOutputIndices[ind] = i;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Delete the specified node. Assume the node has one incoming input and the first output connected to other nodes.\n   * An input validation must be done before calling this function.\n   * @param nodeIndex The index of node to be deleted\n   */\n  private deleteNode(nodeIndex: number) {\n    const node = this._nodes[nodeIndex];\n    if (node.outputs.length > 1) {\n      for (let i = 1; i < node.outputs.length; i++) {\n        if (this._allData[node.outputs[i]].to.length > 0) {\n          throw new Error('Node deletion with more than one output connected to other nodes is not supported. ');\n        }\n      }\n    }\n\n    // this node wil not be executed\n    node.executeNode = false;\n    const inputValueIndex = node.inputs[0];\n    const outputValueIndex = node.outputs[0];\n    const nodesConsumingOutput = this._allData[outputValueIndex].to;\n\n    // remove this node from the to property of the input Value\n    for (let i = 0; i < node.inputs.length; i++) {\n      const delIndex = this._allData[node.inputs[i]].to.indexOf(nodeIndex);\n      // should not happen\n      if (delIndex === -1) {\n        throw new Error(\"The Value object doesn't have the current Node in it's 'to' property \");\n      }\n      this._allData[node.inputs[i]].to.splice(delIndex, 1);\n    }\n\n    // clear node indices consuming this output Value\n    this._allData[outputValueIndex]._to = [];\n\n    // if the output of this node is a graph output, adjust the index appropriately\n    const index = this._allOutputIndices.indexOf(outputValueIndex);\n    if (index !== -1) {\n      this._allOutputIndices[index] = inputValueIndex;\n    }\n\n    // override the inputs for nodes consuming this node's output with the input to this node\n    if (nodesConsumingOutput && nodesConsumingOutput.length > 0) {\n      for (const nodeIndex of nodesConsumingOutput) {\n        const replaceIndex = this._nodes[nodeIndex].inputs.indexOf(outputValueIndex);\n        // should not happen\n        if (replaceIndex === -1) {\n          throw new Error(\"The Node object doesn't have the output Value in it's 'inputs' property \");\n        }\n        this._nodes[nodeIndex].inputs[replaceIndex] = inputValueIndex;\n        this._allData[inputValueIndex].to.push(nodeIndex);\n      }\n    }\n  }\n\n  removeAllDropoutNodes() {\n    let nodeIndex = 0;\n    for (const node of this._nodes) {\n      // weed out 'Dropout' nodes so that no time is wasted in execution\n      if (node.opType === 'Dropout') {\n        // the node should have exactly 1 input and 1 or 2 outputs\n        if (node.inputs.length !== 1) {\n          throw new Error('Dropout nodes should only contain one input. ');\n        }\n        if (node.outputs.length !== 1 && node.outputs.length !== 2) {\n          throw new Error('Dropout nodes should contain either 1 or 2 output(s)');\n        }\n        // the second output should not be referenced by any other node\n        if (node.outputs.length === 2 && this._allData[node.outputs[1]]._to.length !== 0) {\n          throw new Error(\"Dropout nodes's second output should not be referenced by other nodes\");\n        }\n        this.deleteNode(nodeIndex);\n      }\n      nodeIndex++;\n    }\n  }\n\n  removeAllIdentityNodes() {\n    let nodeIndex = 0;\n    for (const node of this._nodes) {\n      // weed out 'Identity' nodes so that no time is wasted in execution\n      if (node.opType === 'Identity') {\n        this.deleteNode(nodeIndex);\n      }\n      nodeIndex++;\n    }\n  }\n\n  isActivation(n: Node): boolean {\n    switch (n.opType) {\n      // TODO: add other activation methods\n      case 'Relu':\n      case 'Sigmoid':\n      case 'Clip':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  fuseConvActivationNodes() {\n    for (const node of this._nodes) {\n      if (node.opType === 'Conv') {\n        const next = this._allData[node.outputs[0]]._to;\n        if (next.length === 1 && this.isActivation(this._nodes[next[0]])) {\n          const child = this._nodes[next[0]];\n          if (child.opType === 'Clip') {\n            if (child.inputs.length === 1) {\n              try {\n                node.attributes.set('activation_params', 'floats', [\n                  child.attributes.getFloat('min'),\n                  child.attributes.getFloat('max'),\n                ]);\n              } catch (e) {\n                node.attributes.set('activation_params', 'floats', [MIN_CLIP, MAX_CLIP]);\n              }\n            } else if (\n              child.inputs.length >= 3 &&\n              this._allData[child.inputs[1]].tensor !== undefined &&\n              this._allData[child.inputs[2]].tensor !== undefined\n            ) {\n              node.attributes.set('activation_params', 'floats', [\n                this._allData[child.inputs[1]].tensor!.floatData[0],\n                this._allData[child.inputs[2]].tensor!.floatData[0],\n              ]);\n            } else {\n              // Skip fusion with clip node since clip min and clip max are not coming from initializer\n              continue;\n            }\n          }\n          node.attributes.set('activation', 'string', child.opType);\n          this.deleteNode(next[0]);\n        }\n      }\n    }\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { flatbuffers } from 'flatbuffers';\n\nimport { Graph } from './graph';\nimport { OpSet } from './opset';\nimport { onnxruntime } from './ort-schema/flatbuffers/ort-generated';\nimport { onnx } from './ort-schema/protobuf/onnx';\nimport { LongUtil } from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport class Model {\n  // empty model\n  constructor() {}\n\n  load(buf: Uint8Array, graphInitializer?: Graph.Initializer, isOrtFormat?: boolean): void {\n    let onnxError: Error | undefined;\n    if (!isOrtFormat) {\n      // isOrtFormat === false || isOrtFormat === undefined\n      try {\n        this.loadFromOnnxFormat(buf, graphInitializer);\n        return;\n      } catch (e) {\n        if (isOrtFormat !== undefined) {\n          throw e;\n        }\n        onnxError = e;\n      }\n    }\n\n    try {\n      this.loadFromOrtFormat(buf, graphInitializer);\n    } catch (e) {\n      if (isOrtFormat !== undefined) {\n        throw e;\n      }\n      // Tried both formats and failed (when isOrtFormat === undefined)\n      throw new Error(`Failed to load model as ONNX format: ${onnxError}\\nas ORT format: ${e}`);\n    }\n  }\n\n  private loadFromOnnxFormat(buf: Uint8Array, graphInitializer?: Graph.Initializer): void {\n    const modelProto = onnx.ModelProto.decode(buf);\n    const irVersion = LongUtil.longToNumber(modelProto.irVersion);\n    if (irVersion < 3) {\n      throw new Error('only support ONNX model with IR_VERSION>=3');\n    }\n\n    this._opsets = modelProto.opsetImport.map((i) => ({\n      domain: i.domain as string,\n      version: LongUtil.longToNumber(i.version!),\n    }));\n\n    this._graph = Graph.from(modelProto.graph!, graphInitializer);\n  }\n\n  private loadFromOrtFormat(buf: Uint8Array, graphInitializer?: Graph.Initializer): void {\n    const fb = new flatbuffers.ByteBuffer(buf);\n    const ortModel = ortFbs.InferenceSession.getRootAsInferenceSession(fb).model()!;\n    const irVersion = LongUtil.longToNumber(ortModel.irVersion());\n    if (irVersion < 3) {\n      throw new Error('only support ONNX model with IR_VERSION>=3');\n    }\n    this._opsets = [];\n    for (let i = 0; i < ortModel.opsetImportLength(); i++) {\n      const opsetId = ortModel.opsetImport(i)!;\n      this._opsets.push({ domain: opsetId?.domain() as string, version: LongUtil.longToNumber(opsetId.version()!) });\n    }\n\n    this._graph = Graph.from(ortModel.graph()!, graphInitializer);\n  }\n\n  private _graph: Graph;\n  get graph(): Graph {\n    return this._graph;\n  }\n\n  private _opsets: OpSet[];\n  get opsets(): readonly OpSet[] {\n    return this._opsets;\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { resolveBackend, SessionHandlerType } from './backend';\nimport { ExecutionPlan } from './execution-plan';\nimport { Graph } from './graph';\nimport { Profiler } from './instrument';\nimport { Model } from './model';\nimport { Operator } from './operators';\nimport { Tensor } from './tensor';\n\nexport declare namespace Session {\n  export interface Config {\n    backendHint?: string;\n    profiler?: Profiler.Config;\n  }\n\n  export interface Context {\n    profiler: Readonly<Profiler>;\n    graphInputTypes?: Tensor.DataType[];\n    graphInputDims?: Array<readonly number[]>;\n  }\n}\n\nexport class Session {\n  constructor(config: Session.Config = {}) {\n    this._initialized = false;\n    this.backendHint = config.backendHint;\n    this.profiler = Profiler.create(config.profiler);\n    this.context = { profiler: this.profiler, graphInputTypes: [], graphInputDims: [] };\n  }\n\n  get inputNames(): readonly string[] {\n    return this._model.graph.getInputNames();\n  }\n  get outputNames(): readonly string[] {\n    return this._model.graph.getOutputNames();\n  }\n\n  startProfiling() {\n    this.profiler.start();\n  }\n\n  endProfiling() {\n    this.profiler.stop();\n  }\n\n  async loadModel(uri: string): Promise<void>;\n  async loadModel(buffer: ArrayBuffer, byteOffset?: number, length?: number): Promise<void>;\n  async loadModel(buffer: Uint8Array): Promise<void>;\n  async loadModel(arg: string | ArrayBuffer | Uint8Array, byteOffset?: number, length?: number): Promise<void> {\n    await this.profiler.event('session', 'Session.loadModel', async () => {\n      // resolve backend and session handler\n      const backend = await resolveBackend(this.backendHint);\n      this.sessionHandler = backend.createSessionHandler(this.context);\n\n      this._model = new Model();\n      if (typeof arg === 'string') {\n        const isOrtFormat = arg.endsWith('.ort');\n        if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n          // node\n          const { readFile } = require('node:fs/promises');\n          const buf = await readFile(arg);\n          this.initialize(buf, isOrtFormat);\n        } else {\n          // browser\n          const response = await fetch(arg);\n          const buf = await response.arrayBuffer();\n          this.initialize(new Uint8Array(buf), isOrtFormat);\n        }\n      } else if (!ArrayBuffer.isView(arg)) {\n        // load model from ArrayBuffer\n        const arr = new Uint8Array(arg, byteOffset || 0, length || arg.byteLength);\n        this.initialize(arr);\n      } else {\n        // load model from Uint8array\n        this.initialize(arg);\n      }\n    });\n  }\n\n  private initialize(modelProtoBlob: Uint8Array, isOrtFormat?: boolean): void {\n    if (this._initialized) {\n      throw new Error('already initialized');\n    }\n\n    this.profiler.event('session', 'Session.initialize', () => {\n      // load graph\n      const graphInitializer = this.sessionHandler.transformGraph\n        ? (this.sessionHandler as Graph.Initializer)\n        : undefined;\n      this._model.load(modelProtoBlob, graphInitializer, isOrtFormat);\n\n      // graph is completely initialzied at this stage , let the interested handlers know\n      if (this.sessionHandler.onGraphInitialized) {\n        this.sessionHandler.onGraphInitialized(this._model.graph);\n      }\n      // initialize each operator in the graph\n      this.initializeOps(this._model.graph);\n\n      // instantiate an ExecutionPlan object to be used by the Session object\n      this._executionPlan = new ExecutionPlan(this._model.graph, this._ops, this.profiler);\n    });\n\n    this._initialized = true;\n  }\n\n  async run(inputs: Map<string, Tensor> | Tensor[]): Promise<Map<string, Tensor>> {\n    if (!this._initialized) {\n      throw new Error('session not initialized yet');\n    }\n\n    return this.profiler.event('session', 'Session.run', async () => {\n      const inputTensors = this.normalizeAndValidateInputs(inputs);\n\n      const outputTensors = await this._executionPlan.execute(this.sessionHandler, inputTensors);\n\n      return this.createOutput(outputTensors);\n    });\n  }\n\n  private normalizeAndValidateInputs(inputs: Map<string, Tensor> | Tensor[]): Tensor[] {\n    const modelInputNames = this._model.graph.getInputNames();\n\n    // normalize inputs\n    // inputs: Tensor[]\n    if (Array.isArray(inputs)) {\n      if (inputs.length !== modelInputNames.length) {\n        throw new Error(`incorrect input array length: expected ${modelInputNames.length} but got ${inputs.length}`);\n      }\n    }\n    // convert map to array\n    // inputs: Map<string, Tensor>\n    else {\n      if (inputs.size !== modelInputNames.length) {\n        throw new Error(`incorrect input map size: expected ${modelInputNames.length} but got ${inputs.size}`);\n      }\n\n      const sortedInputs = new Array<Tensor>(inputs.size);\n      let sortedInputsIndex = 0;\n      for (let i = 0; i < modelInputNames.length; ++i) {\n        const tensor = inputs.get(modelInputNames[i]);\n        if (!tensor) {\n          throw new Error(`missing input tensor for: '${name}'`);\n        }\n        sortedInputs[sortedInputsIndex++] = tensor;\n      }\n\n      inputs = sortedInputs;\n    }\n\n    // validate dims requirements\n    // First session run - graph input data is not cached for the session\n    if (\n      !this.context.graphInputTypes ||\n      this.context.graphInputTypes.length === 0 ||\n      !this.context.graphInputDims ||\n      this.context.graphInputDims.length === 0\n    ) {\n      const modelInputIndices = this._model.graph.getInputIndices();\n      const modelValues = this._model.graph.getValues();\n\n      const graphInputDims = new Array<readonly number[]>(modelInputIndices.length);\n\n      for (let i = 0; i < modelInputIndices.length; ++i) {\n        const graphInput = modelValues[modelInputIndices[i]];\n        graphInputDims[i] = graphInput.type!.shape.dims;\n\n        // cached for second and subsequent runs.\n        // Some parts of the framework works on the assumption that the graph and types and shapes are static\n        this.context.graphInputTypes!.push(graphInput.type!.tensorType);\n        this.context.graphInputDims!.push(inputs[i].dims);\n      }\n\n      this.validateInputTensorDims(graphInputDims, inputs, true);\n    }\n\n    // Second and subsequent session runs - graph input data is cached for the session\n    else {\n      this.validateInputTensorDims(this.context.graphInputDims, inputs, false);\n    }\n\n    // validate types requirement\n    this.validateInputTensorTypes(this.context.graphInputTypes!, inputs);\n\n    return inputs;\n  }\n\n  private validateInputTensorTypes(graphInputTypes: Tensor.DataType[], givenInputs: Tensor[]) {\n    for (let i = 0; i < givenInputs.length; i++) {\n      const expectedType = graphInputTypes[i];\n      const actualType = givenInputs[i].type;\n      if (expectedType !== actualType) {\n        throw new Error(`input tensor[${i}] check failed: expected type '${expectedType}' but got ${actualType}`);\n      }\n    }\n  }\n\n  private validateInputTensorDims(\n    graphInputDims: Array<readonly number[]>,\n    givenInputs: Tensor[],\n    noneDimSupported: boolean,\n  ) {\n    for (let i = 0; i < givenInputs.length; i++) {\n      const expectedDims = graphInputDims[i];\n      const actualDims = givenInputs[i].dims;\n      if (!this.compareTensorDims(expectedDims, actualDims, noneDimSupported)) {\n        throw new Error(\n          `input tensor[${i}] check failed: expected shape '[${expectedDims.join(',')}]' but got [${actualDims.join(\n            ',',\n          )}]`,\n        );\n      }\n    }\n  }\n\n  private compareTensorDims(\n    expectedDims: readonly number[],\n    actualDims: readonly number[],\n    noneDimSupported: boolean,\n  ): boolean {\n    if (expectedDims.length !== actualDims.length) {\n      return false;\n    }\n\n    for (let i = 0; i < expectedDims.length; ++i) {\n      if (expectedDims[i] !== actualDims[i] && (!noneDimSupported || expectedDims[i] !== 0)) {\n        // data shape mis-match AND not a 'None' dimension.\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  private createOutput(outputTensors: Tensor[]): Map<string, Tensor> {\n    const modelOutputNames = this._model.graph.getOutputNames();\n    if (outputTensors.length !== modelOutputNames.length) {\n      throw new Error('expected number of outputs do not match number of generated outputs');\n    }\n\n    const output = new Map<string, Tensor>();\n    for (let i = 0; i < modelOutputNames.length; ++i) {\n      output.set(modelOutputNames[i], outputTensors[i]);\n    }\n\n    return output;\n  }\n\n  private initializeOps(graph: Graph): void {\n    const nodes = graph.getNodes();\n    this._ops = new Array(nodes.length);\n\n    for (let i = 0; i < nodes.length; i++) {\n      this._ops[i] = this.sessionHandler.resolve(nodes[i], this._model.opsets, graph);\n    }\n  }\n\n  private _model: Model;\n  private _initialized: boolean;\n\n  private _ops: Operator[];\n  private _executionPlan: ExecutionPlan;\n\n  private backendHint?: string;\n\n  private sessionHandler: SessionHandlerType;\n  private context: Session.Context;\n  private profiler: Readonly<Profiler>;\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { InferenceSession, InferenceSessionHandler, SessionHandler, Tensor } from 'onnxruntime-common';\n\nimport { Session } from './session';\nimport { Tensor as OnnxjsTensor } from './tensor';\n\nexport class OnnxjsSessionHandler implements InferenceSessionHandler {\n  constructor(private session: Session) {\n    this.inputNames = this.session.inputNames;\n    this.outputNames = this.session.outputNames;\n  }\n\n  async dispose(): Promise<void> {}\n  inputNames: readonly string[];\n  outputNames: readonly string[];\n  async run(\n    feeds: SessionHandler.FeedsType,\n    _fetches: SessionHandler.FetchesType,\n    _options: InferenceSession.RunOptions,\n  ): Promise<SessionHandler.ReturnType> {\n    const inputMap = new Map<string, OnnxjsTensor>();\n    for (const name in feeds) {\n      if (Object.hasOwnProperty.call(feeds, name)) {\n        const feed = feeds[name];\n        inputMap.set(\n          name,\n          new OnnxjsTensor(\n            feed.dims,\n            feed.type as OnnxjsTensor.DataType,\n            undefined,\n            undefined,\n            feed.data as OnnxjsTensor.NumberType,\n          ),\n        );\n      }\n    }\n    const outputMap = await this.session.run(inputMap);\n    const output: SessionHandler.ReturnType = {};\n    outputMap.forEach((tensor, name) => {\n      output[name] = new Tensor(tensor.type, tensor.data, tensor.dims);\n    });\n    return output;\n  }\n  startProfiling(): void {\n    this.session.startProfiling();\n  }\n  endProfiling(): void {\n    this.session.endProfiling();\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable import/no-internal-modules */\nimport { Backend, InferenceSession, InferenceSessionHandler } from 'onnxruntime-common';\n\nimport { Session } from './onnxjs/session';\nimport { OnnxjsSessionHandler } from './onnxjs/session-handler-inference';\n\nclass OnnxjsBackend implements Backend {\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  async init(): Promise<void> {}\n\n  async createInferenceSessionHandler(\n    pathOrBuffer: string | Uint8Array,\n    options?: InferenceSession.SessionOptions,\n  ): Promise<InferenceSessionHandler> {\n    // NOTE: Session.Config(from onnx.js) is not compatible with InferenceSession.SessionOptions(from\n    // onnxruntime-common).\n    //       In future we should remove Session.Config and use InferenceSession.SessionOptions.\n    //       Currently we allow this to happen to make test runner work.\n    const session = new Session(options as unknown as Session.Config);\n\n    // typescript cannot merge method override correctly (so far in 4.2.3). need if-else to call the method.\n    if (typeof pathOrBuffer === 'string') {\n      await session.loadModel(pathOrBuffer);\n    } else {\n      await session.loadModel(pathOrBuffer);\n    }\n\n    return new OnnxjsSessionHandler(session);\n  }\n}\n\nexport const onnxjsBackend = new OnnxjsBackend();\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport const isNode = !!(typeof process !== 'undefined' && process.versions && process.versions.node);\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/// <reference lib=\"webworker\" />\n\n//\n// * type hack for \"HTMLImageElement\"\n//\n// in typescript, the type of \"HTMLImageElement\" is defined in lib.dom.d.ts, which is conflict with lib.webworker.d.ts.\n// when we use webworker, the lib.webworker.d.ts will be used, which does not have HTMLImageElement defined.\n//\n// we will get the following errors complaining that HTMLImageElement is not defined:\n//\n// ====================================================================================================================\n//\n// ../common/dist/cjs/tensor-factory.d.ts:187:29 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 187     fromImage(imageElement: HTMLImageElement, options?: TensorFromImageElementOptions):\n// Promise<TypedTensor<'float32'> | TypedTensor<'uint8'>>;\n//                                 ~~~~~~~~~~~~~~~~\n//\n// node_modules/@webgpu/types/dist/index.d.ts:83:7 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 83     | HTMLImageElement\n//          ~~~~~~~~~~~~~~~~\n//\n// ====================================================================================================================\n//\n// `HTMLImageElement` is only used in type declaration and not in real code. So we define it as `unknown` here to\n// bypass the type check.\n\n//\n// * type hack for \"document\"\n//\n// in typescript, the type of \"document\" is defined in lib.dom.d.ts, so it's not available in webworker.\n//\n// we will get the following errors complaining that document is not defined:\n//\n// ====================================================================================================================\n//\n// lib/wasm/wasm-utils-import.ts:7:33 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n//                                   ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:61 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n//                                                               ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:88 - error TS2552: Cannot find name 'HTMLScriptElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n//                                                                                          ~~~~~~~~~~~~~~~~~\n// ====================================================================================================================\n//\n// `document` is used to get the current script URL, which is not available in webworker. This file is served as a\n// \"dual\" file for entries of both webworker and the esm module.\n//\ndeclare global {\n  type HTMLImageElement = unknown;\n  type HTMLScriptElement = { src?: string };\n  const document: undefined | { currentScript?: HTMLScriptElement };\n}\n\n/**\n * @summary\n *\n * This file is served as a \"dual\" file for both entries of the following:\n * - The proxy worker itself.\n *   - When used as a worker, it listens to the messages from the main thread and performs the corresponding operations.\n *   - Should be imported directly using `new Worker()` in the main thread.\n *\n * - The ESM module that creates the proxy worker (as a worker launcher).\n *   - When used as a worker launcher, it creates the proxy worker and returns it.\n *   - Should be imported using `import()` in the main thread, with the query parameter `import=1`.\n *\n * This file will be always compiling into ESM format.\n */\n\nimport type { OrtWasmMessage, SerializableTensorMetadata } from '../proxy-messages.js';\nimport {\n  createSession,\n  copyFromExternalBuffer,\n  endProfiling,\n  extractTransferableBuffers,\n  initEp,\n  initRuntime,\n  releaseSession,\n  run,\n} from '../wasm-core-impl.js';\nimport { initializeWebAssembly } from '../wasm-factory.js';\nimport { scriptSrc } from '../wasm-utils-import.js';\n\nconst WORKER_NAME = 'ort-wasm-proxy-worker';\nconst isProxyWorker = globalThis.self?.name === WORKER_NAME;\n\nif (isProxyWorker) {\n  // Worker thread\n  self.onmessage = (ev: MessageEvent<OrtWasmMessage>): void => {\n    const { type, in: message } = ev.data;\n    try {\n      switch (type) {\n        case 'init-wasm':\n          initializeWebAssembly(message!.wasm).then(\n            () => {\n              initRuntime(message!).then(\n                () => {\n                  postMessage({ type });\n                },\n                (err) => {\n                  postMessage({ type, err });\n                },\n              );\n            },\n            (err) => {\n              postMessage({ type, err });\n            },\n          );\n          break;\n        case 'init-ep': {\n          const { epName, env } = message!;\n          initEp(env, epName).then(\n            () => {\n              postMessage({ type });\n            },\n            (err) => {\n              postMessage({ type, err });\n            },\n          );\n          break;\n        }\n        case 'copy-from': {\n          const { buffer } = message!;\n          const bufferData = copyFromExternalBuffer(buffer);\n          postMessage({ type, out: bufferData } as OrtWasmMessage);\n          break;\n        }\n        case 'create': {\n          const { model, options } = message!;\n          createSession(model, options).then(\n            (sessionMetadata) => {\n              postMessage({ type, out: sessionMetadata } as OrtWasmMessage);\n            },\n            (err) => {\n              postMessage({ type, err });\n            },\n          );\n          break;\n        }\n        case 'release':\n          releaseSession(message!);\n          postMessage({ type });\n          break;\n        case 'run': {\n          const { sessionId, inputIndices, inputs, outputIndices, options } = message!;\n          run(sessionId, inputIndices, inputs, outputIndices, new Array(outputIndices.length).fill(null), options).then(\n            (outputs) => {\n              if (outputs.some((o) => o[3] !== 'cpu')) {\n                postMessage({ type, err: 'Proxy does not support non-cpu tensor location.' });\n              } else {\n                postMessage(\n                  { type, out: outputs } as OrtWasmMessage,\n                  extractTransferableBuffers([...inputs, ...outputs] as SerializableTensorMetadata[]),\n                );\n              }\n            },\n            (err) => {\n              postMessage({ type, err });\n            },\n          );\n          break;\n        }\n        case 'end-profiling':\n          endProfiling(message!);\n          postMessage({ type });\n          break;\n        default:\n      }\n    } catch (err) {\n      postMessage({ type, err } as OrtWasmMessage);\n    }\n  };\n}\n\nexport default isProxyWorker\n  ? null\n  : (urlOverride?: string) =>\n      new Worker(urlOverride ?? scriptSrc!, { type: BUILD_DEFS.IS_ESM ? 'module' : 'classic', name: WORKER_NAME });\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport type { OrtWasmModule } from './wasm-types';\nimport { isNode } from './wasm-utils-env';\n\n/**\n * The classic script source URL. This is not always available in non ESModule environments.\n *\n * In Node.js, this is undefined.\n */\nexport const scriptSrc =\n  // if Nodejs, return undefined\n  isNode\n    ? undefined\n    : // if It's ESM, use import.meta.url\n      (BUILD_DEFS.ESM_IMPORT_META_URL ??\n      // use `document.currentScript.src` if available\n      (typeof document !== 'undefined'\n        ? (document.currentScript as HTMLScriptElement)?.src\n        : // use `self.location.href` if available\n          typeof self !== 'undefined'\n          ? self.location?.href\n          : undefined));\n\n/**\n * The origin of the current location.\n *\n * In Node.js, this is undefined.\n */\nconst origin = isNode || typeof location === 'undefined' ? undefined : location.origin;\n\n/**\n * Check if the given filename with prefix is from the same origin.\n */\nconst isSameOrigin = (filename: string, prefixOverride?: string) => {\n  try {\n    const baseUrl = prefixOverride ?? scriptSrc;\n    const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n    return url.origin === origin;\n  } catch {\n    return false;\n  }\n};\n\n/**\n * Normalize the inputs to an absolute URL with the given prefix override. If failed, return undefined.\n */\nconst normalizeUrl = (filename: string, prefixOverride?: string) => {\n  const baseUrl = prefixOverride ?? scriptSrc;\n  try {\n    const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n    return url.href;\n  } catch {\n    return undefined;\n  }\n};\n\n/**\n * Create a fallback URL if an absolute URL cannot be created by the normalizeUrl function.\n */\nconst fallbackUrl = (filename: string, prefixOverride?: string) => `${prefixOverride ?? './'}${filename}`;\n\n/**\n * This helper function is used to preload a module from a URL.\n *\n * If the origin of the worker URL is different from the current origin, the worker cannot be loaded directly.\n * See discussions in https://github.com/webpack-contrib/worker-loader/issues/154\n *\n * In this case, we will fetch the worker URL and create a new Blob URL with the same origin as a workaround.\n *\n * @param absoluteUrl - The absolute URL to preload.\n *\n * @returns - A promise that resolves to a new Blob URL\n */\nconst preload = async (absoluteUrl: string): Promise<string> => {\n  const response = await fetch(absoluteUrl, { credentials: 'same-origin' });\n  const blob = await response.blob();\n  return URL.createObjectURL(blob);\n};\n\n/**\n * This helper function is used to dynamically import a module from a URL.\n *\n * The build script has special handling for this function to ensure that the URL is not bundled into the final output.\n *\n * @param url - The URL to import.\n *\n * @returns - A promise that resolves to the default export of the module.\n */\nconst dynamicImportDefault = async <T>(url: string): Promise<T> =>\n  (await import(/* webpackIgnore: true */ url)).default;\n\n/**\n * The proxy worker factory imported from the proxy worker module.\n *\n * This is only available when the WebAssembly proxy is not disabled.\n */\nconst createProxyWorker: ((urlOverride?: string) => Worker) | undefined =\n  // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n  BUILD_DEFS.DISABLE_WASM_PROXY ? undefined : require('./proxy-worker/main').default;\n\n/**\n * Import the proxy worker.\n *\n * This function will perform the following steps:\n * 1. If a preload is needed, it will preload the module and return the object URL.\n * 2. Use the proxy worker factory to create the proxy worker.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n *            - The object URL of the preloaded module, or undefined if no preload is needed.\n *            - The proxy worker.\n */\nexport const importProxyWorker = async (): Promise<[undefined | string, Worker]> => {\n  if (!scriptSrc) {\n    throw new Error('Failed to load proxy worker: cannot determine the script source URL.');\n  }\n\n  // If the script source is from the same origin, we can use the embedded proxy module directly.\n  if (isSameOrigin(scriptSrc)) {\n    return [undefined, createProxyWorker!()];\n  }\n\n  // Otherwise, need to preload\n  const url = await preload(scriptSrc);\n  return [url, createProxyWorker!(url)];\n};\n\n/**\n * The embedded WebAssembly module.\n *\n * This is only available in ESM and when embedding is not disabled.\n */\nconst embeddedWasmModule: EmscriptenModuleFactory<OrtWasmModule> | undefined =\n  BUILD_DEFS.IS_ESM && BUILD_DEFS.DISABLE_DYNAMIC_IMPORT\n    ? // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n      require(\n        !BUILD_DEFS.DISABLE_TRAINING\n          ? '../../dist/ort-training-wasm-simd-threaded.mjs'\n          : !BUILD_DEFS.DISABLE_JSEP\n            ? '../../dist/ort-wasm-simd-threaded.jsep.mjs'\n            : '../../dist/ort-wasm-simd-threaded.mjs',\n      ).default\n    : undefined;\n\n/**\n * Import the WebAssembly module.\n *\n * This function will perform the following steps:\n * 1. If BUILD_DEFS.DISABLE_DYNAMIC_IMPORT is true, use the embedded module.\n * 2. If a preload is needed, it will preload the module and return the object URL.\n * 3. Otherwise, it will perform a dynamic import of the module.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n *            - The object URL of the preloaded module, or undefined if no preload is needed.\n *            - The default export of the module, which is a factory function to create the WebAssembly module.\n */\nexport const importWasmModule = async (\n  urlOverride: string | undefined,\n  prefixOverride: string | undefined,\n  isMultiThreaded: boolean,\n): Promise<[undefined | string, EmscriptenModuleFactory<OrtWasmModule>]> => {\n  if (BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n    return [undefined, embeddedWasmModule!];\n  } else {\n    const wasmModuleFilename = !BUILD_DEFS.DISABLE_TRAINING\n      ? 'ort-training-wasm-simd-threaded.mjs'\n      : !BUILD_DEFS.DISABLE_JSEP\n        ? 'ort-wasm-simd-threaded.jsep.mjs'\n        : 'ort-wasm-simd-threaded.mjs';\n    const wasmModuleUrl = urlOverride ?? normalizeUrl(wasmModuleFilename, prefixOverride);\n    // need to preload if all of the following conditions are met:\n    // 1. not in Node.js.\n    //    - Node.js does not have the same origin policy for creating workers.\n    // 2. multi-threaded is enabled.\n    //    - If multi-threaded is disabled, no worker will be created. So we don't need to preload the module.\n    // 3. the absolute URL is available.\n    //    - If the absolute URL is failed to be created, the origin cannot be determined. In this case, we will not\n    //    preload the module.\n    // 4. the worker URL is not from the same origin.\n    //    - If the worker URL is from the same origin, we can create the worker directly.\n    const needPreload = !isNode && isMultiThreaded && wasmModuleUrl && !isSameOrigin(wasmModuleUrl, prefixOverride);\n    const url = needPreload\n      ? await preload(wasmModuleUrl)\n      : (wasmModuleUrl ?? fallbackUrl(wasmModuleFilename, prefixOverride));\n    return [needPreload ? url : undefined, await dynamicImportDefault<EmscriptenModuleFactory<OrtWasmModule>>(url)];\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Env } from 'onnxruntime-common';\n\nimport type { OrtWasmModule } from './wasm-types';\nimport { importWasmModule } from './wasm-utils-import';\n\nlet wasm: OrtWasmModule | undefined;\nlet initialized = false;\nlet initializing = false;\nlet aborted = false;\n\nconst isMultiThreadSupported = (): boolean => {\n  // If 'SharedArrayBuffer' is not available, WebAssembly threads will not work.\n  if (typeof SharedArrayBuffer === 'undefined') {\n    return false;\n  }\n\n  try {\n    // Test for transferability of SABs (for browsers. needed for Firefox)\n    // https://groups.google.com/forum/#!msg/mozilla.dev.platform/IHkBZlHETpA/dwsMNchWEQAJ\n    if (typeof MessageChannel !== 'undefined') {\n      new MessageChannel().port1.postMessage(new SharedArrayBuffer(1));\n    }\n\n    // Test for WebAssembly threads capability (for both browsers and Node.js)\n    // This typed array is a WebAssembly program containing threaded instructions.\n    return WebAssembly.validate(\n      new Uint8Array([\n        0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 5, 4, 1, 3, 1, 1, 10, 11, 1, 9, 0, 65, 0, 254, 16,\n        2, 0, 26, 11,\n      ]),\n    );\n  } catch (e) {\n    return false;\n  }\n};\n\nconst isSimdSupported = (): boolean => {\n  try {\n    // Test for WebAssembly SIMD capability (for both browsers and Node.js)\n    // This typed array is a WebAssembly program containing SIMD instructions.\n\n    // The binary data is generated from the following code by wat2wasm:\n    //\n    // (module\n    //   (type $t0 (func))\n    //   (func $f0 (type $t0)\n    //     (drop\n    //       (i32x4.dot_i16x8_s\n    //         (i8x16.splat\n    //           (i32.const 0))\n    //         (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)))))\n\n    return WebAssembly.validate(\n      new Uint8Array([\n        0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 30, 1, 28, 0, 65, 0, 253, 15, 253, 12, 0, 0, 0,\n        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 186, 1, 26, 11,\n      ]),\n    );\n  } catch (e) {\n    return false;\n  }\n};\n\nexport const initializeWebAssembly = async (flags: Env.WebAssemblyFlags): Promise<void> => {\n  if (initialized) {\n    return Promise.resolve();\n  }\n  if (initializing) {\n    throw new Error(\"multiple calls to 'initializeWebAssembly()' detected.\");\n  }\n  if (aborted) {\n    throw new Error(\"previous call to 'initializeWebAssembly()' failed.\");\n  }\n\n  initializing = true;\n\n  // wasm flags are already initialized\n  const timeout = flags.initTimeout!;\n  let numThreads = flags.numThreads!;\n\n  // ensure SIMD is supported\n  if (!isSimdSupported()) {\n    throw new Error('WebAssembly SIMD is not supported in the current environment.');\n  }\n\n  // check if multi-threading is supported\n  const multiThreadSupported = isMultiThreadSupported();\n  if (numThreads > 1 && !multiThreadSupported) {\n    if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n      // eslint-disable-next-line no-console\n      console.warn(\n        'env.wasm.numThreads is set to ' +\n          numThreads +\n          ', but this will not work unless you enable crossOriginIsolated mode. ' +\n          'See https://web.dev/cross-origin-isolation-guide/ for more info.',\n      );\n    }\n\n    // eslint-disable-next-line no-console\n    console.warn(\n      'WebAssembly multi-threading is not supported in the current environment. ' + 'Falling back to single-threading.',\n    );\n\n    // set flags.numThreads to 1 so that OrtInit() will not create a global thread pool.\n    flags.numThreads = numThreads = 1;\n  }\n\n  const wasmPaths = flags.wasmPaths;\n  const wasmPrefixOverride = typeof wasmPaths === 'string' ? wasmPaths : undefined;\n  const mjsPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.mjs;\n  const mjsPathOverride = (mjsPathOverrideFlag as URL)?.href ?? mjsPathOverrideFlag;\n  const wasmPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.wasm;\n  const wasmPathOverride = (wasmPathOverrideFlag as URL)?.href ?? wasmPathOverrideFlag;\n  const wasmBinaryOverride = flags.wasmBinary;\n\n  const [objectUrl, ortWasmFactory] = await importWasmModule(mjsPathOverride, wasmPrefixOverride, numThreads > 1);\n\n  let isTimeout = false;\n\n  const tasks: Array<Promise<void>> = [];\n\n  // promise for timeout\n  if (timeout > 0) {\n    tasks.push(\n      new Promise((resolve) => {\n        setTimeout(() => {\n          isTimeout = true;\n          resolve();\n        }, timeout);\n      }),\n    );\n  }\n\n  // promise for module initialization\n  tasks.push(\n    new Promise((resolve, reject) => {\n      const config: Partial<OrtWasmModule> = {\n        /**\n         * The number of threads. WebAssembly will create (Module.numThreads - 1) workers. If it is 1, no worker will be\n         * created.\n         */\n        numThreads,\n      };\n\n      if (wasmBinaryOverride) {\n        /**\n         * Set a custom buffer which contains the WebAssembly binary. This will skip the wasm file fetching.\n         */\n        config.wasmBinary = wasmBinaryOverride;\n      } else if (wasmPathOverride || wasmPrefixOverride) {\n        /**\n         * A callback function to locate the WebAssembly file. The function should return the full path of the file.\n         *\n         * Since Emscripten 3.1.58, this function is only called for the .wasm file.\n         */\n        config.locateFile = (fileName, scriptDirectory) =>\n          wasmPathOverride ?? (wasmPrefixOverride ?? scriptDirectory) + fileName;\n      }\n\n      ortWasmFactory(config).then(\n        // wasm module initialized successfully\n        (module) => {\n          initializing = false;\n          initialized = true;\n          wasm = module;\n          resolve();\n          if (objectUrl) {\n            URL.revokeObjectURL(objectUrl);\n          }\n        },\n        // wasm module failed to initialize\n        (what) => {\n          initializing = false;\n          aborted = true;\n          reject(what);\n        },\n      );\n    }),\n  );\n\n  await Promise.race(tasks);\n\n  if (isTimeout) {\n    throw new Error(`WebAssembly backend initializing failed due to timeout: ${timeout}ms`);\n  }\n};\n\nexport const getInstance = (): OrtWasmModule => {\n  if (initialized && wasm) {\n    return wasm;\n  }\n\n  throw new Error('WebAssembly is not initialized yet.');\n};\n\nexport const dispose = (): void => {\n  if (initialized && !initializing && !aborted) {\n    // TODO: currently \"PThread.terminateAllThreads()\" is not exposed in the wasm module.\n    //       And this function is not yet called by any code.\n    //       If it is needed in the future, we should expose it in the wasm module and uncomment the following line.\n\n    // wasm?.PThread?.terminateAllThreads();\n    wasm = undefined;\n\n    initializing = false;\n    initialized = false;\n    aborted = true;\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { getInstance } from './wasm-factory';\n\nexport const allocWasmString = (data: string, allocs: number[]): number => {\n  const wasm = getInstance();\n\n  const dataLength = wasm.lengthBytesUTF8(data) + 1;\n  const dataOffset = wasm._malloc(dataLength);\n  wasm.stringToUTF8(data, dataOffset, dataLength);\n  allocs.push(dataOffset);\n\n  return dataOffset;\n};\n\ninterface ExtraOptionsHandler {\n  (name: string, value: string): void;\n}\n\nexport const iterateExtraOptions = (\n  options: Record<string, unknown>,\n  prefix: string,\n  seen: WeakSet<Record<string, unknown>>,\n  handler: ExtraOptionsHandler,\n): void => {\n  if (typeof options == 'object' && options !== null) {\n    if (seen.has(options)) {\n      throw new Error('Circular reference in options');\n    } else {\n      seen.add(options);\n    }\n  }\n\n  Object.entries(options).forEach(([key, value]) => {\n    const name = prefix ? prefix + key : key;\n    if (typeof value === 'object') {\n      iterateExtraOptions(value as Record<string, unknown>, name + '.', seen, handler);\n    } else if (typeof value === 'string' || typeof value === 'number') {\n      handler(name, value.toString());\n    } else if (typeof value === 'boolean') {\n      handler(name, value ? '1' : '0');\n    } else {\n      throw new Error(`Can't handle extra config type: ${typeof value}`);\n    }\n  });\n};\n\n/**\n * check web assembly API's last error and throw error if any error occurred.\n * @param message a message used when an error occurred.\n */\nexport const checkLastError = (message: string): void => {\n  const wasm = getInstance();\n\n  const stack = wasm.stackSave();\n  try {\n    const paramsOffset = wasm.stackAlloc(8);\n    wasm._OrtGetLastError(paramsOffset, paramsOffset + 4);\n    const errorCode = wasm.HEAP32[paramsOffset / 4];\n    const errorMessagePointer = wasm.HEAPU32[paramsOffset / 4 + 1];\n    const errorMessage = errorMessagePointer ? wasm.UTF8ToString(errorMessagePointer) : '';\n    throw new Error(`${message} ERROR_CODE: ${errorCode}, ERROR_MESSAGE: ${errorMessage}`);\n  } finally {\n    wasm.stackRestore(stack);\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { InferenceSession } from 'onnxruntime-common';\n\nimport { getInstance } from './wasm-factory';\nimport { allocWasmString, checkLastError, iterateExtraOptions } from './wasm-utils';\n\nexport const setRunOptions = (options: InferenceSession.RunOptions): [number, number[]] => {\n  const wasm = getInstance();\n  let runOptionsHandle = 0;\n  const allocs: number[] = [];\n\n  const runOptions: InferenceSession.RunOptions = options || {};\n\n  try {\n    if (options?.logSeverityLevel === undefined) {\n      runOptions.logSeverityLevel = 2; // Default to warning\n    } else if (\n      typeof options.logSeverityLevel !== 'number' ||\n      !Number.isInteger(options.logSeverityLevel) ||\n      options.logSeverityLevel < 0 ||\n      options.logSeverityLevel > 4\n    ) {\n      throw new Error(`log serverity level is not valid: ${options.logSeverityLevel}`);\n    }\n\n    if (options?.logVerbosityLevel === undefined) {\n      runOptions.logVerbosityLevel = 0; // Default to 0\n    } else if (typeof options.logVerbosityLevel !== 'number' || !Number.isInteger(options.logVerbosityLevel)) {\n      throw new Error(`log verbosity level is not valid: ${options.logVerbosityLevel}`);\n    }\n\n    if (options?.terminate === undefined) {\n      runOptions.terminate = false;\n    }\n\n    let tagDataOffset = 0;\n    if (options?.tag !== undefined) {\n      tagDataOffset = allocWasmString(options.tag, allocs);\n    }\n\n    runOptionsHandle = wasm._OrtCreateRunOptions(\n      runOptions.logSeverityLevel!,\n      runOptions.logVerbosityLevel!,\n      !!runOptions.terminate!,\n      tagDataOffset,\n    );\n    if (runOptionsHandle === 0) {\n      checkLastError(\"Can't create run options.\");\n    }\n\n    if (options?.extra !== undefined) {\n      iterateExtraOptions(options.extra, '', new WeakSet<Record<string, unknown>>(), (key, value) => {\n        const keyDataOffset = allocWasmString(key, allocs);\n        const valueDataOffset = allocWasmString(value, allocs);\n\n        if (wasm._OrtAddRunConfigEntry(runOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n          checkLastError(`Can't set a run config entry: ${key} - ${value}.`);\n        }\n      });\n    }\n\n    return [runOptionsHandle, allocs];\n  } catch (e) {\n    if (runOptionsHandle !== 0) {\n      wasm._OrtReleaseRunOptions(runOptionsHandle);\n    }\n    allocs.forEach((alloc) => wasm._free(alloc));\n    throw e;\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { InferenceSession } from 'onnxruntime-common';\n\nimport { getInstance } from './wasm-factory';\nimport { allocWasmString, checkLastError, iterateExtraOptions } from './wasm-utils';\n\nconst getGraphOptimzationLevel = (graphOptimizationLevel: string | unknown): number => {\n  switch (graphOptimizationLevel) {\n    case 'disabled':\n      return 0;\n    case 'basic':\n      return 1;\n    case 'extended':\n      return 2;\n    case 'all':\n      return 99;\n    default:\n      throw new Error(`unsupported graph optimization level: ${graphOptimizationLevel}`);\n  }\n};\n\nconst getExecutionMode = (executionMode: 'sequential' | 'parallel'): number => {\n  switch (executionMode) {\n    case 'sequential':\n      return 0;\n    case 'parallel':\n      return 1;\n    default:\n      throw new Error(`unsupported execution mode: ${executionMode}`);\n  }\n};\n\nconst appendDefaultOptions = (options: InferenceSession.SessionOptions): void => {\n  if (!options.extra) {\n    options.extra = {};\n  }\n  if (!options.extra.session) {\n    options.extra.session = {};\n  }\n  const session = options.extra.session as Record<string, string>;\n  if (!session.use_ort_model_bytes_directly) {\n    // eslint-disable-next-line camelcase\n    session.use_ort_model_bytes_directly = '1';\n  }\n\n  // if using JSEP with WebGPU, always disable memory pattern\n  if (\n    options.executionProviders &&\n    options.executionProviders.some((ep) => (typeof ep === 'string' ? ep : ep.name) === 'webgpu')\n  ) {\n    options.enableMemPattern = false;\n  }\n};\n\nconst setExecutionProviders = (\n  sessionOptionsHandle: number,\n  executionProviders: readonly InferenceSession.ExecutionProviderConfig[],\n  allocs: number[],\n): void => {\n  for (const ep of executionProviders) {\n    let epName = typeof ep === 'string' ? ep : ep.name;\n\n    // check EP name\n    switch (epName) {\n      case 'webnn':\n        epName = 'WEBNN';\n        if (typeof ep !== 'string') {\n          const webnnOptions = ep as InferenceSession.WebNNExecutionProviderOption;\n          // const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n          const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n          if (deviceType) {\n            const keyDataOffset = allocWasmString('deviceType', allocs);\n            const valueDataOffset = allocWasmString(deviceType, allocs);\n            if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n              checkLastError(`Can't set a session config entry: 'deviceType' - ${deviceType}.`);\n            }\n          }\n        }\n        break;\n      case 'webgpu':\n        epName = 'JS';\n        if (typeof ep !== 'string') {\n          const webgpuOptions = ep as InferenceSession.WebGpuExecutionProviderOption;\n          if (webgpuOptions?.preferredLayout) {\n            if (webgpuOptions.preferredLayout !== 'NCHW' && webgpuOptions.preferredLayout !== 'NHWC') {\n              throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${webgpuOptions.preferredLayout}`);\n            }\n            const keyDataOffset = allocWasmString('preferredLayout', allocs);\n            const valueDataOffset = allocWasmString(webgpuOptions.preferredLayout, allocs);\n            if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n              checkLastError(`Can't set a session config entry: 'preferredLayout' - ${webgpuOptions.preferredLayout}.`);\n            }\n          }\n        }\n        break;\n      case 'wasm':\n      case 'cpu':\n        continue;\n      default:\n        throw new Error(`not supported execution provider: ${epName}`);\n    }\n\n    const epNameDataOffset = allocWasmString(epName, allocs);\n    if (getInstance()._OrtAppendExecutionProvider(sessionOptionsHandle, epNameDataOffset) !== 0) {\n      checkLastError(`Can't append execution provider: ${epName}.`);\n    }\n  }\n};\n\nexport const setSessionOptions = (options?: InferenceSession.SessionOptions): [number, number[]] => {\n  const wasm = getInstance();\n  let sessionOptionsHandle = 0;\n  const allocs: number[] = [];\n\n  const sessionOptions: InferenceSession.SessionOptions = options || {};\n  appendDefaultOptions(sessionOptions);\n\n  try {\n    const graphOptimizationLevel = getGraphOptimzationLevel(sessionOptions.graphOptimizationLevel ?? 'all');\n    const executionMode = getExecutionMode(sessionOptions.executionMode ?? 'sequential');\n    const logIdDataOffset =\n      typeof sessionOptions.logId === 'string' ? allocWasmString(sessionOptions.logId, allocs) : 0;\n\n    const logSeverityLevel = sessionOptions.logSeverityLevel ?? 2; // Default to 2 - warning\n    if (!Number.isInteger(logSeverityLevel) || logSeverityLevel < 0 || logSeverityLevel > 4) {\n      throw new Error(`log serverity level is not valid: ${logSeverityLevel}`);\n    }\n\n    const logVerbosityLevel = sessionOptions.logVerbosityLevel ?? 0; // Default to 0 - verbose\n    if (!Number.isInteger(logVerbosityLevel) || logVerbosityLevel < 0 || logVerbosityLevel > 4) {\n      throw new Error(`log verbosity level is not valid: ${logVerbosityLevel}`);\n    }\n\n    const optimizedModelFilePathOffset =\n      typeof sessionOptions.optimizedModelFilePath === 'string'\n        ? allocWasmString(sessionOptions.optimizedModelFilePath, allocs)\n        : 0;\n\n    sessionOptionsHandle = wasm._OrtCreateSessionOptions(\n      graphOptimizationLevel,\n      !!sessionOptions.enableCpuMemArena,\n      !!sessionOptions.enableMemPattern,\n      executionMode,\n      !!sessionOptions.enableProfiling,\n      0,\n      logIdDataOffset,\n      logSeverityLevel,\n      logVerbosityLevel,\n      optimizedModelFilePathOffset,\n    );\n    if (sessionOptionsHandle === 0) {\n      checkLastError(\"Can't create session options.\");\n    }\n\n    if (sessionOptions.executionProviders) {\n      setExecutionProviders(sessionOptionsHandle, sessionOptions.executionProviders, allocs);\n    }\n\n    if (sessionOptions.enableGraphCapture !== undefined) {\n      if (typeof sessionOptions.enableGraphCapture !== 'boolean') {\n        throw new Error(`enableGraphCapture must be a boolean value: ${sessionOptions.enableGraphCapture}`);\n      }\n      const keyDataOffset = allocWasmString('enableGraphCapture', allocs);\n      const valueDataOffset = allocWasmString(sessionOptions.enableGraphCapture.toString(), allocs);\n      if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n        checkLastError(\n          `Can't set a session config entry: 'enableGraphCapture' - ${sessionOptions.enableGraphCapture}.`,\n        );\n      }\n    }\n\n    if (sessionOptions.freeDimensionOverrides) {\n      for (const [name, value] of Object.entries(sessionOptions.freeDimensionOverrides)) {\n        if (typeof name !== 'string') {\n          throw new Error(`free dimension override name must be a string: ${name}`);\n        }\n        if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n          throw new Error(`free dimension override value must be a non-negative integer: ${value}`);\n        }\n        const nameOffset = allocWasmString(name, allocs);\n        if (wasm._OrtAddFreeDimensionOverride(sessionOptionsHandle, nameOffset, value) !== 0) {\n          checkLastError(`Can't set a free dimension override: ${name} - ${value}.`);\n        }\n      }\n    }\n\n    if (sessionOptions.extra !== undefined) {\n      iterateExtraOptions(sessionOptions.extra, '', new WeakSet<Record<string, unknown>>(), (key, value) => {\n        const keyDataOffset = allocWasmString(key, allocs);\n        const valueDataOffset = allocWasmString(value, allocs);\n\n        if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n          checkLastError(`Can't set a session config entry: ${key} - ${value}.`);\n        }\n      });\n    }\n\n    return [sessionOptionsHandle, allocs];\n  } catch (e) {\n    if (sessionOptionsHandle !== 0) {\n      wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n    }\n    allocs.forEach((alloc) => wasm._free(alloc));\n    throw e;\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Tensor } from 'onnxruntime-common';\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n  const Float16Array: any;\n}\n\n// This file includes common definitions. They do NOT have dependency on the WebAssembly instance.\n\n/**\n * Copied from ONNX definition. Use this to drop dependency 'onnx_proto' to decrease compiled .js file size.\n */\nexport const enum DataType {\n  undefined = 0,\n  float = 1,\n  uint8 = 2,\n  int8 = 3,\n  uint16 = 4,\n  int16 = 5,\n  int32 = 6,\n  int64 = 7,\n  string = 8,\n  bool = 9,\n  float16 = 10,\n  double = 11,\n  uint32 = 12,\n  uint64 = 13,\n  complex64 = 14,\n  complex128 = 15,\n  bfloat16 = 16,\n\n  // 4-bit data-types\n  uint4 = 21,\n  int4 = 22,\n}\n\n/**\n * Map string tensor data to enum value\n */\nexport const tensorDataTypeStringToEnum = (type: string): DataType => {\n  switch (type) {\n    case 'int8':\n      return DataType.int8;\n    case 'uint8':\n      return DataType.uint8;\n    case 'bool':\n      return DataType.bool;\n    case 'int16':\n      return DataType.int16;\n    case 'uint16':\n      return DataType.uint16;\n    case 'int32':\n      return DataType.int32;\n    case 'uint32':\n      return DataType.uint32;\n    case 'float16':\n      return DataType.float16;\n    case 'float32':\n      return DataType.float;\n    case 'float64':\n      return DataType.double;\n    case 'string':\n      return DataType.string;\n    case 'int64':\n      return DataType.int64;\n    case 'uint64':\n      return DataType.uint64;\n    case 'int4':\n      return DataType.int4;\n    case 'uint4':\n      return DataType.uint4;\n\n    default:\n      throw new Error(`unsupported data type: ${type}`);\n  }\n};\n\n/**\n * Map enum value to string tensor data\n */\nexport const tensorDataTypeEnumToString = (typeProto: DataType): Tensor.Type => {\n  switch (typeProto) {\n    case DataType.int8:\n      return 'int8';\n    case DataType.uint8:\n      return 'uint8';\n    case DataType.bool:\n      return 'bool';\n    case DataType.int16:\n      return 'int16';\n    case DataType.uint16:\n      return 'uint16';\n    case DataType.int32:\n      return 'int32';\n    case DataType.uint32:\n      return 'uint32';\n    case DataType.float16:\n      return 'float16';\n    case DataType.float:\n      return 'float32';\n    case DataType.double:\n      return 'float64';\n    case DataType.string:\n      return 'string';\n    case DataType.int64:\n      return 'int64';\n    case DataType.uint64:\n      return 'uint64';\n    case DataType.int4:\n      return 'int4';\n    case DataType.uint4:\n      return 'uint4';\n\n    default:\n      throw new Error(`unsupported data type: ${typeProto}`);\n  }\n};\n\n/**\n * get tensor size in bytes by the given data type and dimensions\n * @returns size in integer or undefined if the data type is not supported\n */\nexport const calculateTensorSizeInBytes = (\n  dateType: number,\n  dimsOrSize: readonly number[] | number,\n): number | undefined => {\n  const elementSize = [\n    -1, // undefined = 0\n    4, // float = 1\n    1, // uint8 = 2\n    1, // int8 = 3\n    2, // uint16 = 4\n    2, // int16 = 5\n    4, // int32 = 6\n    8, // int64 = 7\n    -1, // string = 8\n    1, // bool = 9\n    2, // float16 = 10\n    8, // double = 11\n    4, // uint32 = 12\n    8, // uint64 = 13\n    -1, // complex64 = 14\n    -1, // complex128 = 15\n    -1, // bfloat16 = 16\n    -1, // FLOAT8E4M3FN = 17\n    -1, // FLOAT8E4M3FNUZ = 18\n    -1, // FLOAT8E5M2 = 19\n    -1, // FLOAT8E5M2FNUZ = 20\n    0.5, // uint4 = 21\n    0.5, // int4 = 22\n  ][dateType];\n\n  const size = typeof dimsOrSize === 'number' ? dimsOrSize : dimsOrSize.reduce((a, b) => a * b, 1);\n  return elementSize > 0 ? Math.ceil(size * elementSize) : undefined;\n};\n\n/**\n * get typed array constructor by the given tensor type\n */\nexport const tensorTypeToTypedArrayConstructor = (\n  type: Tensor.Type,\n):\n  | Float32ArrayConstructor\n  | Uint8ArrayConstructor\n  | Int8ArrayConstructor\n  | Uint16ArrayConstructor\n  | Int16ArrayConstructor\n  | Int32ArrayConstructor\n  | BigInt64ArrayConstructor\n  | Uint8ArrayConstructor\n  | Float64ArrayConstructor\n  | Uint32ArrayConstructor\n  | BigUint64ArrayConstructor => {\n  switch (type) {\n    case 'float16':\n      // allow Float16Array polyfill.\n      return typeof Float16Array !== 'undefined' && Float16Array.from ? Float16Array : Uint16Array;\n    case 'float32':\n      return Float32Array;\n    case 'uint8':\n      return Uint8Array;\n    case 'int8':\n      return Int8Array;\n    case 'uint16':\n      return Uint16Array;\n    case 'int16':\n      return Int16Array;\n    case 'int32':\n      return Int32Array;\n    case 'bool':\n      return Uint8Array;\n    case 'float64':\n      return Float64Array;\n    case 'uint32':\n      return Uint32Array;\n    case 'int64':\n      return BigInt64Array;\n    case 'uint64':\n      return BigUint64Array;\n    default:\n      throw new Error(`unsupported type: ${type}`);\n  }\n};\n\n/**\n * Map string log level to integer value\n */\nexport const logLevelStringToEnum = (logLevel?: 'verbose' | 'info' | 'warning' | 'error' | 'fatal'): number => {\n  switch (logLevel) {\n    case 'verbose':\n      return 0;\n    case 'info':\n      return 1;\n    case 'warning':\n      return 2;\n    case 'error':\n      return 3;\n    case 'fatal':\n      return 4;\n    default:\n      throw new Error(`unsupported logging level: ${logLevel}`);\n  }\n};\n\n/**\n * Check whether the given tensor type is supported by GPU buffer\n */\nexport const isGpuBufferSupportedType = (type: Tensor.Type): type is Tensor.GpuBufferDataTypes =>\n  type === 'float32' ||\n  type === 'float16' ||\n  type === 'int32' ||\n  type === 'int64' ||\n  type === 'uint32' ||\n  type === 'uint8' ||\n  type === 'bool' ||\n  type === 'uint4' ||\n  type === 'int4';\n\n/**\n * Map string data location to integer value\n */\nexport const dataLocationStringToEnum = (location: Tensor.DataLocation): number => {\n  switch (location) {\n    case 'none':\n      return 0;\n    case 'cpu':\n      return 1;\n    case 'cpu-pinned':\n      return 2;\n    case 'texture':\n      return 3;\n    case 'gpu-buffer':\n      return 4;\n    default:\n      throw new Error(`unsupported data location: ${location}`);\n  }\n};\n\n/**\n * Map integer data location to string value\n */\nexport const dataLocationEnumToString = (location: number): Tensor.DataLocation | undefined =>\n  (['none', 'cpu', 'cpu-pinned', 'texture', 'gpu-buffer'] as const)[location];\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { isNode } from './wasm-utils-env';\n\n/**\n * Load a file into a Uint8Array.\n *\n * @param file - the file to load. Can be a URL/path, a Blob, an ArrayBuffer, or a Uint8Array.\n * @returns a Uint8Array containing the file data.\n */\nexport const loadFile = async (file: string | Blob | ArrayBufferLike | Uint8Array): Promise<Uint8Array> => {\n  if (typeof file === 'string') {\n    if (isNode) {\n      // load file into ArrayBuffer in Node.js\n      try {\n        const { readFile } = require('node:fs/promises');\n        return new Uint8Array(await readFile(file));\n      } catch (e) {\n        if (e.code === 'ERR_FS_FILE_TOO_LARGE') {\n          // file is too large, use fs.createReadStream instead\n          const { createReadStream } = require('node:fs');\n          const stream = createReadStream(file);\n          const chunks: Uint8Array[] = [];\n          for await (const chunk of stream) {\n            chunks.push(chunk);\n          }\n          return new Uint8Array(Buffer.concat(chunks));\n        }\n        throw e;\n      }\n    } else {\n      // load file into ArrayBuffer in browsers\n      const response = await fetch(file);\n      if (!response.ok) {\n        throw new Error(`failed to load external data file: ${file}`);\n      }\n      const contentLengthHeader = response.headers.get('Content-Length');\n      const fileSize = contentLengthHeader ? parseInt(contentLengthHeader, 10) : 0;\n      if (fileSize < 1073741824 /* 1GB */) {\n        // when Content-Length header is not set, we cannot determine the file size. We assume it is small enough to\n        // load into memory.\n        return new Uint8Array(await response.arrayBuffer());\n      } else {\n        // file is too large, use stream instead\n        if (!response.body) {\n          throw new Error(`failed to load external data file: ${file}, no response body.`);\n        }\n        const reader = response.body.getReader();\n\n        let buffer;\n        try {\n          // try to create ArrayBuffer directly\n          buffer = new ArrayBuffer(fileSize);\n        } catch (e) {\n          if (e instanceof RangeError) {\n            // use WebAssembly Memory to allocate larger ArrayBuffer\n            const pages = Math.ceil(fileSize / 65536);\n            buffer = new WebAssembly.Memory({ initial: pages, maximum: pages }).buffer;\n          } else {\n            throw e;\n          }\n        }\n\n        let offset = 0;\n        // eslint-disable-next-line no-constant-condition\n        while (true) {\n          const { done, value } = await reader.read();\n          if (done) {\n            break;\n          }\n          const chunkSize = value.byteLength;\n          const chunk = new Uint8Array(buffer, offset, chunkSize);\n          chunk.set(value);\n          offset += chunkSize;\n        }\n        return new Uint8Array(buffer, 0, fileSize);\n      }\n    }\n  } else if (file instanceof Blob) {\n    return new Uint8Array(await file.arrayBuffer());\n  } else if (file instanceof Uint8Array) {\n    return file;\n  } else {\n    return new Uint8Array(file);\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// WebNN API currently does not have a TypeScript definition file. This file is a workaround with types generated from\n// WebNN API specification.\n// https://github.com/webmachinelearning/webnn/issues/677\n/// <reference path=\"jsep/webnn/webnn.d.ts\" />\n\nimport { Env, InferenceSession, Tensor } from 'onnxruntime-common';\n\nimport {\n  SerializableInternalBuffer,\n  SerializableSessionMetadata,\n  SerializableTensorMetadata,\n  TensorMetadata,\n} from './proxy-messages';\nimport { setRunOptions } from './run-options';\nimport { setSessionOptions } from './session-options';\nimport {\n  calculateTensorSizeInBytes,\n  dataLocationStringToEnum,\n  isGpuBufferSupportedType,\n  logLevelStringToEnum,\n  tensorDataTypeEnumToString,\n  tensorDataTypeStringToEnum,\n  tensorTypeToTypedArrayConstructor,\n} from './wasm-common';\nimport { getInstance } from './wasm-factory';\nimport { allocWasmString, checkLastError } from './wasm-utils';\nimport { loadFile } from './wasm-utils-load-file';\n\n// #region Initializations\n\n/**\n * There are 4 different \"initialization\" steps for ORT. They happen in different places and different time.\n *\n * 1. JavaScript initialization for onnxruntime-common and onnxruntime-web.\n *    This is the first initialization step. In this step, onnxruntime-web calls onnxruntime-common's registerBackend()\n * function multiple times to register all the available backends. The backend registration is very fast. It only\n * registers the backend name with the uninitialized backend object. No heavy initialization is done in this step.\n *    Refer to web/lib/index.ts for the backend registration.\n *\n * 2. WebAssembly artifact initialization.\n *    This happens when any registered wasm backend is used for the first time (ie. `ort.InferenceSession.create()` or\n * `ort.TrainingSession.create()` is called). In this step, onnxruntime-web does the followings:\n *     - create a proxy worker and make sure the proxy worker is ready to receive messages, if proxy is enabled.\n *     - perform feature detection, locate correct WebAssembly artifact path and call the Emscripten generated\n * JavaScript code to initialize the WebAssembly runtime.\n *         - if proxy is enabled, this step happens in the proxy worker using message 'init-wasm'.\n *         - downloading the 'ort-wasm{...}.wasm' file is done in this step.\n *         - if multi-thread is enabled, one or more webworker will be created to initialize the PThread threadpool.\n *\n * 3. ORT environment initialization.\n *    This happens after step 2. In this step, onnxruntime-web performs ONNX Runtime environment initialization.\n * Function `_OrtInit()` is called in this step.\n *     - if proxy is enabled, this step happens in the proxy worker using message 'init-ort'.\n *     - logging level (ort.env.logLevel) and thread number (ort.env.wasm.numThreads) are set in this step.\n *\n * 4. Session initialization.\n *    This happens when `ort.InferenceSession.create()` or `ort.TrainingSession.create()` is called. Unlike the first 3\n * steps (they only called once), this step will be done for each session. In this step, onnxruntime-web does the\n * followings:\n *    If the parameter is a URL:\n *    - download the model data from the URL.\n *    - copy the model data to the WASM heap. (proxy: 'copy-from')\n *    - dereference the model buffer. This step allows the original ArrayBuffer to be garbage collected.\n *    - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n *    If the parameter is a Uint8Array object:\n *    - copy the model data to the WASM heap. (proxy: 'copy-from')\n *    - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n *\n */\n\n/**\n * initialize ORT environment.\n *\n * @param numThreads SetGlobalIntraOpNumThreads(numThreads)\n * @param loggingLevel CreateEnv(static_cast<OrtLoggingLevel>(logging_level))\n */\nconst initOrt = (numThreads: number, loggingLevel: number): void => {\n  const errorCode = getInstance()._OrtInit(numThreads, loggingLevel);\n  if (errorCode !== 0) {\n    checkLastError(\"Can't initialize onnxruntime.\");\n  }\n};\n\n/**\n * initialize runtime environment.\n * @param env passed in the environment config object.\n */\nexport const initRuntime = async (env: Env): Promise<void> => {\n  // init ORT\n  initOrt(env.wasm.numThreads!, logLevelStringToEnum(env.logLevel));\n};\n\n/**\n * perform EP specific initialization.\n *\n * @param env\n * @param epName\n */\nexport const initEp = async (env: Env, epName: string): Promise<void> => {\n  if (!BUILD_DEFS.DISABLE_JSEP) {\n    // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n    const initJsep = require('./jsep/init').init;\n\n    if (epName === 'webgpu') {\n      // perform WebGPU availability check\n      if (typeof navigator === 'undefined' || !navigator.gpu) {\n        throw new Error('WebGPU is not supported in current environment');\n      }\n\n      let adapter = env.webgpu.adapter as GPUAdapter | null;\n      if (!adapter) {\n        // if adapter is not set, request a new adapter.\n        const powerPreference = env.webgpu.powerPreference;\n        if (\n          powerPreference !== undefined &&\n          powerPreference !== 'low-power' &&\n          powerPreference !== 'high-performance'\n        ) {\n          throw new Error(`Invalid powerPreference setting: \"${powerPreference}\"`);\n        }\n        const forceFallbackAdapter = env.webgpu.forceFallbackAdapter;\n        if (forceFallbackAdapter !== undefined && typeof forceFallbackAdapter !== 'boolean') {\n          throw new Error(`Invalid forceFallbackAdapter setting: \"${forceFallbackAdapter}\"`);\n        }\n        adapter = await navigator.gpu.requestAdapter({ powerPreference, forceFallbackAdapter });\n        if (!adapter) {\n          throw new Error(\n            'Failed to get GPU adapter. ' +\n              'You may need to enable flag \"--enable-unsafe-webgpu\" if you are using Chrome.',\n          );\n        }\n      } else {\n        // if adapter is set, validate it.\n        if (\n          typeof adapter.limits !== 'object' ||\n          typeof adapter.features !== 'object' ||\n          typeof adapter.requestDevice !== 'function'\n        ) {\n          throw new Error('Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.');\n        }\n      }\n\n      await initJsep('webgpu', getInstance(), env, adapter);\n    }\n    if (epName === 'webnn') {\n      // perform WebNN availability check\n      if (typeof navigator === 'undefined' || !(navigator as unknown as { ml: unknown }).ml) {\n        throw new Error('WebNN is not supported in current environment');\n      }\n\n      await initJsep('webnn', getInstance(), env);\n    }\n  }\n};\n\n// #endregion Initializations\n\n/**\n * valid data locations for input/output tensors.\n */\ntype SupportedTensorDataLocationForInputOutput = 'cpu' | 'cpu-pinned' | 'gpu-buffer';\n\ntype IOBindingState = {\n  /**\n   * the handle of IO binding.\n   */\n  readonly handle: number;\n\n  /**\n   * the preferred location for each output tensor.\n   *\n   * value is one of 'cpu', 'cpu-pinned', 'gpu-buffer'.\n   */\n  readonly outputPreferredLocations: readonly SupportedTensorDataLocationForInputOutput[];\n\n  /**\n   * enum value of the preferred location for each output tensor.\n   */\n  readonly outputPreferredLocationsEncoded: readonly number[];\n};\n\n/**\n *  tuple elements are: InferenceSession ID; inputNamesUTF8Encoded; outputNamesUTF8Encoded; bindingState\n */\ntype SessionMetadata = [\n  inferenceSessionId: number,\n  inputNamesUTF8Encoded: number[],\n  outputNamesUTF8Encoded: number[],\n  bindingState: IOBindingState | null,\n  enableGraphCapture: boolean,\n  inputOutputBound: boolean,\n];\n\nconst activeSessions = new Map<number, SessionMetadata>();\n\n/**\n * get the input/output count of the session.\n * @param sessionHandle the handle representing the session. should be non-zero.\n * @returns a tuple including 2 numbers, representing the input count and output count.\n */\nconst getSessionInputOutputCount = (sessionHandle: number): [number, number] => {\n  const wasm = getInstance();\n  const stack = wasm.stackSave();\n  try {\n    const dataOffset = wasm.stackAlloc(8);\n    const errorCode = wasm._OrtGetInputOutputCount(sessionHandle, dataOffset, dataOffset + 4);\n    if (errorCode !== 0) {\n      checkLastError(\"Can't get session input/output count.\");\n    }\n    return [wasm.HEAP32[dataOffset / 4], wasm.HEAP32[dataOffset / 4 + 1]];\n  } finally {\n    wasm.stackRestore(stack);\n  }\n};\n\n/**\n * allocate the memory and memcpy the external buffer.\n *\n * @param model - the external buffer containing the model data. Must not be the same buffer as the WASM heap.\n * @returns a 2-elements tuple - the pointer and size of the allocated buffer\n */\nexport const copyFromExternalBuffer = (model: Uint8Array): [number, number] => {\n  const wasm = getInstance();\n  const modelDataOffset = wasm._malloc(model.byteLength);\n  if (modelDataOffset === 0) {\n    throw new Error(`Can't create a session. failed to allocate a buffer of size ${model.byteLength}.`);\n  }\n  wasm.HEAPU8.set(model, modelDataOffset);\n  return [modelDataOffset, model.byteLength];\n};\n\n/**\n * create an inference session from a model data buffer.\n *\n * @param modelData - either a Uint8Array object representing the model data, or a 2-elements tuple containing the\n *     pointer and size of the model data buffer.\n * @param options an optional session options object.\n * @returns a 3-elements tuple containing [session handle, input names, output names]\n */\nexport const createSession = async (\n  modelData: Uint8Array | SerializableInternalBuffer,\n  options?: InferenceSession.SessionOptions,\n): Promise<SerializableSessionMetadata> => {\n  let modelDataOffset: number, modelDataLength: number;\n  const wasm = getInstance();\n\n  if (Array.isArray(modelData)) {\n    // if model data is an array, it must be a 2-elements tuple containing the pointer and size of the model data\n    [modelDataOffset, modelDataLength] = modelData;\n  } else if (modelData.buffer === wasm.HEAPU8.buffer) {\n    // if model data uses the same buffer as the WASM heap, we don't need to copy it.\n    [modelDataOffset, modelDataLength] = [modelData.byteOffset, modelData.byteLength];\n  } else {\n    // otherwise, copy the model data to the WASM heap.\n    [modelDataOffset, modelDataLength] = copyFromExternalBuffer(modelData);\n  }\n\n  let sessionHandle = 0;\n  let sessionOptionsHandle = 0;\n  let ioBindingHandle = 0;\n  let allocs: number[] = [];\n  const inputNamesUTF8Encoded = [];\n  const outputNamesUTF8Encoded = [];\n\n  try {\n    [sessionOptionsHandle, allocs] = setSessionOptions(options);\n\n    if (options?.externalData && wasm.mountExternalData) {\n      const loadingPromises = [];\n      for (const file of options.externalData) {\n        const path = typeof file === 'string' ? file : file.path;\n        loadingPromises.push(\n          loadFile(typeof file === 'string' ? file : file.data).then((data) => {\n            wasm.mountExternalData!(path, data);\n          }),\n        );\n      }\n\n      // wait for all external data files to be loaded\n      await Promise.all(loadingPromises);\n    }\n\n    for (const provider of options?.executionProviders ?? []) {\n      const providerName = typeof provider === 'string' ? provider : provider.name;\n      if (providerName === 'webnn') {\n        if (wasm.currentContext) {\n          throw new Error('WebNN execution provider is already set.');\n        }\n        if (typeof provider !== 'string') {\n          const webnnOptions = provider as InferenceSession.WebNNExecutionProviderOption;\n          const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n          const gpuDevice = (webnnOptions as InferenceSession.WebNNOptionsWebGpu)?.gpuDevice;\n          const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n          const numThreads = (webnnOptions as InferenceSession.WebNNContextOptions)?.numThreads;\n          const powerPreference = (webnnOptions as InferenceSession.WebNNContextOptions)?.powerPreference;\n          if (context) {\n            wasm.currentContext = context as MLContext;\n          } else if (gpuDevice) {\n            wasm.currentContext = await navigator.ml.createContext(gpuDevice);\n          } else {\n            wasm.currentContext = await navigator.ml.createContext({ deviceType, numThreads, powerPreference });\n          }\n        } else {\n          wasm.currentContext = await navigator.ml.createContext();\n        }\n        break;\n      }\n    }\n\n    sessionHandle = await wasm._OrtCreateSession(modelDataOffset, modelDataLength, sessionOptionsHandle);\n    if (sessionHandle === 0) {\n      checkLastError(\"Can't create a session.\");\n    }\n\n    // clear current MLContext after session creation\n    if (wasm.currentContext) {\n      wasm.currentContext = undefined;\n    }\n\n    const [inputCount, outputCount] = getSessionInputOutputCount(sessionHandle);\n\n    const enableGraphCapture = !!options?.enableGraphCapture;\n\n    const inputNames = [];\n    const outputNames = [];\n    const outputPreferredLocations: SupportedTensorDataLocationForInputOutput[] = [];\n    for (let i = 0; i < inputCount; i++) {\n      const name = wasm._OrtGetInputName(sessionHandle, i);\n      if (name === 0) {\n        checkLastError(\"Can't get an input name.\");\n      }\n      inputNamesUTF8Encoded.push(name);\n      inputNames.push(wasm.UTF8ToString(name));\n    }\n    for (let i = 0; i < outputCount; i++) {\n      const name = wasm._OrtGetOutputName(sessionHandle, i);\n      if (name === 0) {\n        checkLastError(\"Can't get an output name.\");\n      }\n      outputNamesUTF8Encoded.push(name);\n      const nameString = wasm.UTF8ToString(name);\n      outputNames.push(nameString);\n\n      if (!BUILD_DEFS.DISABLE_JSEP) {\n        if (enableGraphCapture && options?.preferredOutputLocation === undefined) {\n          outputPreferredLocations.push('gpu-buffer');\n          continue;\n        }\n        const location =\n          typeof options?.preferredOutputLocation === 'string'\n            ? options.preferredOutputLocation\n            : (options?.preferredOutputLocation?.[nameString] ?? 'cpu');\n        if (location !== 'cpu' && location !== 'cpu-pinned' && location !== 'gpu-buffer') {\n          throw new Error(`Not supported preferred output location: ${location}.`);\n        }\n        if (enableGraphCapture && location !== 'gpu-buffer') {\n          throw new Error(\n            `Not supported preferred output location: ${location}. Only 'gpu-buffer' location is supported when enableGraphCapture is true.`,\n          );\n        }\n        outputPreferredLocations.push(location);\n      }\n    }\n\n    // use IO binding only when at least one output is preffered to be on GPU.\n    let bindingState: IOBindingState | null = null;\n    if (!BUILD_DEFS.DISABLE_JSEP && outputPreferredLocations.some((l) => l === 'gpu-buffer')) {\n      ioBindingHandle = wasm._OrtCreateBinding(sessionHandle);\n      if (ioBindingHandle === 0) {\n        checkLastError(\"Can't create IO binding.\");\n      }\n\n      bindingState = {\n        handle: ioBindingHandle,\n        outputPreferredLocations,\n        outputPreferredLocationsEncoded: outputPreferredLocations.map((l) => dataLocationStringToEnum(l)),\n      };\n    }\n\n    activeSessions.set(sessionHandle, [\n      sessionHandle,\n      inputNamesUTF8Encoded,\n      outputNamesUTF8Encoded,\n      bindingState,\n      enableGraphCapture,\n      false,\n    ]);\n    return [sessionHandle, inputNames, outputNames];\n  } catch (e) {\n    inputNamesUTF8Encoded.forEach((buf) => wasm._OrtFree(buf));\n    outputNamesUTF8Encoded.forEach((buf) => wasm._OrtFree(buf));\n\n    if (ioBindingHandle !== 0) {\n      wasm._OrtReleaseBinding(ioBindingHandle);\n    }\n\n    if (sessionHandle !== 0) {\n      wasm._OrtReleaseSession(sessionHandle);\n    }\n    throw e;\n  } finally {\n    wasm._free(modelDataOffset);\n    if (sessionOptionsHandle !== 0) {\n      wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n    }\n    allocs.forEach((alloc) => wasm._free(alloc));\n\n    // unmount external data if necessary\n    wasm.unmountExternalData?.();\n  }\n};\n\nexport const releaseSession = (sessionId: number): void => {\n  const wasm = getInstance();\n  const session = activeSessions.get(sessionId);\n  if (!session) {\n    throw new Error(`cannot release session. invalid session id: ${sessionId}`);\n  }\n  const [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture] = session;\n\n  if (ioBindingState) {\n    if (enableGraphCapture) {\n      wasm._OrtClearBoundOutputs(ioBindingState.handle);\n    }\n    wasm._OrtReleaseBinding(ioBindingState.handle);\n  }\n\n  wasm.jsepOnReleaseSession?.(sessionId);\n\n  inputNamesUTF8Encoded.forEach((buf) => wasm._OrtFree(buf));\n  outputNamesUTF8Encoded.forEach((buf) => wasm._OrtFree(buf));\n  wasm._OrtReleaseSession(sessionHandle);\n  activeSessions.delete(sessionId);\n};\n\nexport const prepareInputOutputTensor = (\n  tensor: TensorMetadata | null,\n  tensorHandles: number[],\n  allocs: number[],\n  sessionId: number,\n  index: number,\n  enableGraphCapture = false,\n): void => {\n  if (!tensor) {\n    tensorHandles.push(0);\n    return;\n  }\n\n  const wasm = getInstance();\n\n  const dataType = tensor[0];\n  const dims = tensor[1];\n  const location = tensor[3];\n\n  let rawData: number;\n  let dataByteLength: number;\n\n  if (dataType === 'string' && location === 'gpu-buffer') {\n    throw new Error('String tensor is not supported on GPU.');\n  }\n\n  if (enableGraphCapture && location !== 'gpu-buffer') {\n    throw new Error(\n      `External buffer must be provided for input/output index ${index} when enableGraphCapture is true.`,\n    );\n  }\n\n  if (location === 'gpu-buffer') {\n    const gpuBuffer = tensor[2].gpuBuffer as GPUBuffer;\n    dataByteLength = calculateTensorSizeInBytes(tensorDataTypeStringToEnum(dataType), dims)!;\n\n    const registerBuffer = wasm.jsepRegisterBuffer;\n    if (!registerBuffer) {\n      throw new Error('Tensor location \"gpu-buffer\" is not supported without using WebGPU.');\n    }\n    rawData = registerBuffer(sessionId, index, gpuBuffer, dataByteLength);\n  } else {\n    const data = tensor[2];\n\n    if (Array.isArray(data)) {\n      // string tensor\n      dataByteLength = 4 * data.length;\n      rawData = wasm._malloc(dataByteLength);\n      allocs.push(rawData);\n      let dataIndex = rawData / 4;\n      for (let i = 0; i < data.length; i++) {\n        if (typeof data[i] !== 'string') {\n          throw new TypeError(`tensor data at index ${i} is not a string`);\n        }\n        wasm.HEAPU32[dataIndex++] = allocWasmString(data[i], allocs);\n      }\n    } else {\n      dataByteLength = data.byteLength;\n      rawData = wasm._malloc(dataByteLength);\n      allocs.push(rawData);\n      wasm.HEAPU8.set(new Uint8Array(data.buffer, data.byteOffset, dataByteLength), rawData);\n    }\n  }\n\n  const stack = wasm.stackSave();\n  const dimsOffset = wasm.stackAlloc(4 * dims.length);\n  try {\n    let dimIndex = dimsOffset / 4;\n    dims.forEach((d) => (wasm.HEAP32[dimIndex++] = d));\n    const tensor = wasm._OrtCreateTensor(\n      tensorDataTypeStringToEnum(dataType),\n      rawData,\n      dataByteLength,\n      dimsOffset,\n      dims.length,\n      dataLocationStringToEnum(location),\n    );\n    if (tensor === 0) {\n      checkLastError(`Can't create tensor for input/output. session=${sessionId}, index=${index}.`);\n    }\n    tensorHandles.push(tensor);\n  } finally {\n    wasm.stackRestore(stack);\n  }\n};\n\n/**\n * perform inference run\n */\nexport const run = async (\n  sessionId: number,\n  inputIndices: number[],\n  inputTensors: TensorMetadata[],\n  outputIndices: number[],\n  outputTensors: Array<TensorMetadata | null>,\n  options: InferenceSession.RunOptions,\n): Promise<TensorMetadata[]> => {\n  const wasm = getInstance();\n  const session = activeSessions.get(sessionId);\n  if (!session) {\n    throw new Error(`cannot run inference. invalid session id: ${sessionId}`);\n  }\n  const sessionHandle = session[0];\n  const inputNamesUTF8Encoded = session[1];\n  const outputNamesUTF8Encoded = session[2];\n  const ioBindingState = session[3];\n  const enableGraphCapture = session[4];\n  const inputOutputBound = session[5];\n\n  const inputCount = inputIndices.length;\n  const outputCount = outputIndices.length;\n\n  let runOptionsHandle = 0;\n  let runOptionsAllocs: number[] = [];\n\n  const inputTensorHandles: number[] = [];\n  const outputTensorHandles: number[] = [];\n  const inputOutputAllocs: number[] = [];\n\n  const beforeRunStack = wasm.stackSave();\n  const inputValuesOffset = wasm.stackAlloc(inputCount * 4);\n  const inputNamesOffset = wasm.stackAlloc(inputCount * 4);\n  const outputValuesOffset = wasm.stackAlloc(outputCount * 4);\n  const outputNamesOffset = wasm.stackAlloc(outputCount * 4);\n\n  try {\n    [runOptionsHandle, runOptionsAllocs] = setRunOptions(options);\n\n    // create input tensors\n    for (let i = 0; i < inputCount; i++) {\n      prepareInputOutputTensor(\n        inputTensors[i],\n        inputTensorHandles,\n        inputOutputAllocs,\n        sessionId,\n        inputIndices[i],\n        enableGraphCapture,\n      );\n    }\n\n    // create output tensors\n    for (let i = 0; i < outputCount; i++) {\n      prepareInputOutputTensor(\n        outputTensors[i],\n        outputTensorHandles,\n        inputOutputAllocs,\n        sessionId,\n        inputCount + outputIndices[i],\n        enableGraphCapture,\n      );\n    }\n\n    let inputValuesIndex = inputValuesOffset / 4;\n    let inputNamesIndex = inputNamesOffset / 4;\n    let outputValuesIndex = outputValuesOffset / 4;\n    let outputNamesIndex = outputNamesOffset / 4;\n    for (let i = 0; i < inputCount; i++) {\n      wasm.HEAPU32[inputValuesIndex++] = inputTensorHandles[i];\n      wasm.HEAPU32[inputNamesIndex++] = inputNamesUTF8Encoded[inputIndices[i]];\n    }\n    for (let i = 0; i < outputCount; i++) {\n      wasm.HEAPU32[outputValuesIndex++] = outputTensorHandles[i];\n      wasm.HEAPU32[outputNamesIndex++] = outputNamesUTF8Encoded[outputIndices[i]];\n    }\n\n    if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState && !inputOutputBound) {\n      const { handle, outputPreferredLocations, outputPreferredLocationsEncoded } = ioBindingState;\n\n      if (inputNamesUTF8Encoded.length !== inputCount) {\n        throw new Error(\n          `input count from feeds (${inputCount}) is expected to be always equal to model's input count (${inputNamesUTF8Encoded.length}).`,\n        );\n      }\n\n      // process inputs\n      for (let i = 0; i < inputCount; i++) {\n        const index = inputIndices[i];\n        const errorCode = await wasm._OrtBindInput(handle, inputNamesUTF8Encoded[index], inputTensorHandles[i]);\n        if (errorCode !== 0) {\n          checkLastError(`Can't bind input[${i}] for session=${sessionId}.`);\n        }\n      }\n\n      // process pre-allocated outputs\n      for (let i = 0; i < outputCount; i++) {\n        const index = outputIndices[i];\n        const location = outputTensors[i]?.[3]; // undefined means output is not pre-allocated.\n\n        if (location) {\n          // output is pre-allocated. bind the tensor.\n          const errorCode = wasm._OrtBindOutput(handle, outputNamesUTF8Encoded[index], outputTensorHandles[i], 0);\n          if (errorCode !== 0) {\n            checkLastError(`Can't bind pre-allocated output[${i}] for session=${sessionId}.`);\n          }\n        } else {\n          // output is not pre-allocated. reset preferred location.\n          const errorCode = wasm._OrtBindOutput(\n            handle,\n            outputNamesUTF8Encoded[index],\n            0,\n            outputPreferredLocationsEncoded[index],\n          );\n          if (errorCode !== 0) {\n            checkLastError(`Can't bind output[${i}] to ${outputPreferredLocations[i]} for session=${sessionId}.`);\n          }\n        }\n      }\n      activeSessions.set(sessionId, [\n        sessionHandle,\n        inputNamesUTF8Encoded,\n        outputNamesUTF8Encoded,\n        ioBindingState,\n        enableGraphCapture,\n        true,\n      ]);\n    }\n\n    wasm.jsepOnRunStart?.(sessionHandle);\n    let errorCode: number;\n    if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState) {\n      errorCode = await wasm._OrtRunWithBinding(\n        sessionHandle,\n        ioBindingState.handle,\n        outputCount,\n        outputValuesOffset,\n        runOptionsHandle,\n      );\n    } else {\n      errorCode = await wasm._OrtRun(\n        sessionHandle,\n        inputNamesOffset,\n        inputValuesOffset,\n        inputCount,\n        outputNamesOffset,\n        outputCount,\n        outputValuesOffset,\n        runOptionsHandle,\n      );\n    }\n\n    if (errorCode !== 0) {\n      checkLastError('failed to call OrtRun().');\n    }\n\n    const output: TensorMetadata[] = [];\n\n    for (let i = 0; i < outputCount; i++) {\n      const tensor = wasm.HEAPU32[outputValuesOffset / 4 + i];\n      if (tensor === outputTensorHandles[i]) {\n        // output tensor is pre-allocated. no need to copy data.\n        output.push(outputTensors[i]!);\n        continue;\n      }\n\n      const beforeGetTensorDataStack = wasm.stackSave();\n      // stack allocate 4 pointer value\n      const tensorDataOffset = wasm.stackAlloc(4 * 4);\n\n      let keepOutputTensor = false;\n      let type: Tensor.Type | undefined,\n        dataOffset = 0;\n      try {\n        const errorCode = wasm._OrtGetTensorData(\n          tensor,\n          tensorDataOffset,\n          tensorDataOffset + 4,\n          tensorDataOffset + 8,\n          tensorDataOffset + 12,\n        );\n        if (errorCode !== 0) {\n          checkLastError(`Can't access output tensor data on index ${i}.`);\n        }\n        let tensorDataIndex = tensorDataOffset / 4;\n        const dataType = wasm.HEAPU32[tensorDataIndex++];\n        dataOffset = wasm.HEAPU32[tensorDataIndex++];\n        const dimsOffset = wasm.HEAPU32[tensorDataIndex++];\n        const dimsLength = wasm.HEAPU32[tensorDataIndex++];\n        const dims = [];\n        for (let i = 0; i < dimsLength; i++) {\n          dims.push(wasm.HEAPU32[dimsOffset / 4 + i]);\n        }\n        wasm._OrtFree(dimsOffset);\n\n        const size = dims.reduce((a, b) => a * b, 1);\n        type = tensorDataTypeEnumToString(dataType);\n\n        const preferredLocation = ioBindingState?.outputPreferredLocations[outputIndices[i]];\n\n        if (type === 'string') {\n          if (preferredLocation === 'gpu-buffer') {\n            throw new Error('String tensor is not supported on GPU.');\n          }\n          const stringData: string[] = [];\n          let dataIndex = dataOffset / 4;\n          for (let i = 0; i < size; i++) {\n            const offset = wasm.HEAPU32[dataIndex++];\n            const maxBytesToRead = i === size - 1 ? undefined : wasm.HEAPU32[dataIndex] - offset;\n            stringData.push(wasm.UTF8ToString(offset, maxBytesToRead));\n          }\n          output.push([type, dims, stringData, 'cpu']);\n        } else {\n          // If a certain output's preferred location is GPU but the tensor is empty, we still need to create a CPU\n          // tensor for it. There is no mapping GPU buffer for an empty tensor.\n          if (preferredLocation === 'gpu-buffer' && size > 0) {\n            const getBuffer = wasm.jsepGetBuffer;\n            if (!getBuffer) {\n              throw new Error('preferredLocation \"gpu-buffer\" is not supported without using WebGPU.');\n            }\n            const gpuBuffer = getBuffer(dataOffset);\n            const bufferSize = calculateTensorSizeInBytes(dataType, size);\n            if (bufferSize === undefined || !isGpuBufferSupportedType(type)) {\n              throw new Error(`Unsupported data type: ${type}`);\n            }\n\n            // do not release the tensor right now. it will be released when user calls tensor.dispose().\n            keepOutputTensor = true;\n\n            output.push([\n              type,\n              dims,\n              {\n                gpuBuffer,\n                download: wasm.jsepCreateDownloader!(gpuBuffer, bufferSize, type),\n                dispose: () => {\n                  wasm._OrtReleaseTensor(tensor);\n                },\n              },\n              'gpu-buffer',\n            ]);\n          } else {\n            const typedArrayConstructor = tensorTypeToTypedArrayConstructor(type);\n            const data = new typedArrayConstructor(size);\n            new Uint8Array(data.buffer, data.byteOffset, data.byteLength).set(\n              wasm.HEAPU8.subarray(dataOffset, dataOffset + data.byteLength),\n            );\n            output.push([type, dims, data, 'cpu']);\n          }\n        }\n      } finally {\n        wasm.stackRestore(beforeGetTensorDataStack);\n        if (type === 'string' && dataOffset) {\n          wasm._free(dataOffset);\n        }\n        if (!keepOutputTensor) {\n          wasm._OrtReleaseTensor(tensor);\n        }\n      }\n    }\n\n    if (ioBindingState && !enableGraphCapture) {\n      wasm._OrtClearBoundOutputs(ioBindingState.handle);\n      activeSessions.set(sessionId, [\n        sessionHandle,\n        inputNamesUTF8Encoded,\n        outputNamesUTF8Encoded,\n        ioBindingState,\n        enableGraphCapture,\n        false,\n      ]);\n    }\n    return output;\n  } finally {\n    wasm.stackRestore(beforeRunStack);\n\n    inputTensorHandles.forEach((v) => wasm._OrtReleaseTensor(v));\n    outputTensorHandles.forEach((v) => wasm._OrtReleaseTensor(v));\n    inputOutputAllocs.forEach((p) => wasm._free(p));\n\n    if (runOptionsHandle !== 0) {\n      wasm._OrtReleaseRunOptions(runOptionsHandle);\n    }\n    runOptionsAllocs.forEach((p) => wasm._free(p));\n  }\n};\n\n/**\n * end profiling\n */\nexport const endProfiling = (sessionId: number): void => {\n  const wasm = getInstance();\n  const session = activeSessions.get(sessionId);\n  if (!session) {\n    throw new Error('invalid session id');\n  }\n  const sessionHandle = session[0];\n\n  // profile file name is not used yet, but it must be freed.\n  const profileFileName = wasm._OrtEndProfiling(sessionHandle);\n  if (profileFileName === 0) {\n    checkLastError(\"Can't get an profile file name.\");\n  }\n  wasm._OrtFree(profileFileName);\n};\n\nexport const extractTransferableBuffers = (tensors: readonly SerializableTensorMetadata[]): ArrayBufferLike[] => {\n  const buffers: ArrayBufferLike[] = [];\n  for (const tensor of tensors) {\n    const data = tensor[2];\n    if (!Array.isArray(data) && 'buffer' in data) {\n      buffers.push(data.buffer);\n    }\n  }\n  return buffers;\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { env, InferenceSession } from 'onnxruntime-common';\n\nimport {\n  OrtWasmMessage,\n  SerializableInternalBuffer,\n  SerializableSessionMetadata,\n  SerializableTensorMetadata,\n  TensorMetadata,\n} from './proxy-messages';\nimport * as core from './wasm-core-impl';\nimport { initializeWebAssembly } from './wasm-factory';\nimport { importProxyWorker } from './wasm-utils-import';\n\nconst isProxy = (): boolean => !!env.wasm.proxy && typeof document !== 'undefined';\nlet proxyWorker: Worker | undefined;\nlet initializing = false;\nlet initialized = false;\nlet aborted = false;\nlet temporaryObjectUrl: string | undefined;\n\ntype PromiseCallbacks<T = void> = [resolve: (result: T) => void, reject: (reason: unknown) => void];\nlet initWasmCallbacks: PromiseCallbacks;\nconst queuedCallbacks: Map<OrtWasmMessage['type'], Array<PromiseCallbacks<unknown>>> = new Map();\n\nconst enqueueCallbacks = (type: OrtWasmMessage['type'], callbacks: PromiseCallbacks<unknown>): void => {\n  const queue = queuedCallbacks.get(type);\n  if (queue) {\n    queue.push(callbacks);\n  } else {\n    queuedCallbacks.set(type, [callbacks]);\n  }\n};\n\nconst ensureWorker = (): void => {\n  if (initializing || !initialized || aborted || !proxyWorker) {\n    throw new Error('worker not ready');\n  }\n};\n\nconst onProxyWorkerMessage = (ev: MessageEvent<OrtWasmMessage>): void => {\n  switch (ev.data.type) {\n    case 'init-wasm':\n      initializing = false;\n      if (ev.data.err) {\n        aborted = true;\n        initWasmCallbacks[1](ev.data.err);\n      } else {\n        initialized = true;\n        initWasmCallbacks[0]();\n      }\n      if (temporaryObjectUrl) {\n        URL.revokeObjectURL(temporaryObjectUrl);\n        temporaryObjectUrl = undefined;\n      }\n      break;\n    case 'init-ep':\n    case 'copy-from':\n    case 'create':\n    case 'release':\n    case 'run':\n    case 'end-profiling': {\n      const callbacks = queuedCallbacks.get(ev.data.type)!;\n      if (ev.data.err) {\n        callbacks.shift()![1](ev.data.err);\n      } else {\n        callbacks.shift()![0](ev.data.out!);\n      }\n      break;\n    }\n    default:\n  }\n};\n\nexport const initializeWebAssemblyAndOrtRuntime = async (): Promise<void> => {\n  if (initialized) {\n    return;\n  }\n  if (initializing) {\n    throw new Error(\"multiple calls to 'initWasm()' detected.\");\n  }\n  if (aborted) {\n    throw new Error(\"previous call to 'initWasm()' failed.\");\n  }\n\n  initializing = true;\n\n  if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n    return new Promise<void>((resolve, reject) => {\n      proxyWorker?.terminate();\n\n      void importProxyWorker().then(([objectUrl, worker]) => {\n        try {\n          proxyWorker = worker;\n          proxyWorker.onerror = (ev: ErrorEvent) => reject(ev);\n          proxyWorker.onmessage = onProxyWorkerMessage;\n          initWasmCallbacks = [resolve, reject];\n          const message: OrtWasmMessage = { type: 'init-wasm', in: env };\n          proxyWorker.postMessage(message);\n          temporaryObjectUrl = objectUrl;\n        } catch (e) {\n          reject(e);\n        }\n      }, reject);\n    });\n  } else {\n    try {\n      await initializeWebAssembly(env.wasm);\n      await core.initRuntime(env);\n      initialized = true;\n    } catch (e) {\n      aborted = true;\n      throw e;\n    } finally {\n      initializing = false;\n    }\n  }\n};\n\nexport const initializeOrtEp = async (epName: string): Promise<void> => {\n  if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n    ensureWorker();\n    return new Promise<void>((resolve, reject) => {\n      enqueueCallbacks('init-ep', [resolve, reject]);\n      const message: OrtWasmMessage = { type: 'init-ep', in: { epName, env } };\n      proxyWorker!.postMessage(message);\n    });\n  } else {\n    await core.initEp(env, epName);\n  }\n};\n\nexport const copyFromExternalBuffer = async (buffer: Uint8Array): Promise<SerializableInternalBuffer> => {\n  if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n    ensureWorker();\n    return new Promise<SerializableInternalBuffer>((resolve, reject) => {\n      enqueueCallbacks('copy-from', [resolve, reject]);\n      const message: OrtWasmMessage = { type: 'copy-from', in: { buffer } };\n      proxyWorker!.postMessage(message, [buffer.buffer]);\n    });\n  } else {\n    return core.copyFromExternalBuffer(buffer);\n  }\n};\n\nexport const createSession = async (\n  model: SerializableInternalBuffer | Uint8Array,\n  options?: InferenceSession.SessionOptions,\n): Promise<SerializableSessionMetadata> => {\n  if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n    // check unsupported options\n    if (options?.preferredOutputLocation) {\n      throw new Error('session option \"preferredOutputLocation\" is not supported for proxy.');\n    }\n    ensureWorker();\n    return new Promise<SerializableSessionMetadata>((resolve, reject) => {\n      enqueueCallbacks('create', [resolve, reject]);\n      const message: OrtWasmMessage = { type: 'create', in: { model, options: { ...options } } };\n      const transferable: Transferable[] = [];\n      if (model instanceof Uint8Array) {\n        transferable.push(model.buffer);\n      }\n      proxyWorker!.postMessage(message, transferable);\n    });\n  } else {\n    return core.createSession(model, options);\n  }\n};\n\nexport const releaseSession = async (sessionId: number): Promise<void> => {\n  if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n    ensureWorker();\n    return new Promise<void>((resolve, reject) => {\n      enqueueCallbacks('release', [resolve, reject]);\n      const message: OrtWasmMessage = { type: 'release', in: sessionId };\n      proxyWorker!.postMessage(message);\n    });\n  } else {\n    core.releaseSession(sessionId);\n  }\n};\n\nexport const run = async (\n  sessionId: number,\n  inputIndices: number[],\n  inputs: TensorMetadata[],\n  outputIndices: number[],\n  outputs: Array<TensorMetadata | null>,\n  options: InferenceSession.RunOptions,\n): Promise<TensorMetadata[]> => {\n  if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n    // check inputs location\n    if (inputs.some((t) => t[3] !== 'cpu')) {\n      throw new Error('input tensor on GPU is not supported for proxy.');\n    }\n    // check outputs location\n    if (outputs.some((t) => t)) {\n      throw new Error('pre-allocated output tensor is not supported for proxy.');\n    }\n    ensureWorker();\n    return new Promise<SerializableTensorMetadata[]>((resolve, reject) => {\n      enqueueCallbacks('run', [resolve, reject]);\n      const serializableInputs = inputs as SerializableTensorMetadata[]; // every input is on CPU.\n      const message: OrtWasmMessage = {\n        type: 'run',\n        in: { sessionId, inputIndices, inputs: serializableInputs, outputIndices, options },\n      };\n      proxyWorker!.postMessage(message, core.extractTransferableBuffers(serializableInputs));\n    });\n  } else {\n    return core.run(sessionId, inputIndices, inputs, outputIndices, outputs, options);\n  }\n};\n\nexport const endProfiling = async (sessionId: number): Promise<void> => {\n  if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n    ensureWorker();\n    return new Promise<void>((resolve, reject) => {\n      enqueueCallbacks('end-profiling', [resolve, reject]);\n      const message: OrtWasmMessage = { type: 'end-profiling', in: sessionId };\n      proxyWorker!.postMessage(message);\n    });\n  } else {\n    core.endProfiling(sessionId);\n  }\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n  InferenceSession,\n  InferenceSessionHandler,\n  SessionHandler,\n  Tensor,\n  TRACE_FUNC_BEGIN,\n  TRACE_FUNC_END,\n} from 'onnxruntime-common';\n\nimport { SerializableInternalBuffer, TensorMetadata } from './proxy-messages';\nimport { copyFromExternalBuffer, createSession, endProfiling, releaseSession, run } from './proxy-wrapper';\nimport { isGpuBufferSupportedType } from './wasm-common';\nimport { isNode } from './wasm-utils-env';\nimport { loadFile } from './wasm-utils-load-file';\n\nexport const encodeTensorMetadata = (tensor: Tensor, getName: () => string): TensorMetadata => {\n  switch (tensor.location) {\n    case 'cpu':\n      return [tensor.type, tensor.dims, tensor.data, 'cpu'];\n    case 'gpu-buffer':\n      return [tensor.type, tensor.dims, { gpuBuffer: tensor.gpuBuffer }, 'gpu-buffer'];\n    default:\n      throw new Error(`invalid data location: ${tensor.location} for ${getName()}`);\n  }\n};\n\nexport const decodeTensorMetadata = (tensor: TensorMetadata): Tensor => {\n  switch (tensor[3]) {\n    case 'cpu':\n      return new Tensor(tensor[0], tensor[2], tensor[1]);\n    case 'gpu-buffer': {\n      const dataType = tensor[0];\n      if (!isGpuBufferSupportedType(dataType)) {\n        throw new Error(`not supported data type: ${dataType} for deserializing GPU tensor`);\n      }\n      const { gpuBuffer, download, dispose } = tensor[2];\n      return Tensor.fromGpuBuffer(gpuBuffer, { dataType, dims: tensor[1], download, dispose });\n    }\n    default:\n      throw new Error(`invalid data location: ${tensor[3]}`);\n  }\n};\n\nexport class OnnxruntimeWebAssemblySessionHandler implements InferenceSessionHandler {\n  private sessionId: number;\n\n  inputNames: string[];\n  outputNames: string[];\n\n  async fetchModelAndCopyToWasmMemory(path: string): Promise<SerializableInternalBuffer> {\n    // fetch model from url and move to wasm heap.\n    return copyFromExternalBuffer(await loadFile(path));\n  }\n\n  async loadModel(pathOrBuffer: string | Uint8Array, options?: InferenceSession.SessionOptions): Promise<void> {\n    TRACE_FUNC_BEGIN();\n    let model: Parameters<typeof createSession>[0];\n\n    if (typeof pathOrBuffer === 'string') {\n      if (isNode) {\n        // node\n        model = await loadFile(pathOrBuffer);\n      } else {\n        // browser\n        // fetch model and copy to wasm heap.\n        model = await this.fetchModelAndCopyToWasmMemory(pathOrBuffer);\n      }\n    } else {\n      model = pathOrBuffer;\n    }\n\n    [this.sessionId, this.inputNames, this.outputNames] = await createSession(model, options);\n    TRACE_FUNC_END();\n  }\n\n  async dispose(): Promise<void> {\n    return releaseSession(this.sessionId);\n  }\n\n  async run(\n    feeds: SessionHandler.FeedsType,\n    fetches: SessionHandler.FetchesType,\n    options: InferenceSession.RunOptions,\n  ): Promise<SessionHandler.ReturnType> {\n    TRACE_FUNC_BEGIN();\n    const inputArray: Tensor[] = [];\n    const inputIndices: number[] = [];\n    Object.entries(feeds).forEach((kvp) => {\n      const name = kvp[0];\n      const tensor = kvp[1];\n      const index = this.inputNames.indexOf(name);\n      if (index === -1) {\n        throw new Error(`invalid input '${name}'`);\n      }\n      inputArray.push(tensor);\n      inputIndices.push(index);\n    });\n\n    const outputArray: Array<Tensor | null> = [];\n    const outputIndices: number[] = [];\n    Object.entries(fetches).forEach((kvp) => {\n      const name = kvp[0];\n      const tensor = kvp[1];\n      const index = this.outputNames.indexOf(name);\n      if (index === -1) {\n        throw new Error(`invalid output '${name}'`);\n      }\n      outputArray.push(tensor);\n      outputIndices.push(index);\n    });\n\n    const inputs = inputArray.map((t, i) =>\n      encodeTensorMetadata(t, () => `input \"${this.inputNames[inputIndices[i]]}\"`),\n    );\n    const outputs = outputArray.map((t, i) =>\n      t ? encodeTensorMetadata(t, () => `output \"${this.outputNames[outputIndices[i]]}\"`) : null,\n    );\n\n    const results = await run(this.sessionId, inputIndices, inputs, outputIndices, outputs, options);\n\n    const resultMap: SessionHandler.ReturnType = {};\n    for (let i = 0; i < results.length; i++) {\n      resultMap[this.outputNames[outputIndices[i]]] = outputArray[i] ?? decodeTensorMetadata(results[i]);\n    }\n    TRACE_FUNC_END();\n    return resultMap;\n  }\n\n  startProfiling(): void {\n    // TODO: implement profiling\n  }\n\n  endProfiling(): void {\n    void endProfiling(this.sessionId);\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Backend, env, InferenceSession, InferenceSessionHandler } from 'onnxruntime-common';\n\nimport { initializeOrtEp, initializeWebAssemblyAndOrtRuntime } from './wasm/proxy-wrapper';\nimport { OnnxruntimeWebAssemblySessionHandler } from './wasm/session-handler-inference';\nimport { scriptSrc } from './wasm/wasm-utils-import';\n\n/**\n * This function initializes all flags for WebAssembly.\n *\n * Those flags are accessible from `ort.env.wasm`. Users are allow to set those flags before the first inference session\n * being created, to override default value.\n */\nexport const initializeFlags = (): void => {\n  if (typeof env.wasm.initTimeout !== 'number' || env.wasm.initTimeout < 0) {\n    env.wasm.initTimeout = 0;\n  }\n\n  if (env.wasm.simd === false) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      'Deprecated property \"env.wasm.simd\" is set to false. ' +\n        'non-SIMD build is no longer provided, and this setting will be ignored.',\n    );\n  }\n\n  if (typeof env.wasm.proxy !== 'boolean') {\n    env.wasm.proxy = false;\n  }\n\n  if (typeof env.wasm.trace !== 'boolean') {\n    env.wasm.trace = false;\n  }\n\n  if (typeof env.wasm.numThreads !== 'number' || !Number.isInteger(env.wasm.numThreads) || env.wasm.numThreads <= 0) {\n    // The following logic only applies when `ort.env.wasm.numThreads` is not set by user. We will always honor user's\n    // setting if it is provided.\n\n    // Browser: when crossOriginIsolated is false, SharedArrayBuffer is not available so WebAssembly threads will not\n    // work. In this case, we will set numThreads to 1.\n    //\n    // There is an exception: when the browser is configured to force-enable SharedArrayBuffer (e.g. Chromuim with\n    // --enable-features=SharedArrayBuffer), it is possible that `self.crossOriginIsolated` is false and\n    // SharedArrayBuffer is available at the same time. This is usually for testing. In this case,  we will still set\n    // numThreads to 1 here. If we want to enable multi-threading in test, we should set `ort.env.wasm.numThreads` to a\n    // value greater than 1.\n    if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n      env.wasm.numThreads = 1;\n    } else {\n      const numCpuLogicalCores =\n        typeof navigator === 'undefined' ? require('node:os').cpus().length : navigator.hardwareConcurrency;\n      env.wasm.numThreads = Math.min(4, Math.ceil((numCpuLogicalCores || 1) / 2));\n    }\n  }\n\n  if (!BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n    // overwrite wasm paths override if not set\n    if (env.wasm.wasmPaths === undefined && scriptSrc && scriptSrc.indexOf('blob:') !== 0) {\n      env.wasm.wasmPaths = scriptSrc.substring(0, scriptSrc.lastIndexOf('/') + 1);\n    }\n  }\n};\n\nexport class OnnxruntimeWebAssemblyBackend implements Backend {\n  /**\n   * This function initializes the WebAssembly backend.\n   *\n   * This function will be called only once for each backend name. It will be called the first time when\n   * `ort.InferenceSession.create()` is called with a registered backend name.\n   *\n   * @param backendName - the registered backend name.\n   */\n  async init(backendName: string): Promise<void> {\n    // populate wasm flags\n    initializeFlags();\n\n    // init wasm\n    await initializeWebAssemblyAndOrtRuntime();\n\n    // performe EP specific initialization\n    await initializeOrtEp(backendName);\n  }\n  createInferenceSessionHandler(\n    path: string,\n    options?: InferenceSession.SessionOptions,\n  ): Promise<InferenceSessionHandler>;\n  createInferenceSessionHandler(\n    buffer: Uint8Array,\n    options?: InferenceSession.SessionOptions,\n  ): Promise<InferenceSessionHandler>;\n  async createInferenceSessionHandler(\n    pathOrBuffer: string | Uint8Array,\n    options?: InferenceSession.SessionOptions,\n  ): Promise<InferenceSessionHandler> {\n    const handler = new OnnxruntimeWebAssemblySessionHandler();\n    await handler.loadModel(pathOrBuffer, options);\n    return Promise.resolve(handler);\n  }\n}\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { OnnxruntimeWebAssemblyBackend } from './backend-wasm';\nexport const wasmBackend = new OnnxruntimeWebAssemblyBackend();\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports */\n\n// We use \"require\" instead of \"import\" here because import statement must be put in top level. Our current code does\n// not allow bundler to tree-shaking code as expected because some codes are treated as having side effects.\n// So we import code inside the if-clause to allow bundler remove the code safely.\n\nexport * from 'onnxruntime-common';\nimport * as ort from 'onnxruntime-common';\nexport default ort;\n\nimport { registerBackend, env } from 'onnxruntime-common';\nimport { version } from './version';\n\nif (!BUILD_DEFS.DISABLE_WEBGL) {\n  const onnxjsBackend = require('./backend-onnxjs').onnxjsBackend;\n  registerBackend('webgl', onnxjsBackend, -10);\n}\n\nif (!BUILD_DEFS.DISABLE_WASM) {\n  const wasmBackend = BUILD_DEFS.DISABLE_TRAINING\n    ? require('./backend-wasm-inference').wasmBackend\n    : require('./backend-wasm-training').wasmBackend;\n  if (!BUILD_DEFS.DISABLE_JSEP) {\n    registerBackend('webgpu', wasmBackend, 5);\n    registerBackend('webnn', wasmBackend, 5);\n  }\n  registerBackend('cpu', wasmBackend, 10);\n  registerBackend('wasm', wasmBackend, 10);\n}\n\nObject.defineProperty(env.versions, 'web', { value: version, enumerable: true });\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.20.0-dev.20240829-be76e1e1b8';\n"]}