[
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n  <a href=\"https://madderscientist.github.io/noteDigger/\" target=\"_blank\">\n    <img width=\"240\" src=\"./img/logo.png\" alt=\"logo\"><br>\n    <img width=\"260\" src=\"./img/logo_text.png\" alt=\"noteDigger\"><br>\n  </a>\n  ~前端辅助人工扒谱工具~\n</div>\n\n# noteDigger!\n“NoteDigger”——音符挖掘者，即扒谱。模仿的是软件wavetone，但是是**双击即用**、**现代UI**的**纯前端**应用。<br>\n就要重复造轮子！即：不使用框架、不使用外部库；目的是减小项目大小，并掌握各个环节。目前频谱分析的软件非常多，功能也超级强大，自知比不过……所以唯一能一战的就是项目体积了！作为一个纯前端项目，就要把易用的优点完全发扬！<br>\n[在线使用](https://madderscientist.github.io/noteDigger/)<br>\n视频演示（视频发布于更新节奏对齐之前）\n<a href=\"https://www.bilibili.com/video/BV1XA4m1G7k4/\" target=\"_blank\"><img src=\"https://i1.hdslb.com/bfs/archive/4700166054a855cfe779f8d93f5ec1fb84293a12.jpg\" alt=\"点击封面跳转视频\" /></a>\n\n## 使用流程\n1. 在线or下载到本地，用主流现代浏览器打开(开发使用Chrome)。\n2. 导入音频——文件-上传，或直接将音频拖拽进去！\n3. 选择声道分析，或者导入之前分析的结果(只有选择音频之后才有导入之前结果的接口)\n4. 根据频谱分析，开始绘制midi音符！可参考下文推荐流程。\n5. 导出为midi等，或者暂时导出项目(下次继续)\n\n### [*建议的扒谱流程](https://www.bilibili.com/video/BV1LFRmBcEEU) 👈视频教程\n1. 导入时选择CQT。视情况勾选GPU。\n2. 在“分析”页面，点击“节奏分析”、“去除谐波”、“调性分析”（建议最后一个运行）。\n3. 勾选“设置”-“播放节拍”，修正节拍；接着使用小节栏右键菜单的“合并下一小节”等功能修正节奏型。\n4. 点击“分析”-“人工智障扒谱”，并在完成后将对应音轨锁定、静音，作为扒谱参考。\n5. 切换吸附模式为“节拍吸附”（顶部工具栏；需要保证节拍已经修得不错了）。\n6. 调整顶部滑条控制频谱强度，人工完成后续扒谱。\n\n## 导入导出说明\n- 导出进度: 结果是.nd的二进制文件，保存频谱图、音符、音轨、小节等信息。导入的时候并不会强制要求匹配原曲！(会根据文件名判断一下，但不强制)\n- 导出为midi: 有两个模式。模式二只保证能听，节拍默认4/4，bpm默认60，midi类型默认1(同步多音轨)，时间精度和设置的精度一致(因此如果midi先导入再导出会有量化误差)；模式一会根据小节线进行对齐(需要用户设置好小节线)，可以直接用于制谱，算法概述见下面“节奏对齐”。由于midi协议规定第十轨用于打击乐，因此扒谱时旋律需要避开第十轨，可以设置一个空音轨占位。本应用没有设计避开第十轨，也没设计扒鼓点，因此扒谱时第十轨虽然听起来还是乐音，但导出为midi后会变成鼓点。\n- 导入midi: 将midi音符导入，只保证音轨、音符、音色能对应，音量默认127。如果导入后没有超过总音轨数，会在后面增加；否则会覆盖后面几轨(有提示)。\n\n## 常规操作\n- 空格: 播放\n- **双击**时间轴: 从双击的位置开始播放\n- 在时间轴上拖拽: 设置重复区间\n- 在时间轴上拉动小节线: 设置小节bpm；若按住shift拖动，只改变该小节线位置、不影响后续小节\n- 鼠标**中键**时间轴: 将时间设置到点击位置，播放状态保持上一刻\n- 鼠标**右键**时间轴(上半/下半): 具体设置重复时间/小节\n- 按住空白拖动: 在当前音轨绘制一个音符\n- 按住音符左半边拖动: 改变位置\n- 按住音符右半边拖动: 改变时长\n- Ctrl+点击音符: 多选音符\n- delete: 删除选中的音符\n- Ctrl+滚轮: 横向缩放\n- 按住**中键**拖拽、**触摸板**滑动: 移动视野\n\n## 快捷键\n只有在导入并分析音频之后才能使用这些快捷键\n- Ctrl+Z: 撤销(只记录16次历史，音轨、音符、小节线操作均会被记录)\n- Ctrl+Y: 重做\n- Ctrl+A: 全选当前音轨\n- Ctrl+Shift+A: 全选所有音轨\n- Ctrl+D: 取消选中\n- Ctrl+C: 复制选中的音符\n- Ctrl+X: 剪贴选中的音符\n- Ctrl+V: 粘贴到选中的音轨上（暂不实现跨页面粘贴）\n- Ctrl+B: 呼出/收回音轨面板\n- Shift+右键: 菜单，包含撤销/重做、复制/粘贴、反选当前轨、删除\n- ←↑→↓: 视野移动一格\n- PageUp、PageDown：向前翻页/向后翻页\n- Home：设置播放位置为0，播放状态保持上一刻\n\n## 小细节\n- 滑动条，如果旁边有数字，点击就可以恢复初始值。\n- 多次点击“笔”右侧的选择工具，可以切换选择模式。（注意，只能选中当前音轨的音符）\n- 点击某个音符可以选中该轨。\n- 选择乐器时，展开下拉框并且按首字母可以快速跳转（浏览器下拉框自带）。\n- 音轨中，“闭眼”只是看不见，还是可以操作的；一般要搭配“锁定”使用，默认两者会联动。\n\n## 支持的格式\n推荐使用常见的mp3、wav文件；除此之外，视频类文件也可以使用，比如mp4、mov、m4v。\n但是如下格式不支持（浏览器API不支持解析）（仅仅在Chrome浏览器尝试过）：\n- aiff（苹果的音频格式）\n\n对于ios的Safari浏览器，上传音频文件也许有些困难。可以选择视频。（不过为什么要用触屏控制啊，根本没适配）\n\n## 其他说明\n分析-自动填充，原理是将大于阈值的标记出来，效果不堪入目……于是研究并引入了基于神经网络的扒谱（分析-人工智障扒谱），但是效果非常初级。如有想法欢迎call me。\n\n## 关于节奏对齐\n若为了制谱，导出 MIDI 时，应该进行量化对齐。<br>\n对齐算法需要提供精度参数 $x$，会用时长比 $\\frac{\\text{音符时长}}{x}$ 小的、最大的 $2^k$ 分音符（时长为四分音符的 $2^{2-k}$）对开头和结尾时刻进行量化。例如 $x=2$ 时，四分音符将按照八分音符的划分对齐、八分音符则按十六分音符的划分对齐……不过这也意味着四分音符只可能在整数倍个八分音符的时长处开始，而不可能在第3个十六分音符的时刻起音。<br>\n因此，如果你保证对齐非常精准（比如使用了节拍吸附，见下文），那么 $x$ 应该调大一些；如果你大多时间用格点吸附或不吸附，那么 $x$ 应该小一些。\n\n### 新版本\n新版本新增了按小节线吸附的方式，强烈推荐使用（可通过顶部工具栏的吸附模式切换）。在该模式下，音符可以完美对齐小节线。当然，三连音这类节奏仍需借助其他模式绘制。<br>\n横向缩放间距可调节吸附线的精度，从而支持任意有限位二进制小数表示的时长。这是一个很好的设计：既没有破坏以“秒”为单位的时间轴概念（下文），也兼容了小节对齐的需求。\n\n### 老版本\n很长一段时间内，noteDigger只有格点吸附。音符绘制精度与最初选择的音频分析精度一致，绘制音符大概是不能精准对齐小节线了（但是导出midi的时候可以用对齐算法），**需要强迫症忍受一下**。<br>\n乐谱的基本单位是“x分音符”，而音频的基本单位是“秒”。要实现小节对齐，必须将单位统一为“x分音符”。\n然而，整个程序的时间轴以“秒”为单位，这是由频谱分析决定的。若要实现类似制谱软件的对齐方式，音符绘制就必须按“x分音符”对齐。这意味着，在 120 BPM 小节下的音符，若被拖放到 60 BPM 的小节中，在以秒为单位的时间轴上，其时间会变长——Wavetone 正是这样处理的。<br>\n但是对着原曲扒谱，最好还是根据\"秒\"来绘制音符。用 Wavetone 扒谱的体验中，我最讨厌的就是被\"x分音符\"限制。用秒可以保证和原曲完全贴合，使用很灵活。但是这样导出的 MIDI 不能直接制谱。按照\"x分音符\"来绘制音符还会导致程序很难写。开发者和使用者都不快乐。<br>\n扒谱用秒为单位合适，而制谱用“x分音符”合适。为了跨越这个鸿沟，我这样设计了程序：使用midi文件作为对外的桥梁，在noteDigger内用秒为单位扒谱，导出为midi的时候根据小节进行量化，形成规整的midi用于制谱。具体实现是：在秒轴上加入小节轴，用户可以拖动小节轴的某个小节调节后面紧跟的bpm相同的小节。\n\n> 因此老版本中量化对齐特别重要：小节线仅为视觉对齐辅助；而现在小节线以及内部的自动细分线，成为了节拍吸附模式下真正有用的吸附锚点。\n\n## 文件结构\n```\n│  app.js: 最重要的文件，主程序\n│  favicon.ico: 小图标\n│  index.html: 程序入口, 其js主要是按钮的onclick\n│  jsconfig.json: 开发用 跨文件JS解析\n│  LICENSE\n│  README.md\n│\n├─core: app.js用到的核心组件\n│      app_analyser.js: 算法相关\n│      app_audioplayer.js: 音频播放\n│      app_beatbar.js: 小节轴\n│      app_hscrollbar.js: 底部滑动条\n│      app_io.js: 管理输入与输出\n│      app_keyboard.js: 左侧键盘\n│      app_midiaction.js: 与音符的交互\n│      app_midiplayer.js: 音符播放\n│      app_spectrogram.js: 频谱绘制\n│      app_timebar.js: 时间轴\n│      \n├─lib\n│      beatBar.js: 节奏信息的稀疏存储\n│      fakeAudio.js: 模拟了不会响的Audio，用于midi编辑器模式\n│      midi.js: midi创建、解析类\n│      saver.js: 二进制保存相关\n│      snapshot.js: 快照类, 实现撤销和重做\n│      tinySynth.js: 合成器类, 负责播放音频\n|\n├─ui\n│      channelDiv.js: 多音轨的UI界面类, 可拖拽列表\n│      contextMenu.js: 右键菜单类\n│      myRange.js: 横向滑动条的封装类\n│      siderMenu.js: 侧边栏菜单类\n│      \n├─plugins\n│      chordEst.js\n│      pitchName.js\n|\n├─dataProcess\n|   |  aboutANA.md: 自动音符对齐的数学建模\n|   |  ANA.js: 自动音符对齐\n│   │  bpmEst.js: 节奏分析\n|   │  analyser.js: 频域数据分析与简化\n|   │  fft_real.js: 执行实数FFT获取频域数据\n|   │  stftGPU.js: 使用WebGPU加速STFT\n|   |  NNLS.js: 非负最小二乘 用于去除谐波\n|   |\n|   ├─AI\n│   │  │  AIEntrance.js: 开启AI的worker的入口\n│   │  │  basicamt_44100.onnx: 音色无关转录 神经网络模型\n│   │  │  basicamt_worker.js: 音色无关转录 新线程\n│   │  │  postprocess.js：神经网络结果到音符的后处理\n│   │  │  septimbre_44100.onnx: 音色分离转录 神经网络模型\n│   │  │  septimbre_worker.js: 音色分离转录 新线程\n│   │  │  SpectralClustering.js: 音色分离转录需要的 谱聚类\n|   │  │\n|   │  └─dist: onnxruntime打包\n|   │          bundle.min.js\n|   │          ort-wasm-simd.wasm\n|   |\n│   └─CQT\n│          cqt.js: 开启worker进行后台CQT\n│          cqt_worker.js: CQT类与新线程\n│\n├─docs\n│      todo.md: 一些设计思路和权衡\n│          \n├─img\n│      bilibili-white.png\n│      github-mark-white.png\n│      logo-small.png\n│      logo.png\n│      logo_text.png\n│\n└─style\n    │  askUI.css: 达到类似<dialog>效果\n    │  channelDiv.css: 多音轨UI样式\n    │  contextMenu.css: 右键菜单样式\n    │  myRange.css: 包装滑动条\n    │  siderMenu.css: 侧边菜单样式\n    │  style.css: index中独立元素的样式\n    │\n    └─icon: 从阿里图标库得到的icon\n            iconfont.css\n            iconfont.ttf\n            iconfont.woff\n            iconfont.woff2\n```\n\n## 重要更新记录\n### 2026 2 22\n增加了和弦识别功能，并优化了项目结构。\n\n### 2026 2 14\n利用NNLS完成了谐波的去除/基频的增强。<br>\n代码位于[reduceHarmonic](app_analyser.js)。原理为用谐波模板拟合频谱，进而得到谐波，并收集谐波的能量用于加强基频。该方法能大大增强基频的明显程度。\n\n### 2026 1 28\n完成了基于WebGPU的STFT、CQT计算，即使在核显上也有显著加速。美中不足的是无法得知GPU算的进度，因此交互较弱<br>\n也尝试了利用CQT相位分析瞬时频率，但效果太鸡肋被放弃，相关代码在另一个分支。\n\n### 2026 1 23\n更新了自动节奏检测功能，相关功能设置在“分析-节奏分析”中。<br>\n使用传统信号处理算法，**基于已经分析的频谱进行**，[原理点这](https://zhuanlan.zhihu.com/p/1995849093491222501)。目前节拍识别较为准确，但节奏型与重拍的跟踪（勾选“自动节奏型”）效果不佳。建议在CQT分析前后都进行一次（等10秒左右会发现频谱改变，改变前是STFT，改变后是CQT），基于STFT的节奏全局更准，基于CQT的局部更精确。目前的算法参数仅仅根据20帧/秒时调整，其他分辨率不保证效果。<br>\n为了让人工后处理更为便捷，在节奏栏右键增加了许多功能。\n\n### 2025 12\n更新了音色无关转录模型，效果比之前好，且运行时间更短。<br>\n加入了音色分离转录，但是效果不怎么好，只适用于几个音色差异较大的简单场景，不同音色的音符不能重叠。推荐用于二重奏的情况，比如钢琴伴奏的某乐器独奏。\n\n### 2025 9 20\n降低重绘频率，降低闲时CPU占用为原来的1/10。感谢[Initsnow的pr](https://github.com/madderscientist/noteDigger/pull/7)指出问题。<br>\n有三类地方会触发刷新：\n1. 播放时保持高刷 在 `AudioPlayer.update` 中触发刷新\n2. 所有键鼠操作。最初的想法是需要的地方触发刷新，但是牵扯的非常多——\n    - 快捷键。有些快捷键需要触发刷新，不如一刀切。\n    - 鼠标操作\n        - 在频谱画布上的操作：`MidiAction.updateView` 触发更新还不够（只负责了音符绘制模式），还有选择区域\n        - 在时间轴上的动作：重复区间 -> 可以在 `TimeBar.setRepeat` 中触发更新；设置节拍 -> 可以在回调中触发更新\n        - 在钢琴画布上的动作：垂直方向移动，回调触发即可\n        - 画布之外的操作 只能设置统一的api；而音轨操作这种却不好加\n        - 没考虑到的功能——谁知道漏了会发生什么问题\n\n    综合考虑下，选择终极一刀切——所有用户操作都会触发刷新，仅需额外添加回调，不需要考虑具体动作，便于维护。\n3. `MidiAction.updateView` 处理一切音符变化。之所以不能被键鼠操作取代，因为ai扒谱延迟修改了音符。<br>\n    由于`scroll2`调用了`updateView`，因此还覆盖了`resize`、Spectrogram setter\n\n### 2025 8 21\n实现了自动音符对齐(auto note alignment)，输入数字谱，得到和音频同步的音符，即“数字谱+音频→midi”。入口为：“分析”-“数字谱对齐音频”，输入单声部的数字谱，并调整八度范围，确定即可。注意，\"1\"对应的是C5，比常规约定高了八度，这是因为我发现往往分析泛音更为准确。如果效果不好，可以通过前后增加中/小括号实现八度升降。<br>\n效果并不优秀，因为使用了传统的数学建模方法，但胜在计算量小。相关说明与建模见[aboutANA.md](./dataProcess/aboutANA.md)。<br>\n2025/12/27 将此算法整理为[文章](https://zhuanlan.zhihu.com/p/1988276192063800011)。\n\n### 2025 8 14\n项目代码的整理，将功能拆分到单独文件（虽然模块间仍未解耦，但终于拆分了！），并增加了开发配置文件（感觉TS是对的啊！但放不下JS里面的奇技淫巧）。<br>\n修复了陈年bug：调整小节时不时“拉不动”、STFT偏早。\n\n### 2025 8 12\n进行了频谱的归一化，便于后续的研究与分析。归一化基于能量谱，同[timbreAMT](https://github.com/madderscientist/timbreAMT/blob/main/model/CQT.py)的做法，简而言之：令每一帧的能量的方差为1。<br>\n重大的改动：WASM的CQT → JS的CQT。早期实验发现两者用时接近，为了纪念第一次使用WASM加速而保留。但升级CPU后发现JS版本用时不到WASM的一半，而且代码更少、文件更小。遂欣然废除。若要学习“C++编译为WASM”可以查看此前的历史提交。\n\n### 2025 3 25\n引入了“自动音乐转录”，即“AI扒谱”，导入音频后（或进入MIDI编辑器模式）在“分析”页面点击“**人工智障扒谱**”选项，一首两分半的曲子大概需要半分钟分析。由于追求低内存开销，我没保存音频数据，因此AI扒谱前要重新选择文件。<br>\n使用的模型是我毕设的一部分，设计与训练过程请查看[timbreAMT](https://github.com/madderscientist/timbreAMT)的basicamt文件夹，我称之为“音色无关转录”，即不会根据乐器种类分轨输出，但对大部分音色有适用性。对标的是basicPitch，效果接近且更加轻量，但无论是我的还是他的，结果都仅仅能听，而我的相比basicPitch优点在于集成在了noteDigger中，可以便捷地进行人工后处理，如删去多余音符、对齐节奏等。<br>\n为了支持人工后处理，有了前几次更新，最重要的是：\n1. 音符力度用透明度体现，便于用户看清AI扒谱结果中重要的音符。在“设置”中可以关掉透明度。\n2. 音轨的锁，用于锁定AI扒谱结果，用户可以在新的音轨中“描”一遍，相当于把AI扒谱结果当做频谱。\n\n### 2024 8 29\n引入了理论上更精确的CQT分析。非file协议时（不是双击html文件打开时），当STFT（默认的计算方法）计算完成会在后台自动开启CQT计算，CQT结果将与当前频谱融合（会发现突然频谱变了）。CQT计算非常慢，因此在后台计算以防阻塞，且用C++实现、编译为WASM以提速。<br>\n中途遇到很多坑，记录分布在/dataProcess/CQT的各个文件中，但效果其实并不值得这样的计算量。5分30秒的音频进行双声道CQT分析，需要45秒（从开启worker开始算），和直接进行js版的CQT用时差不多，加速了个寂寞。<br>\n关于CQT的研究，记录在[《CQT：从理论到代码实现》](https://zhuanlan.zhihu.com/p/716574483)。<br>\n此外尝试了“一边分析一边绘制频谱”，试图通过删除进度条达到感官上加速的效果。但是放在主线程造成严重卡顿，放弃。\n\n### 2024 8 2\n完成了issue2：不导入音频的midi编辑器。点击文件菜单下的“MIDI编辑器模式”就可以进入。<br>\n视野的宽度取决于最后一个音符，模仿的是[signal](https://signal.vercel.app/edit)。也尝试过自动增加视野，可以一直往右拉，但是这样在播放的时候，开启“自动翻页”会永远停不下来（翻一页就自动拓展宽度）。<br>\n扒谱框架下的midi编辑器还是有些反人类，因为绘制音符时的单位是时间而不是x分音符。不过也能用。<br>\n原理是实现了一个空壳的Audio，只有计时功能，没有发声功能。一些做法写在了todo.md上。\n\n### 2024 2 22\n加入了节拍对齐功能，使用逻辑是：扒谱界面提供视觉辅助，导出midi会自动对齐，以实现制谱友好。详细对齐的原理请参看“关于节奏对齐”板块和midiExport.js文件。<br>\n有一些细节：<br>\n1. 如果每个小节bpm都不一样（原曲的速度不稳，有波动），那导出midi前的对齐操作会以上一小节bpm为基准进行动态适应：先根据本小节的bpm量化音符为\"x分音符\"，如果本小节bpm和上一小节的bpm差别在一定范围内，则再将\"x分音符\"的bpm设置全局量BPM；否则将全局BPM设置为当前小节的bpm。这个算法的要求是：的确要变速的前后bpm差异应该较大。<br>\n2. 在一个小节内，音符的近似方法：\n\n    1. 记一个四分音符的格数为aqt（因为音符的实际使用单位是格。这里隐含了一个时间到格数的变换），某时刻t对应音符长度为ntlen，小节开始时刻记为mt。首先获取音符时刻相对小节开头的位置nt=t-mt。（音符时刻：将一个音符拆分为开始时刻和结束时刻。一个音符可能跨好几个小节，因此这样处理最为合适）\n    2. 假设前提：时长长的音符的起点和终点的精度也低（精度这里指最小单位时长，低精度指单位时长对应的实际时间长）。因此近似精度accu采用自适应的方式：该音符可以用(ntlen/aqt)个四份音符表示，设其可以用一个(4*2^n)分音符近似，其中n满足：(1/2)^n<=ntlen/aqt<(1/2)^(n-1)，则该音符的时长为aqt/(2^n)，则精度设置为这个近似音符的一半：accu = aqt/(2^(n+1))。比如四份音符的精度是一个八分音符的时长。\n    3. 近似后的时刻为：round(nt/accu)*accu。同时设置一个最低精度：八分音符。因此accu=min(aqt/2, aqt/(2^(n+1)))，其中(1/2)^n<=ntlen/aqt<(1/2)^(n-1)。\n\n3. 小节信息如何存储、数据结构如何设计需要好好想想。大部分情况下（在原音频节奏稳定的情况下）只会变速几次，此时存变动时刻的bpm值就足矣。极端情况下每个小节都单独设置了bpm。如何设计数据结构能在两种情况下都取得较好的性能？使用稀疏数组。\n\n### 2024 2 9\n在今年完成了所有基本功能！本次更新了设置相关，简单地设计了调性分析的算法，已经完全可以用了！【随后在bilibil投稿了视频】\n\n### 2024 2 8\n文件系统已经完善！已经可以随心所欲导入导出保存啦！同时修复了一些小bug、完善了一些api。<br>\n界面上，本打算将文件相关选项放到logo上，但是侧边菜单似乎有些空了，于是就加入到侧边栏，而logo设置为刷新或开新界面（考察了其他网站的logo的用途）。同时给侧边菜单加入了“设置”和“分析”，但本次更新没做。<br>\nmidi相关操作来自[我的另一个项目](https://github.com/madderscientist/je_score_operator)的midi类。将用midi转的wav导入分析，再导入原midi，两者同步播放的感觉真好！\n\n### 2024 2 5\n已经能用于扒谱了！完成了midi和原曲的播放与同步，填补了扒谱过程最重要的一环。<br>\nUI基本完成！将侧边栏、滑动条封装成了js类。在此基础上，设计了类似VScode的菜单，用于存放不常用的功能和界面；而顶部窄窄一条用于放置常用功能。<br>\n此外，完成了logo的设计。在2月4日的commit记录中(因为现在已经删除)可以看到设计的多种logo，最终选定了“在勺子里的音符”，这是一个被勺子dig出来的音符。其他思路可以概括为：“音符和铲子的组合”(logo2)、“埋在地里的音符”(logo5 logo6)、“像植物一样生长的八分音符”(logo8 logo10)、“音符和铲子结合”(logo12)。\n\n### 2024 2 1\n完成了多音轨、合成器和主线的整合，象征着midi系统的完成！<br>\n统一了UI风格；完善了快捷键功能；新增框选功能；修复了大部分bug。\n\n### 2024 1 30\n完成了midi合成器tinySynth.js，实现了128种音色的播放。只有演奏音符的作用，控制器一点没做。<br>\n原理是多个基础波形合成一个音色。波形参数来自 https://github.com/g200kg/webaudio-tinysynth ，因此程序设计也参考了它的设计。修改记录在todo.md中<br>\n对于reference的解析（作者注释一点没写，变量命名极为简单，因此主要是变量解释）存放于“./tone/解析.md”(文件夹已被删除，请去历史提交查看)。文件夹中还有tinySynth的测试页面。在下一次push时将删除tone文件夹。<br>\n这段时间内还完成了以下内容（全部记录在commit history的comments内）：\n- 基本程序界面(三个画布：键盘、时频图、时间轴；UI界面：右键菜单、多音轨、滑动条)\n- 基本逻辑功能：音符交互绘制、快捷键以及模块的关联协同\n\n### 2023 12 13\n从11月14日开始造js版fft轮子起，时隔一个月第一次提交项目，因为项目逻辑日渐复杂，需要能及时回退。主要完成了频谱绘制、钢琴键盘绘制、数据处理三部分，并初步确定了程序的结构框架。<br>\n数据处理核心：实数FFT，编写于我《数字信号处理》刚刚学完FFT算法之时，针对本项目的应用场景做了专门的设计，即针对音频STFT做了适配，具体表现为：实数加速、数据预计算、空间预分配、共用数组。<br>\n由于整个项目还没搭建起来，因此不能测试NoteAnalyser类的数据处理效果。此类用于将频域数据进一步离散为音符强度数据。<br>\n关于程序结构有一版废案，在文件夹\"deprecated\"中，设计思路是解耦、插件化，废弃理由是根本解耦不了。因此现在的代码耦合成一坨了。这个文件夹将在下一次push时被删除，存活于历史提交之中。<br>\ntone文件夹将存放我的合成器轮子，audioplaytest是我音频播放的实验文件夹，todo.md是部分设计思路。<br>\n2024/4/8补记：时频分析方法是STFT，但是面临时间和频率分辨率矛盾的问题，现在的分析精度只能到F#2。解决办法是用小波变换，或者更本质一点：用84个滤波器提取84个基准音以及其周围的频率的能量。这样能达到更高的频率分辨率和时间分辨率。但是现在的STFT用起来效果还可以，就不换了哈。"
  },
  {
    "path": "app.js",
    "content": "// 用这种方式(原始构造函数)的原因：解耦太难了，不解了。this全部指同一个。其次为了保证效率\n// 防止在html初始化之前getElement，所以封装成了构造函数，而不是直接写obj\nfunction App() {\n    this.event = new EventTarget();\n    // 键盘和时间轴 其绘制由工作区管理\n    this.keyboard = document.getElementById('piano');\n    this.keyboard.ctx = this.keyboard.getContext('2d', { alpha: false, desynchronized: true });\n    this.timeBar = document.getElementById('timeBar');\n    this.timeBar.ctx = this.timeBar.getContext('2d', { alpha: false, desynchronized: true });\n    // 工作区图层\n    this.layerContainer = document.getElementById('main-layers');\n    this.layers = this.layerContainer.layers = {\n        spectrum: LayeredCanvas.new2d('spectrum', false),\n        action: LayeredCanvas.new2d('actions', true)\n    };\n    Object.defineProperty(this.layers, 'width', {\n        get: function () { return this.spectrum.width; },\n        set: function (w) {\n            for (const c in this) this[c].width = w;\n        }, enumerable: false\n    });\n    Object.defineProperty(this.layers, 'height', {\n        get: function () { return this.spectrum.height; },\n        set: function (h) {\n            for (const c in this) this[c].height = h;\n        }, enumerable: false\n    });\n    Object.defineProperty(this.layers, 'addLayer', {\n        value: (name, zIndex) => {\n            if (this.layers[name]) return this.layers[name];\n            const canvas = document.createElement('canvas');\n            canvas.style.zIndex = zIndex;\n            this.layerContainer.appendChild(canvas);\n            return this.layers[name] = LayeredCanvas.new2d(canvas, true);\n        }, enumerable: false\n    });\n    Object.defineProperty(this.layers, 'removeLayer', {\n        value: (name, zIndex) => {\n            if (this.layers[name]) {\n                this.layers[name].canvas.remove();\n                delete this.layers[name];\n            }\n        }, enumerable: false\n    });\n\n    this.layers.action.mask = '#25262da8';\n    Object.defineProperty(this.layers.action, 'Alpha', {\n        get: function() {\n            return parseInt(this.mask.substring(7), 16);\n        },\n        set: function(a) {\n            a = Math.min(255, Math.max(a | 0, 0));\n            this.mask = '#25262d' + a.toString(16).padStart(2, '0');\n            this.dirty = true;\n        }, enumerable: false\n    });\n\n    this.midiMode = false;\n    this.TperP = -1;    // 每个像素代表的ms\n    this.PperT = -1;    // 每ms代表的像素\n    this._width = 5;    // 每格的宽度\n    Object.defineProperty(this, 'width', {\n        get: function () { return this._width; },\n        set: function (w) {\n            if (w <= 0) return;\n            this._width = w;\n            this.TimeBar.updateInterval();\n            this.HscrollBar.refreshSize();  // 刷新横向滑动条\n            this.TperP = this.dt / this._width;\n            this.PperT = this._width / this.dt;\n            this.Spectrogram.onresize();\n        }\n    });\n    this._height = 15;   // 每格的高度\n    Object.defineProperty(this, 'height', {\n        get: function () { return this._height; },\n        set: function (h) {\n            if (h <= 0) return;\n            this._height = h;\n            this.Keyboard.setYchange(h);\n            this.keyboard.ctx.font = `${h + 2}px Arial`;\n            this.layers.action.ctx.font = `${h}px Arial`;\n            this.Spectrogram.onresize();\n        }\n    });\n    this.ynum = 84;     // 一共84个按键\n    this._xnum = 0;     // 时间轴的最大长度\n    Object.defineProperty(this, 'xnum', {   // midi模式下需要经常改变此值，故特设setter\n        get: function () { return this._xnum; },\n        set: function (n) {\n            if (n <= 0) return;\n            this._xnum = n;\n            // 刷新横向滑动条\n            this.HscrollBar.refreshPosition();\n            this.HscrollBar.refreshSize();\n            this.idXend = Math.min(this._xnum, Math.ceil((this.scrollX + this.layers.width) / this._width));\n        }\n    });\n    this.dt = 50;       // 每次分析的时间间隔 单位毫秒 在this.Analyser.stft this.io.onfile this.io.projFile.import 中更新\n    this.time = -1;     // 当前时间 单位：毫秒 在this.AudioPlayer.update中更新\n\n    // 以下变量仅在scroll2中更新(特别标记的除外)\n    this.scrollX = 0;   // 视野左边和世界左边的距离\n    this.scrollY = 0;   // 视野下边和世界下边的距离\n    this.idXstart = 0;  // 开始的X序号\n    this.idYstart = 0;  // 开始的Y序号\n    this.idXend = 0;    // 【还在 xnum setter 中更新】\n    this.idYend = 0;\n    this.rectXstart = 0;// 目前只有Spectrogram.update在使用\n    this.rectYstart = 0;// 画布开始的具体y坐标(因为最下面一个不完整) 迭代应该减height 被画频谱、画键盘共享\n\n    // spectrum的重绘仅在 视野滚动(scroll2) 数据改变(会触发scroll2) 倍率改变\n    // 下面的函数控制action层的重绘 重绘时机: scroll2; AudioPlayer.update; 键鼠操作\n    this.makeActDirty = () => { this.layers.action.dirty = true; }; // 供外部调用\n\n    /**\n     * 设置播放时间 如果立即播放(keep==false)则有优化\n     * @param {number} t 时间点 单位：毫秒\n     * @param {boolean} keep 是否保存之前的状态 如果为false则立即开始\n     */\n    this.setTime = (t, keep = true) => {\n        this.synthesizer.stopAll();\n        if (keep) {\n            this.time = t;\n            this.AudioPlayer.audio.currentTime = t / 1000;\n            this.AudioPlayer.play_btn.firstChild.textContent = this.TimeBar.msToClockString(t);\n            this.MidiPlayer.restart();\n        } else {    // 用于双击时间轴立即播放\n            this.AudioPlayer.start(t);  // 所有操作都在start中\n        }\n    };\n    this._mouseY = 0;   // 鼠标当前y坐标\n    Object.defineProperty(this, 'mouseY', {\n        get: function () { return this._mouseY; },\n        set: function (y) {\n            this._mouseY = y;\n            this.Keyboard.highlight = Math.floor((this.scrollY + this.layers.height - y) / this._height) + 24;\n        }\n    });\n    this._mouseX = 0;   // 鼠标当前x坐标\n    Object.defineProperty(this, 'mouseX', {\n        get: function () { return this._mouseX; },\n        set: function (x) {\n            this._mouseX = x;\n            this.MidiAction.frameXid = Math.floor((x + this.scrollX) / this._width);\n        }\n    });\n    this.preventShortCut = false;   // 当需要原始快捷键时(比如输入框)修改此为true\n    this.audioContext = new AudioContext({ sampleRate: 44100 });\n    this.synthesizer = new TinySynth(this.audioContext);\n    this.Spectrogram = new _Spectrogram(this);\n    this.MidiAction = new _MidiAction(this);\n    this.MidiPlayer = new _MidiPlayer(this);\n    this.AudioPlayer = new _AudioPlayer(this);\n    this.Keyboard = new _Keyboard(this); this.height = this._height; // 更新this.Keyboard._ychange\n    this.TimeBar = new _TimeBar(this);\n    this.BeatBar = new _BeatBar(this);\n    // 撤销相关\n    this.snapshot = new Snapshot(16, {\n        // 用对象包裹，实现字符串的引用\n        midi: { value: JSON.stringify(this.MidiAction.midi) },  // 音符移动、长度改变、channel改变后\n        channel: { value: JSON.stringify(this.MidiAction.channelDiv.channel) }, // 音轨改变序号、增删、修改参数后\n        beat: { value: JSON.stringify(this.BeatBar.beats) }\n    });\n    // changed = channel变化<<1 | midi变化<<2 | beat变化<<3\n    this.snapshot.save = (changed = 0b111) => {\n        const nowState = this.snapshot.nowState();\n        const lastStateNotExists = nowState == null;\n        this.snapshot.add({\n            channel: (lastStateNotExists || (changed & 0b1)) ? { value: JSON.stringify(this.MidiAction.channelDiv.channel) } : nowState.channel,\n            midi: (lastStateNotExists || (changed & 0b10)) ? { value: JSON.stringify(this.MidiAction.midi) } : nowState.midi,\n            beat: (lastStateNotExists || (changed & 0b100)) ? { value: JSON.stringify(this.BeatBar.beats) } : nowState.beat\n        });\n    };\n    this.HscrollBar = new _HscrollBar(this);\n    this._copy = '';  // 用于复制音符 会是JSON字符串\n    this.shortcutActions = {    // 快捷键动作\n        'Ctrl+Z': () => {   // 撤销\n            let lastState = this.snapshot.undo();\n            if (!lastState) return;\n            this.MidiAction.midi = JSON.parse(lastState.midi.value);\n            this.MidiAction.selected = this.MidiAction.midi.filter((obj) => obj.selected);\n            this.MidiAction.channelDiv.fromArray(JSON.parse(lastState.channel.value));\n            this.BeatBar.beats.copy(JSON.parse(lastState.beat.value));\n            this.MidiAction.updateView();\n        },\n        'Ctrl+Y': () => {\n            let nextState = this.snapshot.redo();\n            if (!nextState) return;\n            this.MidiAction.midi = JSON.parse(nextState.midi.value);\n            this.MidiAction.selected = this.MidiAction.midi.filter((obj) => obj.selected);\n            this.MidiAction.channelDiv.fromArray(JSON.parse(nextState.channel.value));\n            this.BeatBar.beats.copy(JSON.parse(nextState.beat.value));\n            this.MidiAction.updateView();\n        },\n        'Ctrl+A': () => {           // 选中该通道的所有音符\n            let ch = this.MidiAction.channelDiv.selected;\n            if (ch) {\n                ch = ch.index;\n                this.MidiAction.midi.forEach((note) => {\n                    note.selected = note.ch == ch;\n                });\n                this.MidiAction.selected = this.MidiAction.midi.filter((nt) => nt.selected);\n            } else this.shortcutActions['Ctrl+Shift+A']();\n        },\n        'Ctrl+Shift+A': () => {     // 真正意义上的全选\n            this.MidiAction.midi.forEach((note) => {\n                note.selected = true;\n            });\n            this.MidiAction.selected = [...this.MidiAction.midi];\n        },\n        'Ctrl+D': () => {           // 取消选中\n            this.MidiAction.clearSelected();\n        },\n        'Ctrl+C': () => {\n            if (this.MidiAction.selected.length == 0) return;\n            this._copy = JSON.stringify(this.MidiAction.selected);\n        },\n        'Ctrl+X': () => {\n            if (this.MidiAction.selected.length == 0) return;\n            this._copy = JSON.stringify(this.MidiAction.selected);\n            this.MidiAction.deleteNote();   // deleteNote会更新view和存档\n        },\n        'Ctrl+V': () => {\n            if (!this._copy) return;    // 空字符串或null\n            const ch = this.MidiAction.channelDiv.selected;\n            if (!ch) { alert(\"请先选择一个音轨!\"); return; }\n            let chid = ch.index;\n            let copy = JSON.parse(this._copy);\n            // 找到第一个\n            let minX = Infinity;\n            copy.forEach((note) => {\n                note.ch = chid;\n                note.selected = true;\n                if (note.x1 < minX) minX = note.x1;\n            });\n            this.MidiAction.clearSelected();\n            this.MidiAction.selected = copy;\n            // 粘贴到光标位置\n            minX = (this.time / this.dt - minX) | 0;\n            copy.forEach((note) => {\n                note.x1 += minX;\n                note.x2 += minX;\n            });\n            this.MidiAction.midi.push(...copy);\n            this.MidiAction.midi.sort((a, b) => a.x1 - b.x1);\n            this.MidiAction.updateView();\n            this.snapshot.save(0b10);   // 只保存midi的快照\n        },\n        'Ctrl+B': () => {       // 收回面板\n            const channelDiv = this.MidiAction.channelDiv.container.parentNode;\n            if (channelDiv.style.display == 'none') {\n                channelDiv.style.display = 'block';\n            } else {\n                channelDiv.style.display = 'none';\n            } this.resize();\n        }\n    };\n    /**\n     * 改变工作区(频谱、键盘、时间轴)大小\n     * @param {number} w 工作区的新宽度 默认充满父容器\n     * @param {number} h 工作区的新高度 默认充满父容器\n     * 充满父容器，父容器需设置flex:1;overflow:hidden;\n     */\n    this.resize = (w = undefined, h = undefined) => {\n        const box = document.getElementById('Canvases-Container').getBoundingClientRect();\n        w = w || box.width;\n        h = h || box.height;\n        let spectrumWidth, spectrumHeight;\n        if (w > 80) {\n            spectrumWidth = w - 80;\n            this.keyboard.width = 80;\n        } else {\n            spectrumWidth = 0.4 * w;\n            this.keyboard.width = 0.6 * w;\n        }\n        if (h > 40) {\n            spectrumHeight = h - 40;\n            this.timeBar.height = 40;\n        } else {\n            spectrumHeight = 0.4 * h;\n            this.timeBar.height = 0.6 * h;\n        }\n        this.keyboard.height = spectrumHeight;\n        this.timeBar.width = spectrumWidth;\n        for (const c in this.layers) {\n            const canvas = this.layers[c];\n            canvas.width = spectrumWidth;\n            canvas.height = spectrumHeight;\n            canvas.ctx.lineWidth = 1;\n            canvas.ctx.font = `${this._height}px Arial`;\n        }\n        document.getElementById('play-btn').style.width = this.keyboard.width + 'px';\n        // 改变画布长宽之后，设置的值会重置，需要重新设置\n        this.keyboard.ctx.lineWidth = 1; this.keyboard.ctx.font = `${this._height + 2}px Arial`;\n        this.timeBar.ctx.font = '14px Arial';\n        // 触发滑动条/频谱缓冲区更新 还能在初始化的时候保证timeBar的文字间隔\n        this.width = this._width;\n        this.scroll2();\n    };\n    /**\n     * 移动到 scroll to (x, y)\n     * 由目标位置得到合法的scrollX和scrollY，并更新XY方向的scroll离散值起点(序号)\n     * @param {number} x 新视野左边和世界左边的距离\n     * @param {number} y 新视野下边和世界下边的距离\n     */\n    this.scroll2 = (x = this.scrollX, y = this.scrollY) => {\n        this.scrollX = Math.max(0, Math.min(x, this._width * this._xnum - this.layers.width));\n        this.scrollY = Math.max(0, Math.min(y, this._height * this.ynum - this.layers.height));\n        this.idXstart = (this.scrollX / this._width) | 0;\n        this.idYstart = (this.scrollY / this._height) | 0;\n        this.idXend = Math.min(this._xnum, Math.ceil((this.scrollX + this.layers.width) / this._width));\n        this.idYend = Math.min(this.ynum, Math.ceil((this.scrollY + this.layers.height) / this._height));\n        this.rectXstart = this.idXstart * this._width - this.scrollX;\n        this.rectYstart = this.layers.height - this.idYstart * this._height + this.scrollY;   // 画图的y从左上角开始\n        // 滑动条\n        this.HscrollBar.refreshPosition();\n        // 更新音符 action.dirty 置位\n        this.MidiAction.updateView();\n        this.layers.spectrum.dirty = true;\n    };\n    /**\n     * 按倍数横向缩放时频图 以鼠标指针为中心\n     * @param {number} mouseX\n     * @param {number} times 倍数 比用加减像素好，更连续\n     */\n    this.scaleX = (mouseX, times) => {\n        let nw = this._width * times;\n        if (nw < 1) return;\n        if (nw > this.layers.spectrum.width) return;\n        this.width = nw;\n        this.scroll2((this.scrollX + mouseX) * times - mouseX, this.scrollY);\n    };\n    /**\n     * 状态更新与重绘\n     */\n    this.update = () => {\n        this.AudioPlayer.update();\n        this.MidiPlayer.update();\n        for (const c in this.layers) this.layers[c].render()\n    };\n    this.layers.spectrum.resetHandlers([this.Spectrogram.render]);\n    this.layers.action.resetHandlers([\n        c => {  // 绘制遮罩\n            let ctx = c.ctx;\n            ctx.globalCompositeOperation = 'copy';\n            ctx.fillStyle = c.mask;\n            ctx.fillRect(0, 0, c.width, c.height);\n            ctx.globalCompositeOperation = 'source-over';\n        },\n        this.Keyboard.render,// 应最先 因为高亮显示不重要应该在最下面\n        this.BeatBar.render,\n        this.MidiAction.render,// 应在BeatBar之后 节拍线在音符下面\n        this.TimeBar.render,// 应最后 时间指针应该在最上面\n    ]);\n\n    this.trackMouseY = (e) => { // onmousemove\n        this.mouseY = e.offsetY;\n    };\n    this.trackMouseX = (e) => { // 用于框选，会更新frameX值 在this.MidiAction中add和remove事件监听器\n        this.mouseX = e.offsetX;\n    };\n    this._trackMouseX = (e) => {// 给pitchName插件专用的 只会更新_mouseX\n        this._mouseX = e.offsetX;\n    };\n\n    /**\n     * 动画循环绘制\n     * @param {boolean} loop 是否开启循环\n     */\n    this.loopUpdate = (loop = true) => {\n        if (loop) {\n            const update = (t) => {\n                this.update();\n                this.loop = requestAnimationFrame(update);\n            };  // 必须用箭头函数包裹，以固定this的指向\n            this.loop = requestAnimationFrame(update);\n        } else {\n            cancelAnimationFrame(this.loop);\n        }\n    };\n    this.loop = 0;      // 接收requestAnimationFrame的返回\n\n    //=========数据解析相关=========//\n    this.Analyser = new _Analyser(this);\n    //========= 导入导出 =========//\n    this.io = new _IO(this);\n    //========= 事件注册 =========//\n    document.getElementById('speedControl').addEventListener('input', (e) => { // 变速\n        this.AudioPlayer.audio.playbackRate = parseFloat(e.target.value);\n    });\n    document.getElementById('multiControl').addEventListener('input', (e) => { // 变画频谱的倍率\n        this.Spectrogram.multiple = parseFloat(e.target.value);\n    });\n    document.getElementById('contrastControl').addEventListener('input', (e) => { // 变频谱对比度\n        this.Spectrogram.contrast = parseFloat(e.target.value);\n    });\n    document.getElementById('midivolumeControl').addEventListener('input', (e) => { // midi音量\n        this.synthesizer.out.gain.value = parseFloat(e.target.value) ** 2;\n    });\n    document.getElementById('audiovolumeControl').addEventListener('input', (e) => {// 音频音量\n        this.AudioPlayer.audio.volume = parseFloat(e.target.value);\n    });\n    document.addEventListener('keydown', (e) => { // 键盘事件\n        // 以下在没有频谱数据时不启用\n        if (this.preventShortCut) return;\n        if (!this.Spectrogram._spectrogram) return;\n        let shortcut = '';\n        // 检测平台并使用相应的修饰键\n        const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n        const cmdKey = isMac ? e.metaKey : e.ctrlKey;\n        const ctrlKey = isMac ? e.ctrlKey : false;\n\n        if (cmdKey) shortcut += 'Ctrl+';  // 统一使用Ctrl+标识符，但实际检测平台对应的键\n        if (ctrlKey && isMac) shortcut += 'RealCtrl+';  // Mac上的真正Ctrl键\n        if (e.shiftKey) shortcut += 'Shift+';\n        if (e.altKey) shortcut += 'Alt+';\n        if (shortcut != '') {   // 组合键\n            shortcut += e.key.toUpperCase();    // 大小写一视同仁\n            if (this.shortcutActions.hasOwnProperty(shortcut)) {\n                e.preventDefault(); // 阻止默认的快捷键行为\n                this.shortcutActions[shortcut]();\n            }\n        } else {                // 单个按键\n            switch (e.key) {\n                case 'ArrowUp': this.scroll2(this.scrollX, this.scrollY + this._height); break;\n                case 'ArrowDown': this.scroll2(this.scrollX, this.scrollY - this._height); break;\n                case 'ArrowLeft': this.scroll2(this.scrollX - this._width, this.scrollY); break;\n                case 'ArrowRight': this.scroll2(this.scrollX + this._width, this.scrollY); break;\n                case 'Delete': this.MidiAction.deleteNote(); break;\n                case ' ': this.AudioPlayer.play_btn.click(); break;\n                case 'PageUp': this.scroll2(this.scrollX - this.layers.spectrum.width, this.scrollY); break;\n                case 'PageDown': this.scroll2(this.scrollX + this.layers.spectrum.width, this.scrollY); break;\n                case 'Home': this.scroll2(0); this.setTime(0); break;\n            }\n        }\n    });\n    // audio可以后台播放，但是requestAnimationFrame不行，而时间同步在requestAnimationFrame中\n    // 还有一个办法：在可见状态变化时，将update绑定到audio.ontimeupdate上，但是这个事件触发频率很低，而预测器根据60帧设计的\n    document.addEventListener('visibilitychange', () => {\n        if (document.hidden) this.AudioPlayer.stop();\n    });\n    window.addEventListener('load', () => { this.resize(); });\n    window.addEventListener('resize', () => { this.resize(); });\n    this.layerContainer.addEventListener('wheel', (e) => {\n        // e.deltaY 往前滚是负数\n        const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n        const cmdKey = isMac ? e.metaKey : e.ctrlKey;\n\n        if (cmdKey) {    // 缩放\n            e.preventDefault();\n            this.scaleX(e.offsetX, e.deltaY > 0 ? 0.8 : 1.25);\n        } else if (e.shiftKey) { // 垂直滚动\n            // 只有鼠标滚轮时是有deltaY。所以这里让X方向能移动，做法是交换X和Y\n            this.scroll2(this.scrollX + e.deltaY, this.scrollY + e.deltaX);\n        } else {    // 触摸板的滑动也是wheel\n            this.scroll2(this.scrollX + e.deltaX, this.scrollY - e.deltaY);\n        }   // 只改状态，但不绘图。绘图交给固定时间刷新完成\n        this.trackMouseY(e);\n    });\n    this.layerContainer.contextMenu = new ContextMenu([\n        {\n            name: \"撤销\", callback: () => {\n                this.shortcutActions['Ctrl+Z']();\n            }, onshow: () => this.Spectrogram._spectrogram && this.snapshot.lastState()\n        }, {\n            name: \"重做\", callback: () => {\n                this.shortcutActions['Ctrl+Y']();\n            }, onshow: () => this.Spectrogram._spectrogram && this.snapshot.nextState()\n        }, {\n            name: \"粘贴\", callback: () => {\n                this.shortcutActions['Ctrl+V']();\n            }, onshow: () => this.Spectrogram._spectrogram && this._copy != ''\n        }, {\n            name: \"复制\", callback: () => {\n                this.shortcutActions['Ctrl+C']();\n            }, onshow: () => this.Spectrogram._spectrogram && this.MidiAction.selected.length > 0\n        }, {\n            name: \"反选\", callback: () => {\n                let ch = this.MidiAction.channelDiv.selected;\n                let id = ch && ch.index;\n                ch = !ch;\n                for (const nt of this.MidiAction.midi)\n                    nt.selected = (ch || nt.ch == id) && !nt.selected;\n                this.MidiAction.selected = this.MidiAction.midi.filter(nt => nt.selected);\n            }, onshow: () => this.Spectrogram._spectrogram\n        }, {\n            name: '<span style=\"color: red;\">删除</span>', callback: () => {\n                this.MidiAction.deleteNote();\n            }, onshow: () => this.Spectrogram._spectrogram && this.MidiAction.selected.length > 0\n        }\n    ]);\n    this.layerContainer.addEventListener('mousedown', (e) => {\n        if (e.button == 1) {    // 中键按下 动作同触摸板滑动 视窗移动\n            const moveWindow = (e) => {\n                this.scroll2(this.scrollX - e.movementX, this.scrollY + e.movementY);\n            }; this.layerContainer.addEventListener('mousemove', moveWindow);\n            const up = () => {\n                this.layerContainer.removeEventListener('mousemove', moveWindow);\n                document.removeEventListener('mouseup', up);\n            }; document.addEventListener('mouseup', up);\n            return;\n        }\n        // 以下在没有频谱数据时不启用\n        if (this.Spectrogram._spectrogram) {\n            if (e.button == 0) this.MidiAction.onclick_L(e);    // midi音符相关\n            else if (e.button == 2 && e.shiftKey) {\n                this.layerContainer.contextMenu.show(e);\n                e.stopPropagation();\n            } else this.MidiAction.clearSelected();    // 取消音符选中\n        } this.Keyboard.mousedown();    // 将发声放到后面，因为onclick_L会改变选中的音轨\n    });\n    this.layerContainer.addEventListener('mousemove', this.trackMouseY);\n    this.layerContainer.addEventListener('contextmenu', (e) => { e.preventDefault(); e.stopPropagation(); });\n    this.timeBar.addEventListener('dblclick', (e) => {\n        if (this.AudioPlayer.audio.readyState != 4) return;\n        this.setTime((e.offsetX + this.scrollX) * this.AudioPlayer.audio.duration * 1000 / (this._xnum * this._width), false);\n    });\n    this.timeBar.addEventListener('contextmenu', (e) => {\n        e.preventDefault(); // 右键菜单\n        if (e.offsetY < this.timeBar.height >> 1) this.TimeBar.contextMenu.show(e);\n        else this.BeatBar.contextMenu.show(e);\n        e.stopPropagation();\n    });\n    this.timeBar.addEventListener('mousemove', this.BeatBar.moveCatch);\n    this.timeBar.addEventListener('mousedown', (e) => {\n        switch (e.button) {\n            case 0:\n                if (this.BeatBar.belongID > -1) {   // 在小节轴上\n                    let _anyAction = false; // 是否存档\n                    this.timeBar.removeEventListener('mousemove', this.BeatBar.moveCatch);\n                    const m = this.BeatBar.beats.setMeasure(this.BeatBar.belongID, undefined, false);\n                    const startAt = m.start * this.PperT;\n                    let setMeasure;\n                    if (e.shiftKey) {   // 只改变小节线位置\n                        const nextM = this.BeatBar.beats.setMeasure(m.id + 1, undefined, false);\n                        this.BeatBar.beats.setMeasure(m.id + 2, undefined, false);  // 下下个也要创建\n                        setMeasure = (e2) => {\n                            _anyAction = true;\n                            m.interval = Math.max(100, (e2.offsetX + this.scrollX - startAt) * this.TperP);\n                            nextM.interval -= m.start + m.interval - nextM.start;\n                            this.BeatBar.beats.check(false);\n                        };\n                    } else {    // 改变小节线位置并移动后续小节\n                        setMeasure = (e2) => {\n                            _anyAction = true;\n                            m.interval = Math.max(100, (e2.offsetX + this.scrollX - startAt) * this.TperP);\n                            this.BeatBar.beats.check(false);    // 关闭小节合并 否则会丢失小节对象\n                        };\n                    }\n                    let removeEvents = () => {\n                        document.removeEventListener('mousemove', setMeasure);\n                        this.timeBar.addEventListener('mousemove', this.BeatBar.moveCatch);\n                        document.removeEventListener('mouseup', removeEvents);\n                        this.BeatBar.beats.check(true);\n                        if (_anyAction) this.snapshot.save(0b100);\n                    };\n                    document.addEventListener('mousemove', setMeasure);\n                    document.addEventListener('mouseup', removeEvents);\n                } else {\n                    const x = (e.offsetX + this.scrollX) / this._width * this.dt;    // 毫秒数\n                    const originStart = this.TimeBar.repeatStart;\n                    const originEnd = this.TimeBar.repeatEnd;\n                    const mouseDownX = e.offsetX;\n                    let mouseUpX = mouseDownX;\n                    const setRepeat = (e) => {\n                        mouseUpX = e.offsetX;\n                        const newX = (e.offsetX + this.scrollX) / this._width * this.dt;\n                        if (newX > x) this.TimeBar.setRepeat(x, newX);\n                        else this.TimeBar.setRepeat(newX, x);\n                    };\n                    let removeEvents = () => {\n                        this.timeBar.removeEventListener('mousemove', setRepeat);\n                        document.removeEventListener('mouseup', removeEvents);\n                        // 有时候双击的小小移动会误触重复区间 所以如果区间太小则忽视\n                        if (Math.abs(mouseUpX - mouseDownX) < 6) this.TimeBar.setRepeat(originStart, originEnd);\n                    };\n                    this.timeBar.addEventListener('mousemove', setRepeat);\n                    document.addEventListener('mouseup', removeEvents);\n                }\n                break;\n            case 1:     // 中键跳转位置但不改变播放状态\n                this.setTime((e.offsetX + this.scrollX) / this._width * this.dt);\n                break;\n        }\n    });\n    this.keyboard.addEventListener('wheel', (e) => {\n        this.scroll2(this.scrollX, this.scrollY - e.deltaY);    // 只能上下移动\n    });\n    this.keyboard.addEventListener('mousemove', this.trackMouseY);\n    this.keyboard.addEventListener('contextmenu', (e) => { e.preventDefault(); e.stopPropagation(); });\n    this.keyboard.addEventListener('mousedown', (e) => {\n        if (e.button == 1) {    // 中键按下 动作同触摸板滑动 视窗移动\n            const moveWindow = (e) => {\n                this.scroll2(this.scrollX, this.scrollY + e.movementY);\n            }; this.keyboard.addEventListener('mousemove', moveWindow);\n            const up = () => {\n                this.keyboard.removeEventListener('mousemove', moveWindow);\n                document.removeEventListener('mouseup', up);\n            }; document.addEventListener('mouseup', up);\n            return;\n        } this.Keyboard.mousedown();\n    });\n\n    // 用户鼠标操作触发刷新\n    document.addEventListener('mousemove', this.makeActDirty);\n    document.addEventListener('mousedown', this.makeActDirty);\n    document.addEventListener('mouseup', this.makeActDirty);\n    document.addEventListener('keydown', this.makeActDirty);\n    // wheel->scroll2 已触发刷新\n\n    this.loopUpdate(true);\n}\n\nclass LayeredCanvas extends HTMLCanvasElement {\n    static new2d(canvas, alpha = true, desynchronized = true) {\n        if (typeof canvas === 'string') canvas = document.getElementById(canvas);\n        return LayeredCanvas.new(canvas, '2d', {alpha, desynchronized, willReadFrequently: false});\n    }\n    static new(canvas, contextType = '2d', contextAttributes) {\n        Object.setPrototypeOf(canvas, LayeredCanvas.prototype);\n        canvas.init(contextType, contextAttributes);\n        return canvas;\n    }\n    init(contextType, contextAttributes) {\n        this.ctx = this.getContext(contextType, contextAttributes);\n        this.handlers = []; // [{handler, priority}]\n        this.dirty = true;\n    }\n    resetHandlers(handlers) {\n        this.handlers = handlers\n            .filter(handler => typeof handler === 'function')\n            .map((handler, i) => ({handler, priority: i}));\n    }\n    /**\n     * 注册渲染函数\n     * @param {function(LayeredCanvas): void} handler \n     * @param {number} priority 优先级越小越先执行\n     */\n    register(handler, priority = null) {\n        if (priority === null) {\n            if (this.handlers.length)\n                priority = this.handlers[this.handlers.length - 1].priority + 1;\n            else priority = 0;\n        }\n        this.handlers.push({handler, priority});\n        this.handlers.sort((a, b) => a.priority - b.priority);\n    }\n    unregister(handler) {\n        this.handlers = this.handlers.filter(h => h.handler !== handler);\n    }\n    render() {\n        if (!this.dirty) return;\n        for (const {handler} of this.handlers) handler(this);\n        this.dirty = false;\n    }\n}\n\n/*\ndom needed:\n#Canvases-Container div 决定画布尺寸\n    #piano canvas 画琴键\n    #timeBar canvas 画时间轴\n    #main-layers div 主工作区图层容器\n        #spectrum canvas 画频谱\n        #actions canvas 画其余\n#funcSider div 音轨选择的容器\n#speedControl input[type=range] 变速\n#multiControl input[type=range] 改变画频谱的倍率\n#contrastControl input[type=range] 改变画频谱的对比度\n#midivolumeControl input[type=range] midi音量\n#play-btn button 播放\n#actMode div 动作模式选择，其下有两个btn\n#scrollbar-track div 滑动条轨道\n    #scrollbar-thumb div 滑动条\n*/"
  },
  {
    "path": "core/app_analyser.js",
    "content": "/// <reference path=\"../dataProcess/fft_real.js\" />\n/// <reference path=\"../dataProcess/stftGPU.js\" />\n/// <reference path=\"../dataProcess/analyser.js\" />\n/// <reference path=\"../dataProcess/CQT/cqt.js\" />\n/// <reference path=\"../dataProcess/AI/AIEntrance.js\" />\n/// <reference path=\"../dataProcess/ANA.js\" />\n/// <reference path=\"../dataProcess/bpmEst.js\" />\n/// <reference path=\"../dataProcess/NNLS.js\" />\n\n/**\n * 数据解析相关算法\n * @param {App} parent \n */\nfunction _Analyser(parent) {\n    /**\n     * @param {AudioBuffer} audioBuffer 音频缓冲区\n     * @param {number} channel 选择哪个channel分析 0:left 1:right 2:l+r 3:l-r else:fft(l)+fft(r)\n     * @returns {Array<Float32Array>} 选择的channel数据 .sampleRate为采样率\n     */\n    this.selectChannel = (audioBuffer, channel) => {\n        const channels = [];\n        channels.sampleRate = audioBuffer.sampleRate;\n        switch (channel) {\n            case 0: channels.push(audioBuffer.getChannelData(0)); break;\n            case 1: channels.push(audioBuffer.getChannelData(audioBuffer.numberOfChannels - 1)); break;\n            case 2: { // L+R\n                let length = audioBuffer.length;\n                let timeDomain = audioBuffer.getChannelData(0);\n                if (audioBuffer.numberOfChannels > 1) {\n                    timeDomain = new Float32Array(timeDomain);\n                    let channelData = audioBuffer.getChannelData(1);\n                    for (let i = 0; i < length; i++) timeDomain[i] += channelData[i];\n                } channels.push(timeDomain); break;\n            }\n            case 3: { // L-R\n                let length = audioBuffer.length;\n                let timeDomain = audioBuffer.getChannelData(0);\n                if (audioBuffer.numberOfChannels > 1) {\n                    timeDomain = new Float32Array(timeDomain);\n                    let channelData = audioBuffer.getChannelData(1);\n                    for (let i = 0; i < length; i++) timeDomain[i] -= channelData[i];\n                } channels.push(timeDomain); break;\n            }\n            default: { // fft(L)+fft(R)\n                for (let c = 0; c < audioBuffer.numberOfChannels; c++)\n                    channels.push(audioBuffer.getChannelData(c));\n                break;\n            }\n        } return channels;\n    };\n    /**\n     * 对channels执行STFT\n     * @param {Array<Float32Array>} channels 通道数据数组，每个元素为一个channel的数据 .sampleRate为采样率\n     * @param {number} tNum 一秒几次分析 决定步距\n     * @param {number} A4 频率表的A4频率\n     * @param {number} fftPoints 实数fft点数\n     * @param {boolean} useGPU 是否使用GPU加速\n     * @returns {Promise<Array<Float32Array>>} 时频谱数据\n     */\n    this.stft = async (channels, tNum = 20, A4 = 440, fftPoints = 8192, useGPU = true) => {// 8192点在44100采样率下，最低能分辨F#2，但是足矣\n        parent.dt = 1000 / tNum;\n        parent.TperP = parent.dt / parent._width; parent.PperT = parent._width / parent.dt;\n        const fs = channels.sampleRate ??= parent.audioContext.sampleRate;\n        const dN = Math.round(fs / tNum);\n        parent.Keyboard.freqTable.A4 = A4;\n        let STFT;\n        try {\n            if (!useGPU) throw new Error(\"强制使用CPU计算STFT\");\n            STFT = await stftGPU(fs, channels, dN, fftPoints);\n        } catch (e) {\n            console.warn(\"GPU加速STFT失败,回退至CPU计算\\n原因:\", e.message);\n            STFT = await stftCPU(fs, channels, dN, fftPoints);\n        } return NoteAnalyser.normalize(STFT);\n    }\n\n    async function stftCPU(fs, channels, hop, fftPoints) {\n        const progressPerChannel = 1 / channels.length;\n        var progressTrans = (x) => x * progressPerChannel;   // 如果分阶段执行则需要自定义进度的变换\n        const fft = new realFFT(fftPoints);\n        const analyser = new NoteAnalyser(fs / fftPoints, parent.Keyboard.freqTable);\n        const nbins = parent.Keyboard.freqTable.length;\n        const a = async (t) => { // 对t执行STFT，并整理为时频谱\n            let n = hop >> 1;\n            const result = new Array(1 + (t.length - n) / hop | 0);\n            const _data = new Float32Array(result.length * nbins);\n            const window_left = fftPoints >> 1; // 窗口左边界偏移量\n            for (let k = 0, sub = 0; n <= t.length; n += hop, sub += nbins) {    // n为窗口中心\n                result[k++] = analyser.mel(...fft.fft(t, n - window_left), _data.subarray(sub, sub + nbins));\n                // 一帧一次也太慢了。这里固定更新帧率\n                let tnow = performance.now();\n                if (tnow - lastFrame > 200) {\n                    lastFrame = tnow;\n                    // 打断分析 更新UI 等待下一周期\n                    parent.event.dispatchEvent(new CustomEvent(\"progress\", {\n                        detail: progressTrans(k / result.length)\n                    }));\n                    await new Promise(resolve => setTimeout(resolve, 0));\n                }\n            }   // 通知UI关闭的事件分发移到了audio.onloadeddata中\n            result.raw = _data;\n            return result;\n        };\n        await new Promise(resolve => setTimeout(resolve, 0));   // 等待UI\n        var lastFrame = performance.now();\n        const result = await a(channels[0]);\n        for (let i = 1; i < channels.length; i++) {\n            progressTrans = (x) => (i + x) * progressPerChannel;\n            const other = (await a(channels[i])).raw;\n            const raw = result.raw;\n            for (let j = 0; j < raw.length; j++) raw[j] += other[j];\n        } return result;\n    };\n\n    async function stftGPU(fs, channels, hop, fftPoints) {\n        const stftGPU = new STFTGPU(fftPoints, hop);\n        parent.event.dispatchEvent(new CustomEvent(\"progress\", {\n            detail: 0.4\n        }));\n        await stftGPU.initWebGPU();\n        console.log(\"WebGPU初始化成功,使用GPU计算STFT\");\n        const analyser = new NoteAnalyser(fs / fftPoints, parent.Keyboard.freqTable);\n        for (const c of channels) stftGPU.stft(c);\n        const stftRes = await stftGPU.readGPU();\n        stftGPU.free();\n        const result = new Array(stftRes.length);\n        const nbins = parent.Keyboard.freqTable.length;\n        const _data = new Float32Array(result.length * nbins);\n        for (let i = 0; i < stftRes.length; i++)\n            result[i] = analyser.mel2(stftRes[i], _data.subarray(i * nbins, (i + 1) * nbins));\n        result.raw = _data;\n        return result;\n    }\n\n    /**\n     * 后台（worker）计算CQT\n     * @param {Array<Float32Array>} channels 通道数据数组，每个元素为一个channel的数据 .sampleRate为采样率\n     * @param {number} tNum 一秒几次分析 决定步距\n     * @param {boolean} useGPU 是否使用GPU加速计算CQT\n     * @returns 不返回，直接作用于Spectrogram.spectrogram\n     */\n    this.cqt = (channels, tNum, useGPU = false) => {\n        if (!parent.io.canUseExternalWorker || window.cqt == undefined) return; // 开worker和fetch要求http\n        console.time(\"CQT计算\");\n        cqt(channels, tNum, parent.Keyboard.freqTable[0], useGPU).then((cqtData) => {\n            // CQT结果准确但琐碎，STFT结果粗糙但平滑，所以混合一下\n            const s = parent.Spectrogram.spectrogram;\n            let tLen = Math.min(cqtData.length, s.length);\n            for (let i = 0; i < tLen; i++) {\n                const cqtBins = cqtData[i];\n                const stftBins = s[i];\n                for (let j = 0; j < cqtBins.length; j++) {\n                    // 更重视CQT谱 若CQT谱更强则用更大的平均\n                    if (stftBins[j] < cqtBins[j]) stftBins[j] = Math.hypot(stftBins[j], cqtBins[j]) / Math.SQRT2;\n                    else stftBins[j] = Math.sqrt(stftBins[j] * cqtBins[j]);\n                }\n            }\n            console.timeEnd(\"CQT计算\");\n            parent.Spectrogram.spectrogram = s;  // 通知更新\n        }).catch(console.error);\n    };\n\n    /**\n     * 后台（worker）AI音色无关扒谱\n     * @param {AudioBuffer} audioBuffer 音频缓冲区\n     * @param {boolean} judgeOnly 是否只判断是否可以扒谱\n     * @returns promise，用于指示扒谱完成。如果judgeOnly为true则返回值代表是否可以AI扒谱\n     */\n    this.basicamt = (audioData, judgeOnly = false) => {\n        if (!parent.io.canUseExternalWorker || window.AI == undefined) {\n            alert(\"file协议下无法使用AI扒谱！\");\n            return false;\n        }\n        if (!parent.Spectrogram._spectrogram) {\n            alert('请导入音频或进入midi编辑模式！');\n            return false;\n        }\n        if (!parent.MidiAction.channelDiv.colorMask) {\n            alert(\"音轨不足！请至少删除一个音轨！\");\n            return false;\n        }\n        if (judgeOnly) return true;\n        console.time(\"AI扒谱\");\n        return AI.basicamt(audioData).then((events) => {\n            console.timeEnd(\"AI扒谱\");\n            const timescale = (256 * 1000) / (22050 * parent.dt); // basicAMT在22050Hz下以hop=256分析\n            // 逻辑同index.html中导入midi\n            const chdiv = parent.MidiAction.channelDiv;\n            chdiv.switchUpdateMode(false);\n            const ch = chdiv.addChannel();\n            if (!ch) return;\n            const chid = ch.index;\n            ch.name = `AI扒谱${chid}`;\n            ch.instrument = TinySynth.instrument[(ch.ch.instrument = 4)];\n            const maxIntensity = events.reduce((a, b) => a.velocity > b.velocity ? a : b).velocity;\n            ch.ch.volume = maxIntensity * 127;\n            const notes = events.map(({ onset, offset, note, velocity }) => {\n                return {\n                    x1: onset * timescale,\n                    x2: offset * timescale,\n                    y: note - 24,\n                    ch: chid,\n                    selected: false,\n                    v: velocity / maxIntensity * 127\n                };\n            });\n            parent.MidiAction.midi.push(...notes);\n            parent.MidiAction.midi.sort((a, b) => a.x1 - b.x1);\n            chdiv.switchUpdateMode(true);\n        }).catch(alert);\n    };\n\n    /**\n     * 后台（worker）AI音色分离扒谱\n     * @param {AudioBuffer} audioBuffer 音频缓冲区\n     * @returns promise，用于指示扒谱完成\n     */\n    this.septimbre = (audioData, k = 2) => {\n        console.time(\"AI音色分离扒谱\");\n        return AI.septimbre(audioData, k).then((tracks) => {\n            console.timeEnd(\"AI音色分离扒谱\");\n            const timescale = (256 * 1000) / (22050 * parent.dt);\n            // 逻辑同index.html中导入midi\n            const chdiv = parent.MidiAction.channelDiv;\n            chdiv.switchUpdateMode(false);\n            tracks.forEach((events) => {\n                const ch = chdiv.addChannel();\n                if (!ch) return;\n                const chid = ch.index;\n                ch.name = `AI分离${chid}`;\n                ch.instrument = TinySynth.instrument[(ch.ch.instrument = 4)];\n                const maxIntensity = events.reduce((a, b) => a.velocity > b.velocity ? a : b).velocity;\n                ch.ch.volume = maxIntensity * 127;\n                const notes = events.map(({ onset, offset, note, velocity }) => {\n                    return {\n                        x1: onset * timescale,\n                        x2: offset * timescale,\n                        y: note - 24,\n                        ch: chid,\n                        selected: false,\n                        v: velocity / maxIntensity * 127\n                    };\n                });\n                parent.MidiAction.midi.push(...notes);\n            });\n            parent.MidiAction.midi.sort((a, b) => a.x1 - b.x1);\n            chdiv.switchUpdateMode(true);\n        }).catch(alert);\n    };\n\n    /**\n     * “自动对齐音符”的入口 原理见 ~/dataProcess/aboutANA.md\n     */\n    this.autoNoteAlign = () => {\n        if (!parent.Spectrogram._spectrogram || parent.midiMode) {\n            alert('请先导入音频！');\n            return false;\n        }\n        if (!parent.MidiAction.channelDiv.colorMask) {\n            alert(\"音轨不足！请至少删除一个音轨！\");\n            return false;\n        }\n        let tempDiv = document.createElement('div');\n        tempDiv.innerHTML = `\n<div class=\"request-cover\">\n    <div class=\"card hvCenter\">\n        <div class=\"fr\" style=\"align-items: center;\">\n            <label class=\"title\">数字谱对齐音频</label>\n            <span style=\"flex:1\"></span>\n            <button class=\"ui-cancel\">❌</button>\n        </div>\n        <div class=\"layout layout-first\">\n            <button class=\"ui-cancel\">降低八度</button>\n            <span style=\"width: 1em;\"></span>\n            <button class=\"ui-cancel\">升高八度</button>\n        </div>\n        <div class=\"layout\">\n            <textarea cols=\"35\" rows=\"12\" placeholder=\"\\\n输入没有时值的数字谱，算法将创建与音频同步的音符，相当于“数字谱+音频→midi”\n数字谱的“1”对应于C5，请自行整体添加“[]”或“()”以升/降八度\n建议先观察频谱，找到合适的八度。如果效果不好，也可以考虑升降后重试。\n数字谱示例: ((b1)7)1 #2[#34b5]\"></textarea>\n        </div>\n        <div class=\"layout\">\n            <button class=\"ui-confirm\">重复区间内</button>\n            <span style=\"width: 1em;\"></span>\n            <button class=\"ui-confirm\">所有时间</button>\n        </div>\n    </div>\n</div>`;\n        const UI = tempDiv.firstElementChild;\n        const textarea = UI.querySelector('textarea');\n        const close = () => {\n            UI.remove();\n            parent.preventShortCut = false;\n        }\n        const btns = UI.getElementsByTagName('button');\n        btns[0].onclick = close;\n        btns[1].onclick = () => {\n            textarea.value = '(' + textarea.value + ')';\n        };\n        btns[2].onclick = () => {\n            textarea.value = '[' + textarea.value + ']';\n        };\n        btns[3].onclick = () => {   // 重复区间内\n            const numberedScore = textarea.value.trim();\n            if (!numberedScore) {\n                alert(\"请输入数字谱！\");\n                return;\n            }\n            try {\n                this._autoNoteAlign(\n                    numberedScore,\n                    parent.TimeBar.repeatStart / parent.dt,\n                    parent.TimeBar.repeatEnd / parent.dt\n                ); close();\n            } catch (error) {\n                alert(error.message);\n            }\n        };\n        btns[4].onclick = () => {   // 所有时间\n            const numberedScore = textarea.value.trim();\n            if (!numberedScore) {\n                alert(\"请输入数字谱！\");\n                return;\n            }\n            try {\n                this._autoNoteAlign(numberedScore);\n                close();\n            } catch (error) {\n                alert(error.message);\n            }\n        }\n        parent.preventShortCut = true; // 禁止快捷键\n        document.body.insertBefore(UI, document.body.firstChild);\n    };\n    this._autoNoteAlign = (noteSeq, begin, end) => {\n        noteSeq = parseJE(noteSeq);\n        let spectrum = parent.Spectrogram.spectrogram;\n        if (begin != undefined) {\n            begin = Math.max(0, Math.floor(begin));\n            end = Math.min(spectrum.length, Math.ceil(end));\n            spectrum = spectrum.slice(begin, end);\n        } else begin = 0;\n        if (noteSeq.length > spectrum.length) {\n            throw new Error(\"数字谱长度超过频谱长度！（时长太短）\");\n        }\n        // 插入间隔（用-1表示）\n        const paddedNoteSeq = [-1];\n        for (let i = 0; i < noteSeq.length; i++) {\n            // 0对应C4\n            paddedNoteSeq.push(noteSeq[i] + 48, -1);\n        }\n        const path = autoNoteAlign(paddedNoteSeq, spectrum, 100 / parent.dt);\n        const chdiv = parent.MidiAction.channelDiv;\n        chdiv.switchUpdateMode(false);\n        const ch = chdiv.addChannel();\n        if (!ch) return;\n        const chid = ch.index;\n        ch.name = `自动对齐${chid}`;\n        for (let i = 0; i < path.length; ++i) {\n            const [noteIdx, frameIdx] = path[i];\n            const n = paddedNoteSeq[noteIdx];\n            if (n == -1) continue;\n            while (i < path.length && path[i][0] == noteIdx) ++i;\n            --i;\n            const frameEnd = path[i][1] + 1;\n            parent.MidiAction.midi.push({\n                y: n,\n                x1: frameIdx + begin,\n                x2: frameEnd + begin,\n                ch: chid,\n                selected: false,\n            });\n        }\n        parent.MidiAction.midi.sort((a, b) => a.x1 - b.x1);\n        chdiv.switchUpdateMode(true);\n    };\n\n    /**\n     * 自动节拍检测并生成节拍线\n     * @param {number} minBPM 最小BPM\n     * @param {boolean} autoDownBeat 是否自动检测重拍位置\n     * @returns {number} 全局估计的BPM值\n     */\n    this.beatEst = (minBPM = 40, autoDownBeat = false) => {\n        const sr = Math.round(1000 / parent.dt);\n        const onset = Beat.extractOnset(parent.Spectrogram.spectrogram, Math.min(0.99, 16 / sr));\n\n        const maxInterval = Math.ceil(sr * 60 / minBPM);\n        // 范围要大，所以方差大一些\n        const global = Beat.corrBPM(SIGNAL.autoCorr(onset, maxInterval), sr, 1.4, 105);\n        const tempo = Beat.tempo(onset, sr, minBPM, 12.8, 1.6, global);\n\n        const fftSize = Beat.fs2FFTN(sr, 12.8);\n        const pulse = Beat.PLP(onset, sr, [40, 200], fftSize, Math.max(1, fftSize >> 3), Beat.PLPprior(tempo, 0.1));\n        for (let i = 0; i < pulse.length; i++) pulse[i] += onset[i];\n        const beatIdx = Beat.EllisBeatTrack(pulse, sr, 300, tempo);\n        if (beatIdx.length < 2) {\n            alert(\"未能检测到有效节拍！\");\n            return;\n        }\n        if (beatIdx[0] == 0) beatIdx.shift();\n\n        // 不能引入pulse的干扰 得用原始的onset\n        const beatStrength = Beat.beatStrength(onset, beatIdx);\n        const beatbar = parent.BeatBar.beats;\n        if (autoDownBeat) { // 用动态规划求解重拍位置 但不够稳定\n            const [downbeatIndices, downbeatMeters] = Beat.detectDownbeats(beatStrength, [2, 3, 4]);\n            // 处理前面的拍\n            beatbar.length = 0;\n            let prev = 0, id = 0, i = 0;\n            for (; i <= downbeatIndices[0]; i++, id++) {\n                const at = beatIdx[i] * parent.dt;\n                beatbar.push(new eMeasure(id, prev, 1, 4, at - prev));\n                prev = at;\n            }\n            for (i = 0; i < downbeatIndices.length; i++, id++) {\n                const pattern = downbeatMeters[i];\n                const beatdown = downbeatIndices[i];\n                if (i + 1 < downbeatIndices.length) {\n                    const nextBeatdown = downbeatIndices[i + 1];\n                    const endtime = beatIdx[nextBeatdown] * parent.dt;\n                    beatbar.push(new eMeasure(id, prev, pattern, 4, endtime - prev));\n                    prev = endtime;\n                } else {\n                    let endtime;\n                    const time = beatIdx[beatIdx.length - 1] * parent.dt - prev;\n                    const cnt = beatIdx.length - 1 - beatdown;\n                    beatbar.push(new eMeasure(id, prev, pattern, 4, time / cnt * pattern));\n                }\n            }\n        } else {   // 这两个估计结果有点差 暂时用1拍\n            // const [g_pattern, g_beatdown] = Beat.rhythmicPattern(beatStrength, [2, 3, 4]);\n            let g_pattern = 1, g_beatdown = 0;\n            beatbar.length = 0;\n            let prev = 0, id = 0, i = 0;\n            // 前面的用单小节处理 注意应该有等号\n            for (; i <= g_beatdown; i++, id++) {\n                const at = beatIdx[i] * parent.dt;\n                beatbar.push(new eMeasure(id, prev, 1, 4, at - prev));\n                prev = at;\n            }\n            for (i = i - 1 + g_pattern; i < beatIdx.length; i += g_pattern, id++) {\n                const at = beatIdx[i] * parent.dt;\n                beatbar.push(new eMeasure(id, prev, g_pattern, 4, at - prev));\n                prev = at;\n            }\n        }\n        beatbar.check(true);\n        parent.snapshot.save(0b100);\n        parent.layers.action.dirty = true;\n        // 如果正在用节拍则刷新节拍信息\n        if (parent.AudioPlayer.audio.paused === false && parent.MidiPlayer._ifBeat) {\n            parent.MidiPlayer.restart(true);\n        }\n        return global;\n    };\n\n    // 1(C4)->0\n    function parseJE(txt) {\n        const parts = [];\n        let n = 0;\n        let octave = 0;\n        const JEnotes = [\"1\", \"#1\", \"2\", \"#2\", \"3\", \"4\", \"#4\", \"5\", \"#5\", \"6\", \"#6\", \"7\"];\n        while (n < txt.length) {\n            if (txt[n] == ')' || txt[n] == '[') ++octave;\n            else if (txt[n] == '(' || txt[n] == ']') --octave;\n            else {\n                let m = 0;\n                if (txt[n] == '#') m = 1;\n                else if (txt[n] == 'b') m = -1;\n                const noteEnd = n + Math.abs(m);\n                const position = noteEnd < txt.length ? JEnotes.indexOf(txt[noteEnd]) : -1;\n                if (position != -1) {\n                    parts.push(m + position + octave * 12);\n                    n = noteEnd;\n                }\n            }\n            ++n;\n        } return parts;\n    };\n\n    this.reduceHarmonic = () => {\n        let resolve, reject;\n        let p = new Promise((res, rej) => {\n            resolve = res;\n            reject = rej;\n        });\n        let tempDiv = document.createElement('div');\n        tempDiv.innerHTML = `<div class=\"request-cover\">\n<div class=\"card hvCenter\">\n    <label class=\"title\">谐波去除 <span style=\"font-size: 0.6em; color: grey;\">非负最小二乘法</span></label>\n    <div class=\"layout\">\n        <span class=\"labeled\" data-tooltip=\"对谐波强度的估计\">谐波衰减率</span>\n        <input type=\"number\" value=\"0.6\" step=\"0.01\" min=\"0.1\" max=\"0.9\">\n    </div>\n    <div class=\"layout\">\n        <span class=\"labeled\" data-tooltip=\"考虑的谐波数量\">谐波数量</span>\n        <input type=\"number\" value=\"10\" step=\"1\" min=\"4\" max=\"16\">\n    </div>\n    <div class=\"layout\">\n        <label class=\"labeled\" data-tooltip=\"修改频谱 不可逆\">\n            原位操作<input type=\"checkbox\">\n        </label>\n    </div>\n    <div class=\"layout\">\n        <button class=\"ui-cancel\">取消</button>\n        <span style=\"width: 1em;\"></span>\n        <button class=\"ui-confirm\">确认</button>\n    </div>\n</div></div>`;\n        const UI = tempDiv.firstElementChild;\n        const inputs = UI.querySelectorAll('input[type=\"number\"]');\n        const decayInput = inputs[0];\n        const harmonicsInput = inputs[1];\n        const cancelBtn = UI.querySelector('.ui-cancel');\n        const inplace = UI.querySelector('input[type=\"checkbox\"]');\n        const confirmBtn = UI.querySelector('.ui-confirm');\n        cancelBtn.onclick = () => {\n            UI.remove();\n            resolve(false);\n        };\n        confirmBtn.onclick = () => {\n            let decay = parseFloat(decayInput.value);\n            if (decay < 0.1 || decay > 0.9) {\n                alert(\"衰减率必须在0.1到0.9之间！\");\n                return;\n            }\n            let harmonics = parseInt(harmonicsInput.value);\n            if (harmonics < 4 || harmonics > 16) {\n                alert(\"谐波数量必须在4到16之间！\");\n                return;\n            }\n            UI.remove();\n            this._reduceHarmonic(decay, harmonics, inplace.checked).then(() => {\n                resolve(true);\n            }).catch(reject);\n        }\n        document.body.insertBefore(UI, document.body.firstChild);\n        return p;\n    };\n    /**\n     * 利用非负最小二乘去除频谱中的谐波成分并补偿基频 在幅度谱上进行\n     * 如果inplace为true则直接修改Spectrogram.spectrogram 否则会存储谐波成分矩阵于Spectrogram.harmonic\n     * 原理是将谐波模板（每个音符的基频和若干个谐波）作为特征，拟合出每一帧中各个音符的强度，然后将这些音符的谐波成分从频谱中减去\n     * @param {number} decay 谐波衰减率，默认0.6，越大去除越彻底但可能过度拟合\n     * @param {number} harmonics 谐波数量\n     * @param {boolean} inplace 是否直接在原频谱上减去谐波 还是单独存储谐波成分\n     */\n    this._reduceHarmonic = async (decay = 0.6, harmonics = 10, inplace = false) => {\n        const container = document.createElement('div');\n        container.innerHTML = `<div class=\"request-cover\">\n<div class=\"card hvCenter\"><label class=\"title\">分析中</label>\n    <span>00%</span>\n    <div class=\"layout\">\n        <div class=\"porgress-track\">\n            <div class=\"porgress-value\"></div>\n        </div>\n    </div>\n</div></div>`;\n        const progressUI = container.firstElementChild;\n        const progress = progressUI.querySelector('.porgress-value');\n        const percent = progressUI.querySelector('span');\n        document.body.insertBefore(progressUI, document.body.firstChild);\n        const onprogress = (detail) => {\n            if (detail < 0) {\n                progress.style.width = '100%';\n                percent.textContent = '100%';\n                progressUI.style.opacity = 0;\n                setTimeout(() => progressUI.remove(), 200);\n            } else if (detail >= 1) {\n                detail = 1;\n                progress.style.width = '100%';\n                percent.textContent = \"加载界面……\";\n            } else {\n                progress.style.width = (detail * 100) + '%';\n                percent.textContent = (detail * 100).toFixed(2) + '%';\n            }\n        };\n        var lastFrame = performance.now();\n\n        const s = parent.Spectrogram._spectrogram;\n        const M = s[0].length, N = s.length;\n        const M1 = M + 1;\n        // 创建音符谐波模板\n        let harmonicAmp = Array.from({ length: harmonics }, (_, i) => decay ** i);\n        const Harmonic = new Float32Array(M);\n        for (let i = 0; i < harmonicAmp.length; i++) {\n            const idx = 12 * Math.log2(i + 1);\n            let l = Math.floor(idx), r = Math.ceil(idx);\n            if (r < M) {\n                if (l == r) Harmonic[l] = harmonicAmp[i];\n                else {\n                    Harmonic[l] += harmonicAmp[i] * (r - idx);\n                    Harmonic[r] += harmonicAmp[i] * (idx - l);\n                }\n            }\n        }\n        // 填充到模板矩阵A\n        const A = new Float32Array(M * M);\n        for (let i = 0; i < M; i++)\n            A.set(Harmonic.subarray(0, M - i), i * M1);\n        // 模式选择\n        if (!inplace) {\n            harmonicAmp = Array(N);\n            harmonicAmp.raw = new Float32Array(N * M);\n        } else harmonicAmp = null;\n        // 对每一帧执行NNLS\n        const nnls = new NNLSSolver(M, M, 2e-4, Harmonic);\n        for (let t = 0; t < N; t++) {\n            const f = s[t];\n            const c = nnls.solve(A, f);\n            // 计算谐波\n            Harmonic.fill(0);\n            for (let i = 0; i < M; i++) {\n                const a = i + 12;   // start at 2f0\n                const off = i * M + a;\n                let f0h = 0;\n                for (let j = 0; j < M - a; j++) {\n                    let amp = A[off + j] * c[i];\n                    f0h += amp * amp;\n                    Harmonic[a + j] += amp;\n                };\n                // 加强基频。∵L2<L1 ∴此处用L2对基频小幅补偿\n                Harmonic[i] -= Math.sqrt(f0h);\n            }\n            if (inplace) { // 从原始频谱中减去谐波\n                for (let i = 0; i < M; i++) f[i] = Math.max(0, f[i] - Harmonic[i]);\n            } else { // 存储谐波成分\n                let a = harmonicAmp[t] = harmonicAmp.raw.subarray(t * M, (t + 1) * M);\n                a.set(Harmonic);\n            }\n            // UI更新\n            let tnow = performance.now();\n            if (tnow - lastFrame > 200) {\n                onprogress(t / N);\n                await new Promise(resolve => setTimeout(resolve, 0));   // 等待UI\n                lastFrame = tnow;\n            }\n        }\n        if (!inplace) parent.Spectrogram.harmonic = harmonicAmp;\n        parent.layers.spectrum.dirty = true;\n        onprogress(-1);\n    };\n}"
  },
  {
    "path": "core/app_audioplayer.js",
    "content": "/// <reference path=\"../lib/fakeAudio.js\" />\n\n/**\n * 音频播放\n * @param {App} parent \n */\nfunction _AudioPlayer(parent) {\n    this.name = \"请上传文件\";   // 在parent.io.onfile中赋值\n    this.audio = new Audio();   // 在parent.io.onfile中重新赋值 此处需要一个占位\n    this.play_btn = document.getElementById(\"play-btn\");\n    this.durationString = '';   // 在parent.Analyser.audio.ondurationchange中更新\n    this.autoPage = false;      // 自动翻页\n    this.repeat = true;         // 是否区间循环\n    this.EQfreq = [31, 62, 125, 250, 500, 1000, 2000, 4000, 8000, 16000];\n    // midiMode下url为duration\n    this.createAudio = (url) => {\n        return new Promise((resolve, reject) => {\n            const a = parent.midiMode ? new FakeAudio(url) : new Audio(url);\n            a.loop = false;\n            a.volume = parseFloat(document.getElementById('audiovolumeControl').value);\n            a.ondurationchange = () => {\n                let ms = a.duration * 1000;\n                this.durationString = parent.TimeBar.msToClockString(ms);\n                parent.BeatBar.beats.maxTime = ms;\n            };\n            a.onended = () => {\n                parent.time = 0;\n                this.stop();\n            };\n            a.onloadeddata = () => {\n                if (!parent.midiMode) {\n                    this.setEQ();\n                    if (parent.audioContext.state == 'suspended') parent.audioContext.resume().then(() => a.pause());\n                    document.title = this.name + \"~扒谱\";\n                } else {\n                    document.title = this.name;\n                }\n                a.playbackRate = document.getElementById('speedControl').value; // load之后会重置速度\n                parent.time = 0;\n                resolve(a);\n                a.onloadeddata = null;  // 一次性 防止多次构造\n                this.play_btn.firstChild.textContent = parent.TimeBar.msToClockString(parent.time);\n                this.play_btn.lastChild.textContent = this.durationString;\n            };\n            a.onerror = (e) => {    // 如果正常分析，是用不到这个回调的，因为WebAudioAPI读取就会报错。但上传已有结果不会再分析\n                // 发现一些如mov格式的视频，不在video/的支持列表中，用.readAsDataURL转为base64后无法播放，会触发这个错误\n                // 改正方法是用URL.createObjectURL(file)生成一个blob地址而不是解析为base64\n                console.error(\"Audio load error\", e);\n                reject(e);\n                // 不再抛出错误事件 调用者自行处理\n                // parent.event.dispatchEvent(new Event('fileerror'));\n            };\n            this.setAudio(a);\n        });\n    };\n\n    let _crossFlag = false;     // 上一时刻是否在重复区间终点左侧\n    this.update = () => {\n        const a = this.audio;\n        if (a.readyState != 4 || a.paused) return;\n        parent.time = a.currentTime * 1000;  // 【重要】更新时间\n        // 重复区间\n        let crossFlag = parent.time < parent.TimeBar.repeatEnd;\n        if (this.repeat && parent.TimeBar.repeatEnd >= parent.TimeBar.repeatStart) {   // 重复且重复区间有效\n            if (_crossFlag && !crossFlag) {  // 从重复区间终点左侧到右侧\n                parent.time = parent.TimeBar.repeatStart;\n                a.currentTime = parent.time / 1000;\n            }\n        }\n        _crossFlag = crossFlag;\n        this.play_btn.firstChild.textContent = parent.TimeBar.msToClockString(parent.time);\n        this.play_btn.lastChild.textContent = this.durationString;\n        // 自动翻页\n        if (parent.time > parent.idXend * parent.dt || parent.time < parent.idXstart * parent.dt) {\n            // 在视图外\n            if (this.autoPage)\n                parent.scroll2(((parent.time / parent.dt - 1) | 0) * parent._width, parent.scrollY);\n        } else parent.layers.action.dirty = true;\n    };\n    /**\n     * 在指定的毫秒数开始播放\n     * @param {number} at 开始的毫秒数 如果是负数，则从当下开始\n     */\n    this.start = (at) => {\n        const a = this.audio;\n        if (a.readyState != 4) return;\n        if (at >= 0) a.currentTime = at / 1000;\n        _crossFlag = false;    // 置此为假可以暂时取消重复区间\n        parent.MidiPlayer.restart();\n        if (a.readyState == 4) a.play();\n        else a.oncanplay = () => {\n            a.play();\n            a.oncanplay = null;\n        };\n    };\n    this.stop = () => {\n        this.audio.pause();\n        parent.synthesizer.stopAll();\n    };\n    this.setEQ = (f = this.EQfreq) => {\n        const a = this.audio;\n        if (a.EQ) return;\n        // 由于createMediaElementSource对一个audio只能调用一次，所以audio的EQ属性只能设置一次\n        const source = parent.audioContext.createMediaElementSource(a);\n        let last = source;\n        a.EQ = {\n            source: source,\n            filter: f.map((v) => {\n                const filter = parent.audioContext.createBiquadFilter();\n                filter.type = \"peaking\";\n                filter.frequency.value = v;\n                filter.Q.value = 1;\n                filter.gain.value = 0;\n                last.connect(filter);\n                last = filter;\n                return filter;\n            })\n        };\n        last.connect(parent.audioContext.destination);\n    };\n    this.setAudio = (newAudio) => {\n        const a = this.audio;\n        if (a) {\n            a.pause();\n            a.onerror = null;   // 防止触发fileerror\n            a.src = '';\n            if (a.EQ) {\n                a.EQ.source.disconnect();\n                for (const filter of a.EQ.filter) filter.disconnect();\n            }\n            // 配合传参为URL.createObjectURL(file)使用，防止内存泄露\n            URL.revokeObjectURL(a.src);\n        }\n        this.audio = newAudio;\n    };\n\n    this.play_btn.onclick = () => {\n        if (this.audio.paused) this.start(-1);\n        else this.stop();\n        this.play_btn.blur();   // 防止焦点在按钮上导致空格响应失败\n    };\n}"
  },
  {
    "path": "core/app_beatbar.js",
    "content": "/// <reference path=\"../lib/beatBar.js\" />\n/// <reference path=\"../ui/contextMenu.js\" />\n\n/**\n * 顶部小节轴\n * @param {App} parent \n */\nfunction _BeatBar(parent) {\n    this.beats = new Beats();\n    this.minInterval = 20;  // 最小画线间隔 单位:像素\n    // timeBar的下半部分画小节线和拍线 并在工作区画小节线\n    this.render = () => {\n        const canvas = parent.timeBar;\n        const ctx = parent.timeBar.ctx;\n\n        ctx.fillStyle = '#2e3039';\n        const h = canvas.height >> 1;\n        ctx.fillRect(0, h, canvas.width, canvas.width);\n        ctx.fillStyle = '#8e95a6';\n        const spectrum = parent.layers.action.ctx;\n        const spectrumHeight = parent.layers.action.height;\n        ctx.strokeStyle = '#f0f0f0';\n        spectrum.strokeStyle = '#c0c0c0';\n\n        const beatX = [];   // 小节内每一拍\n        const noteX = [];   // 一拍内x分音符对齐线\n\n        const iterator = this.beats.iterator(parent.scrollX * parent.TperP, true);\n        ctx.beginPath(); spectrum.beginPath();\n        while (1) {\n            let measure = iterator.next();\n            if (measure.done) break;\n            measure = measure.value;\n            let x = measure.start * parent.PperT - parent.scrollX;\n            if (x > canvas.width) break;\n            ctx.moveTo(x, h);\n            ctx.lineTo(x, canvas.height);\n            spectrum.moveTo(x, 0);\n            spectrum.lineTo(x, spectrumHeight);\n            // 写字 会根据间隔决定是否显示拍型\n            const Interval = measure.interval * parent.PperT;\n            ctx.fillText(Interval < 38 ? measure.id : `${measure.id}. ${measure.beatNum}/${measure.beatUnit}`, x + 2, h + 14);\n            // 画更细的节拍线\n            const dp = Interval / measure.beatNum;\n            if (dp < this.minInterval) continue;\n            x += dp;\n            for (let i = measure.beatNum - 1; i > 0; i--, x += dp) beatX.push(x);\n            // 画x分音符的线\n            const noteNum = 1 << Math.log2(dp / this.minInterval);\n            if (noteNum < 2) continue;\n            const noteInterval = dp / noteNum;\n            let i = ((x - canvas.width) / noteInterval) | 0;    // 跳过末尾的 不然在极大的放大时会卡顿\n            if (i > 0) x -= i * noteInterval;\n            else i = 0;\n            for (let n = noteNum * measure.beatNum; i < n; i++, x -= noteInterval) {\n                if (x < 0) break;\n                if (i % noteNum == 0) continue; // 跳过beat线\n                noteX.push(x);\n            }\n        } ctx.stroke(); spectrum.stroke();\n\n        if (beatX.length != 0) {\n            spectrum.beginPath();\n            spectrum.strokeStyle = '#909090';\n            for (const x of beatX) {\n                spectrum.moveTo(x, 0);\n                spectrum.lineTo(x, spectrumHeight);\n            } spectrum.stroke();\n        }\n\n        if (noteX.length != 0) {\n            spectrum.beginPath();\n            spectrum.setLineDash([4, 4]);\n            spectrum.strokeStyle = '#606060';\n            for (const x of noteX) {\n                spectrum.moveTo(x, 0);\n                spectrum.lineTo(x, spectrumHeight);\n            } spectrum.stroke();\n            spectrum.setLineDash([]);   // 恢复默认\n        }\n    };\n    this.contextMenu = new ContextMenu([\n        {\n            name: \"设置小节\",\n            callback: (e_father, e_self) => {\n                const bs = this.beats;\n                const m = bs.setMeasure((e_father.offsetX + parent.scrollX) * parent.TperP, undefined, true);\n                const tempDiv = document.createElement('div');\n                tempDiv.innerHTML = `\n<div class=\"request-cover\">\n    <div class=\"card hvCenter\"><label class=\"title\">小节${m.id}设置</label>\n        <div class=\"layout layout-first\"><span>拍数</span><input type=\"text\" name=\"ui-ask\" step=\"1\" max=\"16\" min=\"1\"></div>\n        <div class=\"layout\"><span>音符</span><select name=\"ui-ask\">\n            <option value=\"2\">2分</option>\n            <option value=\"4\">4分</option>\n            <option value=\"8\">8分</option>\n            <option value=\"16\">16分</option>\n        </select></div>\n        <div class=\"layout\"><span>BPM:</span><input type=\"number\" name=\"ui-ask\" min=\"1\"></div>\n        <div class=\"layout\"><span>(忽略BPM)保持小节长度</span><input type=\"checkbox\" name=\"ui-ask\"></div>\n        <div class=\"layout\"><span>(忽略以上)和上一小节一样</span><input type=\"checkbox\" name=\"ui-ask\"></div>\n        <div class=\"layout\"><span>应用到后面相邻同类型小节</span><input type=\"checkbox\" name=\"ui-ask\" checked></div>\n        <div class=\"layout\"><button class=\"ui-cancel\">取消</button><button class=\"ui-confirm\">确定</button></div>\n    </div>\n</div>`;\n                const Pannel = tempDiv.firstElementChild;\n                document.body.insertBefore(Pannel, document.body.firstChild);\n                Pannel.tabIndex = 0;\n                Pannel.focus();\n                function close() { Pannel.remove(); }\n                const inputs = Pannel.querySelectorAll('[name=\"ui-ask\"]');\n                const btns = Pannel.getElementsByTagName('button');\n                inputs[0].value = m.beatNum;    // 拍数\n                inputs[1].value = m.beatUnit;   // 音符类型\n                inputs[2].value = m.bpm;        // bpm\n                btns[0].onclick = close;\n                btns[1].onclick = () => {\n                    if (!inputs[5].checked) {   // 后面不变\n                        bs.setMeasure(m.id + 1, undefined, false); // 让下一个生成实体\n                    }\n                    if (inputs[4].checked) {    // 和上一小节一样\n                        let last = bs.getMeasure(m.id - 1, false);\n                        m.copy(last);\n                    } else {\n                        m.beatNum = parseInt(inputs[0].value);\n                        m.beatUnit = parseInt(inputs[1].value);\n                        if (!inputs[3].checked) m.bpm = parseFloat(inputs[2].value);\n                    } bs.check(); close();\n                    parent.snapshot.save(0b100);\n                };\n            }\n        }, {\n            name: \"后方插入一小节\",\n            callback: (e_father) => {\n                this.beats.add((e_father.offsetX + parent.scrollX) * parent.TperP, true);\n                parent.snapshot.save(0b100);\n            }\n        }, {\n            name: \"均分该小节\",\n            callback: (e_father) => {\n                const beatarr = this.beats;\n                const base = beatarr.setMeasure((e_father.offsetX + parent.scrollX) * parent.TperP, undefined, true, true);\n                const baseM = beatarr[base];\n                // 下一小节若未定义则定义 则插入一个 防止影响后面\n                if (base + 1 >= beatarr.length || beatarr[base + 1].id > baseM.id + 1)\n                    beatarr.splice(base + 1, 0, eMeasure.baseOn(baseM, baseM.id + 1));\n                // 插入新的 用id位移实现\n                baseM.interval /= 2;\n                for (let i = base + 1; i < beatarr.length; i++) beatarr[i].id++;\n                beatarr.check(true);\n                parent.snapshot.save(0b100);\n            }\n        }, {\n            name: \"分裂为单拍\",\n            callback: (e_father) => {\n                const beatarr = this.beats;\n                const base = beatarr.setMeasure((e_father.offsetX + parent.scrollX) * parent.TperP, undefined, true, true);\n                const baseM = beatarr[base];\n                if (base + 1 >= beatarr.length || beatarr[base + 1].id > baseM.id + 1)\n                    beatarr.splice(base + 1, 0, eMeasure.baseOn(baseM, baseM.id + 1));\n                const beatNum = baseM.beatNum;\n                baseM.interval /= beatNum;\n                for (let i = base + 1; i < beatarr.length; i++) beatarr[i].id += beatNum - 1;\n                beatarr.check(true);\n                parent.snapshot.save(0b100);\n            }\n        }, {\n            name: \"合并下一小节\",\n            callback: (e_father) => {\n                const beatarr = this.beats;\n                const base = beatarr.setMeasure((e_father.offsetX + parent.scrollX) * parent.TperP, undefined, true, true);\n                const baseM = beatarr[base];\n                // 下下个\n                const nextnext = beatarr.setMeasure(baseM.id + 2, undefined, false, true);\n                const nextnextM = beatarr[nextnext];\n                if (nextnext === base + 2) {\n                    // 中间隔了一个小节头\n                    const deleted = beatarr.splice(base + 1, 1)[0];\n                    baseM.interval += deleted.interval;\n                    baseM.beatNum += deleted.beatNum;\n                } else {\n                    baseM.interval += baseM.interval;\n                    baseM.beatNum += baseM.beatNum;\n                }\n                for (let i = base + 1; i < beatarr.length; i++) beatarr[i].id--;\n                beatarr.check(true);\n                parent.snapshot.save(0b100);\n            }\n        }, {\n            name: \"重置后面所有小节\",\n            callback: (e_father) => {\n                const base = this.beats.getBaseIndex((e_father.offsetX + parent.scrollX) * parent.TperP, true);\n                this.beats.splice(base + 1);\n                parent.snapshot.save(0b100);\n            }\n        }, {\n            name: '<span style=\"color: red;\">删除该小节</span>',\n            callback: (e_father, e_self) => {\n                this.beats.delete((e_father.offsetX + parent.scrollX) * parent.TperP, true);\n                parent.snapshot.save(0b100);\n            }\n        }\n    ]);\n    this.belongID = -1;  // 小节线前一个小节的id\n    this.moveCatch = (e) => {   // 画布上光标移动到小节线上可以进入调整模式\n        // 判断是否在小节轴上\n        if (e.offsetY < parent.timeBar.height >> 1) {\n            parent.timeBar.classList.remove('selecting');\n            this.belongID = -1;\n            return;\n        }\n        const timeNow = (e.offsetX + parent.scrollX) * parent.TperP;\n        const m = this.beats.getMeasure(timeNow, true);\n        if (m == null) {\n            this.belongID = -1;\n            parent.timeBar.classList.remove('selecting');\n            return;\n        }\n        const threshold = 6 * parent.TperP;\n        if (timeNow - m.start < threshold) {\n            this.belongID = m.id - 1;\n            parent.timeBar.classList.add('selecting');\n        } else if (m.start + m.interval - timeNow < threshold) {\n            this.belongID = m.id;\n            parent.timeBar.classList.add('selecting');\n        } else {\n            this.belongID = -1;\n            parent.timeBar.classList.remove('selecting');\n        }\n    };\n}"
  },
  {
    "path": "core/app_hscrollbar.js",
    "content": "/**\n * 配合scroll的滑动条\n * @param {App} parent \n */\nfunction _HscrollBar(parent) {\n    this.maxScrollX = 0;\n    this.refreshPosition = () => {  // 在parent.scroll2中调用\n        if (this.maxScrollX <= 0) {\n            thumb.style.left = '0px';\n            return;\n        }\n        let pos = (track.offsetWidth - thumb.offsetWidth) * parent.scrollX / this.maxScrollX;\n        thumb.style.left = pos + 'px';\n    };\n    this.refreshSize = () => {      // 需要在parent.xnum parent.width改变之后调用 在二者的setter中调用\n        track.style.display = 'block';\n        let all = parent._width * parent._xnum;\n        let p = Math.min(1, parent.layers.width / all);    // 由于有min存在所以xnum即使为零也能工作\n        let nw = p * track.offsetWidth;\n        thumb.style.width = Math.max(nw, 10) + 'px';    // 限制最小宽度\n        this.maxScrollX = all - parent.layers.width;\n    };\n\n    const track = document.getElementById('scrollbar-track');\n    const thumb = document.getElementById('scrollbar-thumb');\n    const thumbMousedown = (event) => { // 滑块跟随鼠标\n        event.stopPropagation();        // 防止触发track的mousedown\n        const startX = event.clientX;\n        const thumbLeft = thumb.offsetLeft;\n        const moveThumb = (event) => {\n            let currentX = event.clientX - startX + thumbLeft;\n            let maxThumbLeft = track.offsetWidth - thumb.offsetWidth;\n            parent.scroll2(currentX / maxThumbLeft * this.maxScrollX, parent.scrollY);\n        }\n        const stopMoveThumb = () => {\n            document.removeEventListener(\"mousemove\", moveThumb);\n            document.removeEventListener(\"mouseup\", stopMoveThumb);\n        }\n        document.addEventListener(\"mousemove\", moveThumb);\n        document.addEventListener(\"mouseup\", stopMoveThumb);\n    };\n    const trackMousedown = (e) => { // 滑块跳转\n        e.stopPropagation();\n        let maxThumbLeft = track.offsetWidth - thumb.offsetWidth;\n        let p = (e.offsetX - (thumb.offsetWidth >> 1)) / maxThumbLeft;  // nnd 减法优先级比位运算高\n        parent.scroll2(p * this.maxScrollX, parent.scrollY);\n    };\n    thumb.addEventListener('mousedown', thumbMousedown);\n    track.addEventListener('mousedown', trackMousedown);\n}"
  },
  {
    "path": "core/app_io.js",
    "content": "/// <reference path=\"../lib/saver.js\" />\n/// <reference path=\"../lib/midi.js\" />\n\n/**\n * 文件相关操作\n * @param {App} parent \n */\nfunction _IO(parent) {\n    this.canUseExternalWorker = typeof window.Worker !== 'undefined' && window.location.protocol !== 'file:';\n    // midi模式下的假音频\n    function fakeInput(l = 0, tNum = 1000 / parent.dt) {\n        if (!l || l <= 0) l = Math.ceil((parent.layers.width << 1) / parent.width);\n        // 一个怎么取值都返回0的东西，充当频谱\n        parent.Spectrogram.spectrogram = new Proxy({\n            raw: new Uint8Array(parent.ynum).fill(0),\n            _length: l,\n            get length() { return this._length; },\n            set length(l) { // 只要改变频谱的长度就可以改变时长 长度改变在MidiAction.updateView中\n                if (l < 0) return;\n                this._length = parent.xnum = l;\n                parent.AudioPlayer.audio.duration = l / tNum;\n                parent.AudioPlayer.play_btn.lastChild.textContent = parent.AudioPlayer.durationString;\n            },\n            *[Symbol.iterator]() {\n                for (let i = 0; i < this.length; i++) yield this.raw;\n            }\n        }, {\n            get(obj, prop) {    // 方括号传递的总是string\n                if (isNaN(Number(prop))) return obj[prop];\n                return obj.raw;\n            },\n            set(obj, prop, value) {\n                if (isNaN(Number(prop))) obj[prop] = value;\n                return true;\n            }\n        });\n        // 假音频 需要设置parent.midiMode=true;\n        return parent.AudioPlayer.createAudio(l / tNum);\n    }\n\n    /**\n     * 会发出如下event:\n     * - fileui: 展示本函数的UI，需要外界关闭drag功能\n     * - fileuiclose: UI关闭，外界恢复drag功能\n     * - fileerror: 文件解析错误，外界提示用户; detail为Error对象\n     * - progress: 解析进度，detail为0~1的数字，-1表示完成\n     * event的意义是可以反复触发（比如进度文件错误可重试），而返回值的promise只能触发一次\n     * @param {File} file 音频文件 如果不传则进入midi编辑器模式\n     * @returns Promise 指示用户操作完成，即UI关闭\n     */\n    this.onfile = (file) => {     // 依赖askUI.css\n        let midimode = file == void 0;    // 在确认后才能parent.midiMode=midimode\n        if (midimode) {      // 不传则说明是midi编辑器模式\n            file = { name: \"MIDI编辑模式\" };\n        } else if (!(file.type.startsWith('audio/') || file.type.startsWith('video/'))) {\n            parent.event.dispatchEvent(new CustomEvent('fileerror', { detail: new Error(\"不支持的文件类型\") }));\n            return Promise.reject();\n        } else if (file.type == \"audio/mid\") {\n            if (parent.Spectrogram._spectrogram) {\n                this.midiFile.import(file);\n                return Promise.resolve();\n            }\n            // 没有设置时间精度，先弹设置UI\n            return this.onfile().then(() => {\n                this.midiFile.import(file);\n            });\n        }\n        if (parent.Spectrogram._spectrogram && !confirm(\"本页面已加载音频，是否替换？\")) {\n            return Promise.reject();\n        }\n\n        // 指示是否完成\n        let resolve, reject;\n        const donePromise = new Promise((res, rej) => { resolve = res; reject = rej; });\n        const loadAudio = (URLmode = true) => new Promise((res, rej) => {\n            const fileReader = new FileReader();\n            // 音频文件错误标志本次会话结束\n            // 调用loadAudio不需要再写catch\n            fileReader.onerror = (e) => {\n                parent.event.dispatchEvent(new CustomEvent('fileerror', { detail: e }));\n                console.error(\"FileReader error\", e);\n                reject(e);\n                rej(e);\n            };\n            fileReader.onload = (e) => {\n                res(e.target.result);\n            };\n            if (URLmode) fileReader.readAsDataURL(file);\n            else fileReader.readAsArrayBuffer(file);\n        });\n\n        parent.event.dispatchEvent(new Event('fileui'));    // 关闭drag功能\n        let tempDiv = document.createElement('div');\n        // 为了不影响下面的事件绑定，midi模式下用display隐藏\n        const midiModeStyle = midimode ? ' style=\"display:none;\"' : '';\n        tempDiv.innerHTML = `\n<div class=\"request-cover\">\n    <div class=\"card hvCenter\">\n        <span class=\"title\" style=\"text-align: center;\">${file.name}</span>\n        <button class=\"ui-cancel\"${midiModeStyle}>使用已有结果</button>\n        <div class=\"layout layout-first\"><span>每秒的次数：</span><input type=\"number\" name=\"ui-ask\" value=\"20\" min=\"1\" max=\"100\"></div>\n        <div class=\"layout\"><span>标准频率A4=</span><input type=\"number\" name=\"ui-ask\" value=\"440\" step=\"0.1\" min=\"55\"></div>\n        <div${midiModeStyle}>\n            <div class=\"layout\">分析声道：\n                <label class=\"labeled\" data-tooltip=\"快,只是进度条没动画\">GPU加速<input type=\"checkbox\" id=\"stft-gpu\" checked></label>\n            </div>\n            <div class=\"layout\">\n                <input type=\"radio\" name=\"ui-ask\" value=\"4\" checked>Stereo\n                <input type=\"radio\" name=\"ui-ask\" value=\"2\">L+R\n                <input type=\"radio\" name=\"ui-ask\" value=\"3\">L-R\n                <input type=\"radio\" name=\"ui-ask\" value=\"0\">L\n                <input type=\"radio\" name=\"ui-ask\" value=\"1\">R\n            </div>\n            <div class=\"layout\"${this.canUseExternalWorker ? '' : ' style=\"display:none;\"'}>\n                <label class=\"labeled\" data-tooltip=\"CQT分析更精准,将在后台进行\">\n                    后台计算CQT<input type=\"checkbox\" id=\"calc-cqt\" checked>\n                </label>\n                <label class=\"labeled\" data-tooltip=\"GPU更快,但中途页面易卡顿\">\n                    优先用GPU算CQT<input type=\"checkbox\" id=\"prefer-gpu\">\n                </label>\n            </div>\n        </div>\n        <div class=\"layout\">\n            <button class=\"ui-cancel\">取消</button>\n            <span style=\"width: 1em;\"></span>\n            <button class=\"ui-confirm\">${midimode ? '确认' : '解析'}</button>\n        </div>\n    </div>\n</div>`;\n        parent.AudioPlayer.name = file.name;\n        const ui = tempDiv.firstElementChild;\n        const close = () => ui.remove();\n        const checkboxSTFTGPU = ui.querySelector('#stft-gpu');\n        const checkboxCQT = ui.querySelector('#calc-cqt');\n        const checkboxGPU = ui.querySelector('#prefer-gpu');\n        checkboxCQT.onchange = () => {\n            checkboxGPU.parentElement.style.display = checkboxCQT.checked ? 'block' : 'none';\n        };\n        const btns = ui.getElementsByTagName('button');\n        btns[0].onclick = () => {   // 进度上传\n            const input = document.createElement(\"input\");\n            input.type = \"file\";\n            input.onchange = () => {\n                parent.io.projFile.parse(input.files[0]).then((data) => {\n                    if (parent.AudioPlayer.name != data[0].name &&\n                        !confirm(`音频文件与进度(${data[0].name})不同，是否继续？`))\n                        return;\n                    // 如果保存的是midi模式，则data[1]是都为undefined的数组\n                    if (Array.isArray(data[1]) && data[1][0] === void 0) {\n                        parent.io.projFile.import(data);\n                        fakeInput().then(resolve).catch(reject);\n                        return;\n                    }\n                    // 再读取音频看看是否成功\n                    loadAudio(true).then((audioBuffer) => {\n                        // 设置音频源 缓存到浏览器\n                        parent.AudioPlayer.createAudio(audioBuffer).then(() => {\n                            parent.io.projFile.import(data);\n                            // 触发html中的iniEQUI\n                            parent.event.dispatchEvent(new CustomEvent('progress', { detail: -1 }));\n                            resolve();\n                        }).catch((e) => {\n                            parent.event.dispatchEvent(new CustomEvent('fileerror', { detail: e }));\n                            console.error(\"AudioPlayer error\", e);\n                            reject(e);\n                        }).finally(() => {\n                            close();    // 不管音频结果如何都要关闭UI\n                            parent.event.dispatchEvent(new Event('fileuiclose'));  // 恢复drag功能\n                        });\n                    });\n                }).catch((e) => {\n                    // 进度文件错误，允许重试，不reject\n                    parent.event.dispatchEvent(new CustomEvent('fileerror', { detail: e }));\n                });\n            }; input.click();\n        };\n        btns[1].onclick = () => {   // 取消按钮\n            close();\n            parent.event.dispatchEvent(new Event('fileuiclose'));  // 恢复drag功能\n            resolve(false);\n        };\n        btns[2].onclick = () => {   // 确认按钮\n            // 获取分析参数\n            const params = ui.querySelectorAll('[name=\"ui-ask\"]');  // getElementsByName只能在document中用\n            let tNum = params[0].value;\n            let A4 = params[1].value;\n            let channel = 4;\n            for (let i = 2; i < 7; i++) {\n                if (params[i].checked) {\n                    channel = parseInt(params[i].value);\n                    break;\n                }\n            }\n            close();\n            parent.midiMode = midimode;\n\n            //==== midi模式 ====//\n            if (midimode) {\n                // 在Anaylse中的设置全局的\n                parent.dt = 1000 / tNum;\n                parent.TperP = parent.dt / parent._width; parent.PperT = parent._width / parent.dt;\n                if (parent.Keyboard.freqTable.A4 != A4) parent.Keyboard.freqTable.A4 = A4;\n                fakeInput(0, tNum).then(resolve).catch(reject);\n                parent.event.dispatchEvent(new Event('fileuiclose'));  // 恢复drag功能\n                return;\n            }\n\n            //==== 音频文件分析 ====//\n            // 打开另一个ui analyse加入回调以显示进度\n            let tempDiv = document.createElement('div');\n            tempDiv.innerHTML = `\n<div class=\"request-cover\">\n    <div class=\"card hvCenter\"><label class=\"title\">解析中</label>\n        <span>00%</span>\n        <div class=\"layout layout-first\">\n            <div class=\"porgress-track\">\n                <div class=\"porgress-value\"></div>\n            </div>\n        </div>\n    </div>\n</div>`;\n            const progressUI = tempDiv.firstElementChild;\n            const progress = progressUI.querySelector('.porgress-value');\n            const percent = progressUI.querySelector('span');\n            document.body.insertBefore(progressUI, document.body.firstChild);\n            const onprogress = ({ detail }) => {\n                if (detail < 0) {\n                    parent.event.removeEventListener('progress', onprogress);\n                    progress.style.width = '100%';\n                    percent.textContent = '100%';\n                    progressUI.style.opacity = 0;\n                    setTimeout(() => progressUI.remove(), 200);\n                } else if (detail >= 1) {\n                    detail = 1;\n                    progress.style.width = '100%';\n                    percent.textContent = \"加载界面……\";\n                } else {\n                    progress.style.width = (detail * 100) + '%';\n                    percent.textContent = (detail * 100).toFixed(2) + '%';\n                }\n            };\n            parent.event.addEventListener('progress', onprogress);\n            // 读取文件\n            loadAudio(false).then((audioBuffer) => {\n                let channels;\n                // 解码音频文件为音频缓冲区\n                parent.audioContext.decodeAudioData(audioBuffer).then((decodedData) => {\n                    channels = parent.Analyser.selectChannel(decodedData, channel);\n                    return Promise.all([\n                        parent.Analyser.stft(channels, tNum, A4, 8192, checkboxSTFTGPU.checked),\n                        parent.AudioPlayer.createAudio(URL.createObjectURL(file)) // fileReader.readAsDataURL(file) 将mov文件decode之后变成base64，audio无法播放 故不用\n                    ]);\n                }).then(([v, audio]) => {\n                    parent.Spectrogram.spectrogram = v;\n                    resolve();\n                    // 后台执行CQT CQT的报错已经被拦截不会冒泡到下面的catch中\n                    if (checkboxCQT.checked) parent.Analyser.cqt(\n                        channels, tNum,\n                        checkboxCQT.checked && checkboxGPU.checked\n                    );\n                }).catch((e) => {\n                    console.error(e);\n                    parent.event.dispatchEvent(new CustomEvent('fileerror', { detail: e }));\n                    reject(e);\n                }).finally(() => {\n                    // 最终都要关闭进度条\n                    parent.event.dispatchEvent(new CustomEvent('progress', { detail: -1 }));\n                    parent.event.dispatchEvent(new Event('fileuiclose'));  // 恢复drag功能\n                });\n            });\n        };\n        document.body.insertBefore(ui, document.body.firstChild);   // 插入body的最前面\n        ui.focus();\n        return donePromise;\n    };\n\n    // 进度文件\n    this.projFile = {\n        export() {\n            if (!parent.Spectrogram._spectrogram) return null;\n            const data = {\n                midi: parent.MidiAction.midi,\n                channel: parent.MidiAction.channelDiv.channel,\n                beat: parent.BeatBar.beats,\n                dt: parent.dt,\n                A4: parent.Keyboard.freqTable.A4,\n                name: parent.AudioPlayer.name\n            };\n            if (parent.midiMode) return [data, {\n                length: parent.Spectrogram._spectrogram.length\n            }]; // midi模式不保存频谱\n            else return [data, parent.Spectrogram._spectrogram];\n        },\n        import(data) {  // data: output of parse [obj, f32]\n            const obj = data[0];\n            parent.MidiAction.midi = obj.midi;\n            parent.MidiAction.selected = parent.MidiAction.midi.filter((obj) => obj.selected);\n            parent.MidiAction.channelDiv.fromArray(obj.channel);\n            parent.BeatBar.beats.copy(obj.beat);\n            parent.dt = obj.dt;\n            parent.TperP = parent.dt / parent._width; parent.PperT = parent._width / parent.dt;\n            parent.Keyboard.freqTable.A4 = obj.A4;\n            parent.Spectrogram.spectrogram = data[1];\n            parent.snapshot.save();\n        },\n        write(fileName = parent.AudioPlayer.name) {\n            const data = this.export();\n            bSaver.saveArrayBuffer(bSaver.combineArrayBuffers([\n                bSaver.String2Buffer(\"noteDigger\"),\n                bSaver.Object2Buffer(data[0]),\n                bSaver.Float32Mat2Buffer(data[1])\n            ]), fileName + '.nd');\n        },\n        parse(file) {\n            return new Promise((resolve, reject) => {\n                bSaver.readBinary(file, (b) => {\n                    let [name, o] = bSaver.Buffer2String(b, 0);\n                    if (name != \"noteDigger\") {\n                        reject(new Error(\"incompatible file!\"));\n                        return;\n                    }\n                    let [obj, o1] = bSaver.Buffer2Object(b, o);\n                    let [f32, _] = bSaver.Buffer2Float32Mat(b, o1);\n                    resolve([obj, f32]);\n                });\n            });\n        }\n    };\n\n    // midi文件\n    this.midiFile = {\n        export: {\n            UI() {\n                let tempDiv = document.createElement('div');\n                tempDiv.innerHTML = `\n<div class=\"request-cover\">\n<div class=\"card hvCenter\" style=\"overflow: visible;\">\n    <div class=\"fr\" style=\"align-items: center;\">\n        <label class=\"title\">导出为midi</label>\n        <span style=\"flex:1\"></span>\n        <button class=\"ui-cancel\">❌</button>\n    </div>\n    <ul class=\"btn-ul layout-first\">\n        <li class=\"layout dim-text\" style=\"flex-direction: column;\">\n            <button class=\"ui-confirm labeled\" data-tooltip=\"可用于制谱；可能会损失、扭曲一些信息\">节奏量化对齐</button>\n            <div class=\"fr layout-first\" style=\"align-items: center;\">\n                <span class=\"labeled\" data-tooltip=\"越大越逼近听感，越小越规整\\n若节奏已经精准，建议增大\">对齐精度</span>\n                <input type=\"number\" value=\"4\" min=\"2\" max=\"12\" style=\"width: 2em;\">\n            </div>\n        </li>\n        <li class=\"layout dim-text\"><button class=\"ui-confirm labeled\" data-tooltip=\"保证播放起来和这里一模一样，但丢失节奏信息\\n适用于合成音频\">和听起来一样</button></li>\n        <li class=\"layout\"><label>仅导出可见音轨<input type=\"checkbox\"></label></li>\n    </ul>\n</div>\n</div>`;\n                const card = tempDiv.firstElementChild;\n                const close = () => { card.remove(); };\n                const checkbox = card.querySelector('input[type=\"checkbox\"]');\n                const btns = card.querySelectorAll('button');\n                btns[0].onclick = close;\n                btns[1].onclick = () => {;\n                    const alignRate = parseInt(card.querySelector('input[type=\"number\"]').value);\n                    const midi = this.beatAlign(checkbox.checked, alignRate);\n                    bSaver.saveArrayBuffer(midi.export(1), midi.name + '.mid');\n                    close();\n                };\n                btns[2].onclick = () => {\n                    const midi = this.keepTime(checkbox.checked);\n                    bSaver.saveArrayBuffer(midi.export(1), midi.name + '.mid');\n                    close();\n                };\n                document.body.insertBefore(card, document.body.firstChild);\n                card.tabIndex = 0;\n                card.focus();\n            },\n            /**\n             * 100%听感还原扒谱结果，但节奏是乱的\n             */\n            keepTime(onlyVisible = false) {\n                const accuracy = 10;\n                const newMidi = new midi(60, [4, 4], Math.round(1000 * accuracy / parent.dt), [], parent.AudioPlayer.name);\n                const mts = [];\n                for (const ch of parent.synthesizer.channel) {\n                    let mt = newMidi.addTrack();\n                    mt.addEvent(midiEvent.instrument(0, ch.instrument));\n                    mt._volume = ch.volume;\n                    mts.push(mt);\n                }\n                for (const nt of parent.MidiAction.midi) {\n                    if (onlyVisible && !parent.MidiAction.channelDiv.channel[nt.ch].visible) continue;\n                    const midint = nt.y + 24;\n                    let v = mts[nt.ch]._volume;\n                    if (nt.v) v = Math.min(127, v * nt.v / 127);\n                    mts[nt.ch].addEvent(midiEvent.note(nt.x1 * accuracy, (nt.x2 - nt.x1) * accuracy, midint, v));\n                } return newMidi;\n            },\n            beatAlign(onlyVisible = false, alignRate = 2) {\n                alignRate = Math.max(Math.round(alignRate), 2);\n                // 初始化midi\n                let begin = parent.BeatBar.beats[0];\n                let lastbpm = begin.bpm;    // 用于自适应bpm\n                let lastPattern = `${begin.beatNum}/${begin.beatUnit}`;\n                const newMidi = new midi(lastbpm, [begin.beatNum, begin.beatUnit], 480, [], parent.AudioPlayer.name);\n                const mts = [];\n                for (const ch of parent.synthesizer.channel) {\n                    let mt = newMidi.addTrack();\n                    mt.addEvent(midiEvent.instrument(0, ch.instrument));\n                    mt._volume = ch.volume;\n                    mts.push(mt);\n                }\n                // 将每个音符拆分为两个时刻\n                const Midis = parent.MidiAction.midi;\n                const mlen = Midis.length << 1;\n                const moment = new Array(mlen);\n                for (let i = 0, j = 0; i < mlen; j++) {\n                    const nt = Midis[j];\n                    let duration = nt.x2 - nt.x1;\n                    let midint = nt.y + 24;\n                    let v = mts[nt.ch]._volume;\n                    if (nt.v) v = Math.min(127, v * nt.v / 127);\n                    moment[i++] = new midiEvent({\n                        _d: duration,\n                        ticks: nt.x1,\n                        code: 0x9,\n                        value: [midint, v],\n                        _ch: nt.ch\n                    }, true);\n                    moment[i++] = new midiEvent({\n                        _d: duration,\n                        ticks: nt.x2,\n                        code: 0x9,\n                        value: [midint, 0],\n                        _ch: nt.ch\n                    }, true);\n                } moment.sort((a, b) => a.ticks - b.ticks);\n                // 对每个小节进行对齐\n                let m_i = 0;    // moment的指针\n                let tickNow = 0;    // 维护总时长\n                for (const measure of parent.BeatBar.beats) {\n                    if (m_i == mlen) break;\n\n                    //== 判断小节是否变化 假设小节之间bpm相关性很强 ==//\n                    const bpmnow = measure.bpm;\n                    if (Math.abs(bpmnow - lastbpm) > lastbpm * 0.065) {\n                        mts[0].events.push(midiEvent.tempo(tickNow, bpmnow * 4 / measure.beatUnit));\n                    } lastbpm = bpmnow;\n                    const _ptn = `${measure.beatNum}/${measure.beatUnit}`;\n                    if (lastPattern !== _ptn) {\n                        mts[0].events.push(midiEvent.time_signature(tickNow, measure.beatNum, measure.beatUnit));\n                    } lastPattern = _ptn;\n\n                    //== 对齐音符 ==//\n                    const begin = measure.start / parent.dt;   // 转换为以“格”为单位\n                    const end = (measure.interval + measure.start) / parent.dt;\n                    // 一个八音符的格数\n                    const aot = measure.interval * measure.beatUnit / (measure.beatNum * 8 * parent.dt);\n                    while (m_i < mlen) {\n                        const n = moment[m_i];\n                        if (n.ticks > end) break;    // 给下一小节\n                        m_i++;\n                        if (onlyVisible && !parent.MidiAction.channelDiv.channel[n._ch].visible) continue;\n                        const threshold = n._d / alignRate;\n                        let accuracy = aot;\n                        while (accuracy > threshold) accuracy /= 2;\n                        n.ticks = tickNow + ((Math.round((n.ticks - begin) / accuracy) * newMidi.tick * accuracy / aot) >> 1);\n                        mts[n._ch].events.push(n);\n                    } tickNow += newMidi.tick * measure.beatNum * 4 / measure.beatUnit;\n                } return newMidi;\n            }\n        },\n        /* 由于小节的数据结构，变速只能发生在小节开头\n        如果考虑节奏，则需要将小节内变速全部忽略\n        */\n        import(file) {\n            bSaver.readBinary(file, (data) => {\n                let m;\n                try {\n                    m = midi.import(new Uint8Array(data)).JSON();\n                } catch (error) {\n                    console.error(\"Error importing MIDI:\", error);\n                    alert(\"导入MIDI文件时出错\");\n                    return;\n                }\n                const chdiv = parent.MidiAction.channelDiv;\n                chdiv.switchUpdateMode(false);  // 下面会一次性创建大量音符，所以先关闭更新\n                let tickTimeTable = m.header.tempos ?? [{\n                    ticks: 0, bpm: 120\n                }];\n\n                if (confirm(\"是否使用该MIDI的节奏?\")) { // 对齐变速和节奏\n                    // 将节奏型和变速事件合并排序\n                    let rhy = [{ticks: -1, timeSignature: [4, 4]}, ...tickTimeTable, ...m.header.timeSignatures];\n                    rhy.sort((a, b) => a.ticks - b.ticks);\n                    rhy[0].ticks = 0;\n                    // 合并时间相同的\n                    let combined = [];\n                    for (let i = 0; i < rhy.length; i++) {\n                        const t = rhy[i].ticks;\n                        let timeSignature = rhy[i].timeSignature;\n                        let bpm = rhy[i].bpm;\n                        let j = i + 1;\n                        while (j < rhy.length && rhy[j].ticks == t) {\n                            bpm = rhy[j].bpm ?? bpm;    // 使用最新值\n                            timeSignature = rhy[j].timeSignature ?? timeSignature;\n                            j++;\n                        }\n                        combined.push({\n                            ticks: t,\n                            bpm: bpm,\n                            timeSignature: timeSignature\n                        });\n                        i = j - 1;\n                    }\n                    // 为中间变速的情况创建小节并分配id\n                    combined[0].id = 0;\n                    for (let i = 1; i < combined.length; i++) {\n                        const c = combined[i];\n                        let j = i - 1;\n                        let last = combined[j];\n                        const ticksPerBar = m.header.tick * last.timeSignature[0] * 4 / last.timeSignature[1];\n                        if (c.timeSignature) {\n                            // 理论上小节改变不会出现在小节中 但为了兼容奇怪的MIDI需要微调\n                            // 四舍五入到最近的小节开始位置\n                            const bars = Math.round((c.ticks - last.ticks) / ticksPerBar);\n                            c.id = bars + last.id;\n                            const dt = last.ticks + bars * ticksPerBar - c.ticks;\n                            if (dt === 0) continue;\n                            // 平移后面所有事件\n                            for (const mt of m.tracks) {\n                                const notes = mt.notes;\n                                // 找到第一个ticks大于等于c.ticks的事件\n                                let idx = notes.findIndex(ev => ev.ticks >= c.ticks);\n                                if (idx === -1) continue;\n                                for (let k = idx; k < notes.length; k++) notes[k].ticks += dt;\n                            }\n                            for (let k = i; k < combined.length; k++) combined[k].ticks += dt;\n                        } else {\n                            // 如果节奏改变出现在小节中：\n                            // 前1/2: 放到小节头; 后1/2: 放到下一个小节头\n                            // 总是创建小节\n                            while (c.ticks < last.ticks) last = combined[--j];\n                            const bars = Math.floor((c.ticks - last.ticks) / ticksPerBar);\n                            const offset = c.ticks - last.ticks - bars * ticksPerBar;\n                            c.timeSignature = last.timeSignature;\n                            if (offset < (ticksPerBar >> 1)) {\n                                c.id = last.id + bars;\n                                c.ticks = last.ticks + bars * ticksPerBar;\n                            } else {\n                                c.id = last.id + bars + 1;\n                                c.ticks = last.ticks + (bars + 1) * ticksPerBar;\n                            }\n                        }\n                    }\n                    // 合并id相同的小节\n                    rhy.length = 0;\n                    let lastbpm = 120, lastTimeSignature = [4, 4];\n                    for (let i = 0; i < combined.length; i++) {\n                        const c = combined[i];\n                        c.bpm ??= lastbpm;\n                        c.timeSignature ??= lastTimeSignature;\n                        let j = i + 1;\n                        while (j < combined.length && combined[j].id == c.id) {\n                            c.bpm = combined[j].bpm ?? c.bpm;\n                            c.timeSignature = combined[j].timeSignature ?? c.timeSignature;\n                            j++;\n                        } rhy.push(c);\n                        i = j - 1;\n                        lastbpm = c.bpm;\n                        lastTimeSignature = c.timeSignature;\n                    } tickTimeTable = rhy;\n                    // 设置节奏\n                    const beats = parent.BeatBar.beats;\n                    beats.length = 0;\n                    for (const t of tickTimeTable) {\n                        const msPerMeasure = 240000 * t.timeSignature[0] / (t.timeSignature[1] * t.bpm);\n                        beats.push(new eMeasure(\n                            t.id, -1, t.timeSignature[0], t.timeSignature[1], msPerMeasure\n                        ));\n                    } beats.check();\n                }\n\n                const chArray = [];\n                let chArrayIndex = 0;\n                for (const mt of m.tracks) {\n                    if (mt.notes.length == 0) continue;\n                    let tickTimeIdx = -1;\n                    let startTick = 0;\n                    let nexttickTimeChange = 0;\n                    let tickTime = 0;   // 一个tick的毫秒数/parent.dt\n                    let msBefore = 0;   // 用parent.dt归一化后的之前的时间\n                    let _timeOffset = 0;\n                    const checkChange = (tick) => {\n                        while (tick >= nexttickTimeChange) {\n                            msBefore += (nexttickTimeChange - startTick) * tickTime;\n                            tickTimeIdx++;\n                            startTick = nexttickTimeChange;\n                            nexttickTimeChange = tickTimeTable[tickTimeIdx + 1]?.ticks ?? Infinity;\n                            tickTime = 60000 / (tickTimeTable[tickTimeIdx].bpm * m.header.tick * parent.dt);\n                            _timeOffset = msBefore - startTick * tickTime;\n                        } return tickTime;\n                    }; checkChange(1);\n\n                    const ch = chdiv.addChannel();\n                    if (!ch) break; // 音轨已满，addChannel会返回undefined同时alert，所以只要break\n                    const chid = ch.index;\n                    ch.name = `导入音轨${chid}`;\n                    ch.ch.instrument = mt.instruments[0]?.number || 0;\n                    ch.instrument = TinySynth.instrument[ch.ch.instrument];\n\n                    // 音符强度归一化到0-127 演奏和导出时用的是“通道音量*音符音量/127”\n                    let maxIntensity = mt.notes.reduce((a, b) => a.intensity > b.intensity ? a : b).intensity;\n                    ch.ch.volume = maxIntensity;\n\n                    chArray[chArrayIndex++] = mt.notes.map((nt) => {\n                        let t = checkChange(nt.ticks + 1);\n                        const start = _timeOffset + nt.ticks * t;\n                        const endTick = nt.ticks + nt.durationTicks;\n                        let end;\n                        if (endTick > nexttickTimeChange) { // 跨变速区间\n                            // 暂存状态\n                            const store = [tickTimeIdx, startTick, nexttickTimeChange, tickTime, msBefore, _timeOffset];\n                            t = checkChange(nt.ticks + nt.durationTicks + 1);\n                            end = _timeOffset + endTick * t;\n                            // 恢复状态\n                            [tickTimeIdx, startTick, nexttickTimeChange, tickTime, msBefore, _timeOffset] = store;\n                        } else end = _timeOffset + endTick * t;\n                        return {    // 理应给x1和x2取整，但是为了尽量不损失信息就不取整了 不取整会导致导出midi时要取整\n                            // x1: msBefore + (nt.ticks - startTick) * t,\n                            x1: start,\n                            x2: end,\n                            y: nt.midi - 24,\n                            ch: chid,\n                            selected: false,\n                            v: nt.intensity / maxIntensity * 127\n                        };\n                    });\n                }\n                for (const ch of chArray) parent.MidiAction.midi.push(...ch);\n                parent.MidiAction.midi.sort((a, b) => a.x1 - b.x1);\n                chdiv.switchUpdateMode(true, true, 0b111);   // 打开更新并一次性处理积压请求\n            });\n        },\n    }\n}"
  },
  {
    "path": "core/app_keyboard.js",
    "content": "/// <reference path=\"../dataProcess/analyser.js\" />\n\n/**\n * 左侧键盘\n * 会使用 parent.keyboard 画布\n * @param {App} parent \n */\nfunction _Keyboard(parent) {\n    /**\n     * 选中了哪个音，音的编号以midi协议为准（C1序号为24）\n     * 更新链: 'onmousemove' -> parent.mouseY setter -> this.highlight\n     */\n    this.highlight = -1;\n    this.harmonics = [0];\n    Object.defineProperty(this, 'Harmonics', {\n        get() { return this.harmonics.length; },\n        set(n) {// 建议n<=6\n            n = Math.max(0, n | 0);\n            if (n == this.Harmonics) return;\n            this.harmonics = Array.from({ length: n }, (_, i) => Math.round(12 * Math.log2(i + 1)));\n        }\n    });\n    this.freqTable = new FreqTable(440);    // 在parent.Analyser.stft中更新\n\n    // 以下为画键盘所需\n    const _idchange = new Int8Array([2, 2, 1, 2, 2, 2, -10, 2, 3, 2, 2, 2]);    // id变化\n    const _ychange = new Float32Array(12);    // 纵坐标变化，随this.height一起变化\n    this.setYchange = (h) => {  // 需注册到parent.height setter中 且需要一次立即的更新（在parent中实现）\n        _ychange.set([\n            -1.5 * h, -2 * h, -1.5 * h, -1.5 * h, -2 * h, -2 * h, -1.5 * h,\n            -2 * h, -3 * h, -2 * h, -2 * h, -2 * h\n        ]);\n    };\n\n    /**\n     * 仅当: 视野垂直变化 或 this.highlight 更改 时需要更新\n     * 是否更新的判断 交给parent完成\n     */\n    this.render = () => {\n        // 绘制频谱区音符高亮\n        const actionCtx = parent.layers.action.ctx;\n        actionCtx.fillStyle = \"#ffffff4f\";\n        for (let i = this.Harmonics - 1; i >= 0; i--) {\n            let noteY = parent.layers.height - (this.highlight - 24 + this.harmonics[i]) * parent._height + parent.scrollY;\n            if (noteY < 0) continue;\n            actionCtx.fillRect(0, noteY, parent.layers.width, -parent._height);\n        }\n\n        const ctx = parent.keyboard.ctx;\n        const w = parent.keyboard.width;\n        const w2 = w * 0.618;\n        ctx.fillStyle = '#fff';\n        ctx.fillRect(0, 0, w, parent.keyboard.height);\n\n        let noteID = parent.idYstart + 24;  // 最下面对应的音的编号\n        const note = noteID % 12;           // 一个八度中的第几个音\n        let baseY = parent.rectYstart + note * parent._height;  // 这个八度左下角的y坐标\n        noteID -= note;                     // 这个八度C的编号\n\n        while (true) {\n            ctx.beginPath();    // 必须写循环内\n            ctx.fillStyle = 'orange';\n            for (let i = 0, rectY = baseY, id = noteID; i < 7 & rectY > 0; i++) {   // 画白键\n                let dy = _ychange[i];\n                if (this.highlight == id) ctx.fillRect(0, rectY, w, dy);   // 被选中的\n                ctx.moveTo(0, rectY);   // 画线即可 下划线\n                ctx.lineTo(w, rectY);\n                rectY += dy;\n                id += _idchange[i];\n            } ctx.stroke();\n            // 写音阶名\n            ctx.fillStyle = \"black\"; ctx.fillText(Math.floor(noteID / 12) - 1, w - parent._height * 0.75, baseY - parent._height * 0.3);\n            baseY -= parent._height; noteID++;\n            for (let i = 7; i < 12; i++) {\n                if (this.highlight == noteID) {    // 考虑到只要画一次高亮，不必每次都改fillStyle\n                    ctx.fillStyle = '#Ffa500ff';\n                    ctx.fillRect(0, baseY, w2, -parent._height);\n                    ctx.fillStyle = 'black';\n                } else ctx.fillRect(0, baseY, w2, -parent._height);\n                baseY += _ychange[i];\n                noteID += _idchange[i];\n                if (baseY < 0) return;\n            }\n        }\n    };\n    // 鼠标点击后发声\n    this.mousedown = () => {\n        let ch = parent.MidiAction.channelDiv.selected;\n        if (!ch || ch.mute) return;\n        ch = ch ? ch.ch : parent.synthesizer;\n        let nt = ch.play({ f: this.freqTable[this.highlight - 24] });\n        let last = this.highlight;     // 除颤\n        const tplay = parent.audioContext.currentTime;\n        const move = () => {\n            if (last === this.highlight) return;\n            last = this.highlight;\n            let dt = parent.audioContext.currentTime - tplay;\n            parent.synthesizer.stop(nt, dt > 0.3 ? 0 : dt - 0.3);\n            nt = ch.play({ f: this.freqTable[this.highlight - 24] });\n        }; document.addEventListener('mousemove', move);\n        const up = () => {\n            let dt = parent.audioContext.currentTime - tplay;\n            parent.synthesizer.stop(nt, dt > 0.5 ? 0 : dt - 0.5);\n            document.removeEventListener('mousemove', move);\n            document.removeEventListener('mouseup', up);\n        }; document.addEventListener('mouseup', up);\n    };\n}"
  },
  {
    "path": "core/app_midiaction.js",
    "content": "/// <reference path=\"../ui/channelDiv.js\" />\n\n/**\n * 管理用户在钢琴卷帘上的动作\n * @param {App} parent \n */\nfunction _MidiAction(parent) {\n    this.clickX = 0;    // 绝对坐标 单位像素\n    this.clickYid = 0;  // 离散坐标 单位离散格\n\n    this.mode = 0;      // 0: 笔模式 1: 选择模式\n    this.frameMode = 0; // 0: 框选 1: 列选 2: 行选\n    this.frameXid = -1; // 框选的终点的X序号(Y序号=this.Keyboard.highlight-24) 此变量便于绘制 如果是负数则不绘制\n\n    this.alphaIntensity = true; // 绘制音符时是否根据音量使用透明度\n\n    this.snapMode = 1;   // 0: 不吸附 1: 吸附到网格线 -1: 吸附到小节线\n    /**\n     * 根据snapMode吸附x坐标到不同的位置\n     * @param {number} x x是全局位置 单位:像素\n     * @returns [l, r] 除以 parent.width 后是相对于谱面起点的坐标，和最短的下一个位置\n     */\n    this.snapRound = (x) => {\n        // 最短为一个像素\n        if (this.snapMode == 0) return [x / parent._width, (x + 1) / parent._width];\n        // 最短一格\n        if (this.snapMode == 1) {\n            let i = x / parent._width | 0;\n            return [i, i + 1];\n        }\n        // 小节吸附\n        const m = parent.BeatBar.beats.getMeasure(Math.max(0, x * parent.TperP), true);\n        const start = m.start * parent.PperT;\n        const Interval = m.interval * parent.PperT;\n        const dp = Interval / m.beatNum;\n        // 没有细分\n        if (dp < parent.BeatBar.minInterval) return [start, start + Interval];\n        // 细分 和_BeatBar.render的逻辑一致\n        const noteNum = 1 << Math.log2(dp / parent.BeatBar.minInterval);\n        const subDp = dp / noteNum;\n        const n = ((x - start) / subDp | 0) * subDp + start;\n        return [n / parent._width, (n + subDp) / parent._width];\n    };\n\n    /* 一个音符 = {\n        y: 离散 和spectrum的y一致\n        x1: 离散 起点\n        x2: 离散 终点\n        ch: 音轨序号\n        selected: 是否选中\n        v: 音量，0~127，用户创建的音符无此选项，但导入的midi有 需要undefined兼容\n    } */\n    this.selected = []; // 选中的音符 无序即可\n    this.midi = [];     // 所有音符 需要维护有序性\n\n    var _anyAction = false; // 用于在选中多个后判断松开鼠标时应该如何处理选中\n\n    if (!parent.synthesizer) throw new Error('MidiAction requires a synthesizer to be created.');\n    const cd = this.channelDiv = new ChannelList(document.getElementById('funcSider'), parent.synthesizer);\n    // 导入midi时创建音轨不应该update，而是应该在音符全创建完成后存档\n    cd.updateCount = -1;    // -1表示需要update 否则表示禁用更新但记录了请求次数\n    cd.switchUpdateMode = (state, forceUpdate = false, type = 0b11) => { // 控制音轨的更新\n        if (state) {    // 切换回使能update\n            if (cd.updateCount > 0 || forceUpdate) {    // 如果期间有更新请求\n                this.updateView();\n                parent.snapshot.save(type);\n            } cd.updateCount = -1;\n        } else if (cd.updateCount < 0) {    // 如果是从true切换为false\n            cd.updateCount = 0;\n        }\n    }\n    const updateOnReorder = () => {\n        if (cd.updateCount < 0) {\n            this.updateView();\n            parent.snapshot.save(0b11);\n        } else cd.updateCount++;\n    };\n    /**\n     * 触发add和remove后也可能会触发reorder，取决于增删的是否是最后一项（见channelDiv.js）\n     * 故不是总能触发reorder的更新存档功能updateOnReorder\n     * 而更新与存档必须在reorder之后，因为reorder会重新映射channel\n     * 为了避免重复存档，需要暂时屏蔽reorder的存档功能\n     * 等到reorder之后一定会发生的added和removed事件触发后再恢复\n     */\n    const resumeReroderCallback = () => {\n        updateOnReorder();  // 稳定触发\n        cd.addEventListener('reorder', updateOnReorder);\n    };\n\n    cd.addEventListener('reorder', ({ detail }) => {\n        for (const nt of this.midi) nt.ch = detail[nt.ch];\n    }); // 重新映射音符 更新视图在updateOnReorder中\n    cd.addEventListener('reorder', updateOnReorder);\n\n    cd.addEventListener('remove', ({ detail }) => {\n        this.midi = this.midi.filter((nt) => nt.ch != detail.index);\n        this.selected = this.selected.filter((nt) => nt.ch != detail.index);\n        cd.removeEventListener('reorder', updateOnReorder);\n    });\n    cd.addEventListener('removed', resumeReroderCallback);\n\n    cd.addEventListener('add', () => {\n        cd.removeEventListener('reorder', updateOnReorder);\n    });\n    cd.addEventListener('added', resumeReroderCallback);\n\n    const saveOnStateChange = () => {\n        parent.snapshot.save(0b1);\n    }\n    cd.container.addEventListener('lock', ({ target }) => {\n        this.selected = this.selected.filter((nt) => {\n            if (nt.ch == target.index) return nt.selected = false;\n            return true;\n        });\n    });\n    cd.container.addEventListener('lock', saveOnStateChange);\n    // cd.container.addEventListener('visible', saveOnStateChange);    // visible会联动lock，因此无需存档\n    cd.container.addEventListener('mute', saveOnStateChange);\n    cd.addEventListener('setted', saveOnStateChange);\n\n    this.insight = [];  // 二维数组，每个元素为一个音轨视野内的音符 音符拾取依赖此数组\n    /**\n     * 更新this.MidiAction.insight\n     * 步骤繁琐，不必每次更新。触发时机:\n     * 1. channelDiv的reorder、added、removed，实际为updateOnReorder和switchUpdateMode\n     * 2. midi的增加、移动、改变长度（用户操作）。由于都会调用且最后调用changeNoteY，所以只需要在changeNoteY中调用\n     * 3. scroll2\n     * 4. midi的删除（用户操作）：deleteNote\n     * 5. ctrlZ、ctrlY、ctrlV\n     */\n    this.updateView = () => {\n        const m = this.midi;\n        const channel = Array.from(this.channelDiv.channel, () => []);\n        this.insight = channel;\n        // 原来用的二分有bug，所以干脆全部遍历\n        for (const nt of m) {\n            if (nt.x1 >= parent.idXend) break;\n            if (nt.x2 < parent.idXstart) continue;\n            if (nt.y < parent.idYstart || nt.y >= parent.idYend) continue;\n            channel[nt.ch].push(nt);\n        }\n        // midi模式下，视野要比音符宽一页，或超出视野半页\n        if (parent.midiMode) {\n            const currentLen = parent.Spectrogram.spectrogram.length;\n            const apage = parent.layers.width / parent._width;\n            let minLen = (m.length ? m[m.length - 1].x2 : 0) + apage * 1.5 | 0;\n            let viewLen = parent.idXstart + apage | 0;    // 如果视野在很外面，需要保持视野\n            if (viewLen > minLen) minLen = viewLen;\n            if (minLen != currentLen) parent.Spectrogram.spectrogram.length = minLen;   // length触发audio.duration和this.xnum\n        }\n        parent.layers.action.dirty = true;\n    };\n    this.render = () => {     // 按照insight绘制音符\n        const m = this.insight;\n        const s = parent.layers.action.ctx;\n        const c = this.channelDiv.channel;\n        for (let ch = m.length - 1; ch >= 0; ch--) {\n            if (m[ch].length === 0 || !c[ch].visible) continue;\n            let ntcolor = c[ch].color;\n            if (c[ch].lock) s.setLineDash([5, 5]);\n            for (const note of m[ch]) {\n                const params = [note.x1 * parent._width - parent.scrollX, parent.layers.height - note.y * parent._height + parent.scrollY, (note.x2 - note.x1) * parent._width, -parent._height];\n                if (note.selected) {\n                    s.fillStyle = '#ffffff';\n                    s.fillRect(...params);\n                    s.strokeStyle = ntcolor;\n                    s.strokeRect(...params);\n                } else {\n                    if (this.alphaIntensity && note.v) {\n                        s.fillStyle = ntcolor + Math.round(note.v ** 2 * 0.01581).toString(16);   // 平方律显示强度\n                    } else s.fillStyle = ntcolor;\n                    s.fillRect(...params);\n                    s.strokeStyle = '#ffffff';\n                    s.strokeRect(...params);\n                }\n            }\n            s.setLineDash([]);\n        } if (!this.mode || this.frameXid < 0) return;\n        // 绘制框选动作\n        s.fillStyle = '#f0f0f088';\n        const clickXid = this.clickX / parent._width | 0;\n        let [xmin, xmax] = clickXid <= this.frameXid ? [clickXid, this.frameXid + 1] : [this.frameXid, clickXid + 1];\n        const Y = parent.Keyboard.highlight - 24;\n        let [ymin, ymax] = Y <= this.clickYid ? [Y, this.clickYid + 1] : [this.clickYid, Y + 1];\n        let x1, x2, y1, y2;\n        if (this.frameMode == 1) {  // 列选\n            x1 = xmin * parent._width - parent.scrollX;\n            x2 = (xmax - xmin) * parent._width;\n            y1 = 0;\n            y2 = parent.layers.height;\n        } else if (this.frameMode == 2) {   // 行选\n            x1 = 0;\n            x2 = parent.layers.width;\n            y1 = parent.layers.height - ymax * parent._height + parent.scrollY;\n            y2 = (ymax - ymin) * parent._height;\n        } else {    // 框选\n            x1 = xmin * parent._width - parent.scrollX;\n            x2 = (xmax - xmin) * parent._width;\n            y1 = parent.layers.height - ymax * parent._height + parent.scrollY;\n            y2 = (ymax - ymin) * parent._height;\n        } s.fillRect(x1, y1, x2, y2);\n    };\n    /**\n     * 删除选中的音符 触发updateView\n     * @param {boolean} save 是否存档\n     */\n    this.deleteNote = (save = true) => {\n        this.selected.forEach((v) => {\n            let i = this.midi.indexOf(v);\n            if (i != -1) this.midi.splice(i, 1);\n        });\n        this.selected.length = 0;\n        if (save) parent.snapshot.save(0b10);\n        this.updateView();\n    };\n    this.clearSelected = () => {  // 取消已选\n        this.selected.forEach(v => { v.selected = false; });\n        this.selected.length = 0;\n    };\n\n    var _tempdy = 0;\n    this.changeNoteY = () => {  // 要求在trackMouse之后添加入spectrum的mousemoveEnent\n        _anyAction = true;\n        let dy = parent.Keyboard.highlight - 24 - this.clickYid;\n        this.selected.forEach((v) => { v.y += dy - _tempdy; });\n        _tempdy = dy;\n        this.updateView();\n    };\n\n    // 记录操作音符时之前的值 由于changeNoteX和changeNoteDuration 互斥，因此共用\n    var prevValue = null;\n    /**\n     * 改变选中的音符的时长 需要保证和changeNoteX同时只能使用一个\n     * @param {MouseEvent} e \n     */\n    this.changeNoteDuration = (e) => {\n        _anyAction = true;\n        // 兼容窗口滑动，以绝对坐标进行运算\n        let dx = e.offsetX + parent.scrollX - this.clickX;\n        // 此时prevValue存的是音符的v2*width值\n        for (let i = 0; i < prevValue.length; i++) {\n            const v = this.selected[i];\n            const [l, r] = this.snapRound(prevValue[i] + dx);\n            if (v.x1 >= r) {\n                const [_, nr] = this.snapRound(v.x1 * parent._width);\n                v.x2 = nr;\n            } else v.x2 = r;\n        }\n    };\n    this.changeNoteX = (e) => { // 由this.onclick_L调用\n        _anyAction = true;\n        let dx = e.offsetX + parent.scrollX - this.clickX;\n        // 此时prevValue存的是音符的v1*width值\n        for (let i = 0; i < prevValue.length; i++) {\n            const v = this.selected[i];\n            const d = v.x2 - v.x1;\n            const [l, r] = this.snapRound(prevValue[i] + dx);\n            v.x1 = Math.max(0, l);\n            v.x2 = v.x1 + d;\n        }\n    };\n    // 封装事件管理\n    const startMove = () => {\n        prevValue = this.selected.map(v => v.x1 * parent._width);\n        parent.layerContainer.addEventListener('mousemove', this.changeNoteX);\n        parent.layerContainer.addEventListener('mousemove', this.changeNoteY);\n        const removeEvent = () => {\n            parent.layerContainer.removeEventListener('mousemove', this.changeNoteX);\n            parent.layerContainer.removeEventListener('mousemove', this.changeNoteY);\n            document.removeEventListener('mouseup', removeEvent);\n            this.midi.sort((a, b) => a.x1 - b.x1);   // 排序非常重要 因为查找被点击的音符依赖顺序\n            // 鼠标松开则存档\n            if (_anyAction) parent.snapshot.save(0b10);\n        }; document.addEventListener('mouseup', removeEvent);\n\n    };\n    const startDurationChange = () => {\n        prevValue = this.selected.map(v => v.x2 * parent._width);\n        parent.layerContainer.addEventListener('mousemove', this.changeNoteDuration);\n        parent.layerContainer.addEventListener('mousemove', this.changeNoteY);\n        const removeEvent = () => {\n            parent.layerContainer.removeEventListener('mousemove', this.changeNoteDuration);\n            parent.layerContainer.removeEventListener('mousemove', this.changeNoteY);\n            document.removeEventListener('mouseup', removeEvent);\n            // 鼠标松开则存档\n            if (_anyAction) parent.snapshot.save(0b10);\n        }; document.addEventListener('mouseup', removeEvent);\n    };\n    /**\n     * 框选音符的鼠标动作 由this.onclick_L调用\n     * 选中的标准：框住了音头\n     */\n    this.selectAction = (mode = 0) => {\n        const clickXid = this.clickX / parent._width | 0;   // 选择动作永远以格点为准\n        this.frameXid = clickXid; // 先置大于零，表示开始绘制\n        if (mode == 1) {    // 列选\n            parent.layerContainer.addEventListener('mousemove', parent.trackMouseX);\n            const up = () => {\n                parent.layerContainer.removeEventListener('mousemove', parent.trackMouseX);\n                document.removeEventListener('mouseup', up);\n                let ch = this.channelDiv.selected;\n                if (ch && !ch.lock) {\n                    ch = ch.index;\n                    let [xmin, xmax] = clickXid <= this.frameXid ? [clickXid, this.frameXid + 1] : [this.frameXid, clickXid + 1];\n                    for (const nt of this.midi) nt.selected = (nt.x1 >= xmin && nt.x1 < xmax && nt.ch == ch);\n                    this.selected = this.midi.filter(v => v.selected);\n                } this.frameXid = -1;\n            }; document.addEventListener('mouseup', up);\n        } else if (mode == 2) { // 行选\n            const up = () => {\n                document.removeEventListener('mouseup', up);\n                let ch = this.channelDiv.selected;\n                if (ch && !ch.lock) {\n                    ch = ch.index;\n                    const Y = parent.Keyboard.highlight - 24;\n                    let [ymin, ymax] = Y <= this.clickYid ? [Y, this.clickYid + 1] : [this.clickYid, Y + 1];\n                    for (const nt of this.midi) nt.selected = (nt.y >= ymin && nt.y < ymax && nt.ch == ch);\n                    this.selected = this.midi.filter(v => v.selected);\n                } this.frameXid = -1;\n            }; document.addEventListener('mouseup', up);\n        } else {    // 框选\n            parent.layerContainer.addEventListener('mousemove', parent.trackMouseX);\n            const up = () => {\n                parent.layerContainer.removeEventListener('mousemove', parent.trackMouseX);\n                document.removeEventListener('mouseup', up);\n                let ch = this.channelDiv.selected;\n                if (ch && !ch.lock) {\n                    ch = ch.index;\n                    const Y = parent.Keyboard.highlight - 24;\n                    let [xmin, xmax] = clickXid <= this.frameXid ? [clickXid, this.frameXid + 1] : [this.frameXid, clickXid + 1];\n                    let [ymin, ymax] = Y <= this.clickYid ? [Y, this.clickYid + 1] : [this.clickYid, Y + 1];\n                    for (const nt of this.midi) nt.selected = (nt.x1 >= xmin && nt.x1 < xmax && nt.y >= ymin && nt.y < ymax && nt.ch == ch);\n                    this.selected = this.midi.filter(v => v.selected);\n                } this.frameXid = -1;    // 表示不在框选\n            }; document.addEventListener('mouseup', up);\n        }\n    };\n    /**\n     * 添加音符的鼠标动作 由this.onclick_L调用\n     */\n    this.addNoteAction = () => {\n        if (!this.channelDiv.selected && !this.channelDiv.selectChannel(0)) return;   // 如果没有选中则默认第一个\n        if (this.channelDiv.selected.lock) return;    // 锁定的音轨不能添加音符\n        // 取消已选\n        this.clearSelected();\n        // 添加新音符，设置已选\n        const [x1, x2] = this.snapRound(this.clickX);\n        const note = {\n            y: this.clickYid,\n            x1, x2,\n            ch: this.channelDiv.selected.index,\n            selected: true\n        }; this.selected.push(note);\n        {   // 二分插入\n            let l = 0, r = this.midi.length;\n            while (l < r) {\n                let mid = (l + r) >> 1;\n                if (this.midi[mid].x1 < note.x1) l = mid + 1;\n                else r = mid;\n            } this.midi.splice(l, 0, note);\n        }\n        _anyAction = true;\n        this.updateView();\n        startDurationChange();\n    };\n    /**\n     * MidiAction所有鼠标操作都由此分配\n     */\n    this.onclick_L = (e) => {\n        //== step 1: 判断是否点在了音符上 ==//\n        _anyAction = false;\n        // 为了支持在鼠标操作的时候能滑动，记录绝对位置\n        _tempdy = 0;\n        const x = (this.clickX = e.offsetX + parent.scrollX) / parent._width;\n        if (x >= parent._xnum) {   // 越界\n            this.clearSelected(); return;\n        }\n        const y = this.clickYid = parent.Keyboard.highlight - 24;\n        // 找到点击的最近的音符 由于点击不经常，所以用遍历足矣 只需要遍历insight的音符\n        let n = null;\n        for (let ch_id = 0; ch_id < this.insight.length; ch_id++) {\n            const chitem = this.channelDiv.channel[ch_id]      // insight和channelDiv的顺序是一致的\n            if (!chitem.visible || chitem.lock) continue;   // 隐藏、锁定的音轨选不中\n            const ch = this.insight[ch_id];\n            // 每层挑选左侧最靠近的（如果有多个）\n            let distance = parent._width * parent._xnum;\n            for (const nt of ch) {  // 由于来自midi，因此每个音轨内部是有序的\n                let dis = x - nt.x1;\n                if (dis < 0) break;\n                if (y == nt.y && x < nt.x2) {\n                    if (dis < distance) {\n                        distance = dis;\n                        n = nt;\n                    }\n                }\n            } if (n) break; // 只找最上层的\n        }\n        if (!n) {   // 添加或框选音符 关于lock的处理在函数中\n            if (this.mode) this.selectAction(this.frameMode);\n            else this.addNoteAction();\n            return;\n        }\n        this.channelDiv.selectChannel(n.ch);\n        //== step 2: 如果点击到了音符，ctrl是否按下 ==/\n        if (e.ctrlKey) {        // 有ctrl表示多选\n            if (n.selected) {   // 已经选中了，取消选中\n                this.selected.splice(this.selected.indexOf(n), 1);\n                n.selected = false;\n            } else {            // 没选中，添加选中\n                this.selected.push(n);\n                n.selected = true;\n            } return;\n        }\n        //== step 3: 单选时，是否选中了多个(事关什么时候取消选中) ==//\n        if (this.selected.length > 1 && n.selected) {    // 如果选择了多个，在松开鼠标的时候处理选中\n            const up = () => {\n                if (!_anyAction) {    // 没有任何拖拽动作，说明为了单选\n                    this.selected.forEach(v => { v.selected = false; });\n                    this.selected.length = 0;\n                    n.selected = true;\n                    this.selected.push(n);\n                }\n                document.removeEventListener('mouseup', up);\n            }; document.addEventListener('mouseup', up);\n        } else {    // 只选一个\n            if (n.selected) {\n                const up = () => {\n                    if (!_anyAction) {    // 没有任何拖拽动作，说明为了取消选中\n                        this.selected.forEach(v => { v.selected = false; });\n                        this.selected.length = 0;\n                    } document.removeEventListener('mouseup', up);\n                }; document.addEventListener('mouseup', up);\n            } else {\n                this.selected.forEach(v => { v.selected = false; });\n                this.selected.length = 0;\n                n.selected = true;\n                this.selected.push(n);\n            }\n        }\n        //== step 4: 如果点击到了音符，添加移动事件 ==//\n        if (((e.offsetX + parent.scrollX) << 1) > (n.x2 + n.x1) * parent._width) {    // 靠近右侧，调整时长\n            startDurationChange();\n        } else {    // 靠近左侧，调整位置\n            startMove();\n        }\n    };\n}"
  },
  {
    "path": "core/app_midiplayer.js",
    "content": "/**\n * 管理用户绘制的midi的播放\n * @param {App} parent \n */\nfunction _MidiPlayer(parent) {\n    this.priorT = 1000 / 59;    // 实际稳定在60帧，波动极小\n    this.realT = 1000 / 59;\n    this._last = performance.now();\n    this.lastID = -1;\n    this.restart = (onlyBeat = false) => {\n        // 需要-1，防止当前时刻开始的音符不被播放\n        const msnow = parent.AudioPlayer.audio.currentTime * 1000;\n        if (!onlyBeat) this.lastID = ((msnow / parent.dt) | 0) - 1;\n        this._beatIter = parent.BeatBar.beats.iterator(msnow, true);\n        const p = this._beatIter.next();\n        if (p.done === false) {\n            const m = p.value;\n            this._beatNowEnds = m.start + m.interval;\n        } else {\n            this._beatNowEnds = -1;\n        }\n    };\n    this.update = () => {\n        // 一阶预测\n        let tnow = performance.now();\n        // 由于requestAnimationFrame在离开界面的时候会停止，所以要设置必要的限定\n        if (tnow - this._last < (this.priorT << 1)) this.realT = 0.2 * (tnow - this._last) + 0.8 * this.realT;   // IIR低通滤波\n        this._last = tnow;\n        if (parent.AudioPlayer.audio.paused) return;\n        const dt = 1e-3 / parent.AudioPlayer.audio.playbackRate;\n        const predictT = parent.time + 0.5 * (this.realT + this.priorT); // 先验和实测的加权和\n        const predictID = (predictT / parent.dt) | 0;\n        // 寻找(mp.lastID, predictID]之间的音符\n        const m = parent.MidiAction.midi;\n        if (m.length > 0) { // 二分查找要求长度大于0\n            let lastAt = m.length;\n            {   // 二分查找到第一个x1>mp.lastID的音符\n                let l = 0, r = lastAt - 1;\n                while (l <= r) {\n                    let mid = (l + r) >> 1;\n                    if (m[mid].x1 > this.lastID) {\n                        r = mid - 1;\n                        lastAt = mid;\n                    } else l = mid + 1;\n                }\n            }\n            for (; lastAt < m.length; lastAt++) {\n                const nt = m[lastAt];\n                if (nt.x1 > predictID) break;\n                if (parent.MidiAction.channelDiv.channel[nt.ch].mute) continue;\n                parent.synthesizer.play({\n                    id: nt.ch,\n                    f: parent.Keyboard.freqTable[nt.y],\n                    v: nt.v,    // 用户创建的音符不可单独调整音量，为undefined，会使用默认值\n                    t: (parent.time - nt.x1 * parent.dt) * dt,\n                    last: (nt.x2 - nt.x1) * parent.dt * dt\n                });\n            }\n        }\n        // 节拍播放\n        if (this._ifBeat && this._beatNowEnds > 0) {\n            const endms = this._beatNowEnds;\n            // 较为宽裕的时间判断\n            if (endms < predictT + this.priorT) {\n                this.playBeatSound(parent.audioContext.currentTime + (endms - parent.time) * dt);\n                const p = this._beatIter.next();\n                if (p.done === false) {\n                    const m = p.value;\n                    this._beatNowEnds = m.start + m.interval;\n                } else {\n                    this._beatNowEnds = -1;\n                }\n            }\n        }\n        this.lastID = predictID;\n    };\n\n    // 播放节拍\n    this._ifBeat = false;\n    this._beatIter = null;\n    this._beatNowEnds = -1;\n    this.switchBeatMode = (ifBeat) => {\n        this._ifBeat = ifBeat;\n        if (ifBeat === false) return;\n        this.initBeatSound().then(() => {\n            if (parent.AudioPlayer.audio.paused === false) this.restart(true);\n        });\n    };\n    this.beatBuffer = null;\n    this.initBeatSound = async () => {\n        if (this.beatBuffer) return;\n        try {\n            // 利用 fetch 转换 Base64 为 ArrayBuffer\n            const CLICK_SOUND_BASE64 = \"data:audio/mpeg;base64,SUQzBAAAAAABRlRFTkMAAAAMAAADT3JpZ2luYXRvcgBUWFhYAAAAKgAAA29yaWdpbmF0b3JfcmVmZXJlbmNlAE9yaWdpbmF0b3JSZWZlcmVuY2UAVERSQwAAAAwAAAMyMDAwOjAwOjAwAFRYWFgAAAAeAAADY29kaW5nX2hpc3RvcnkAQ29kaW5nSGlzdG9yeQBUWFhYAAAAEgAAA3RpbWVfcmVmZXJlbmNlADAAVFNTRQAAAA4AAANMYXZmNjIuNC4xMDAAAAAAAAAAAAAAAP/7UMAAAAAAAAAAAAAAAAAAAAAAAEluZm8AAAAPAAAAAgAAAnEAqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv//////////////////////////////////////////////////////////////////AAAAAExhdmM2Mi4xMwAAAAAAAAAAAAAAACQEWgAAAAAAAAJxo1jtAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+1DEAAAJTFdXNBSAAZig7j8woAD1QEAAAIAJQAUExuAC/vf4Qyc5oyMVo9UFYJgmCYJhsnB8EDkH38QA+UBCJAQBAEHMg+D/wffg4GC4Pg+7+oHz5QEP+UDHOf4IAhl6hqZmRkhAAA2Gw2GAwIAmkAHzrD7iq7X2AqopRMhZ060gz1e2F2Ng2m1AtBbGIrF+IwgRk5RPyEesIcvUwet9xkRllReab+aw4cTGp5rf5EyEI9IGY3///RCJomX/8Akgk06BXPUgABsYAFWM2a0N//tSxAUDy817Jv2FAAgAADSAAAAET0ApeqwoITVM6TNhUkXiVM41cLoCkA0DURhcgUQKINoiiZ6mkI9HpykJKab6mmmmzjjWOOepptc447mm6HHHfzjv6///////6Hf//oc+v//1NNIRqkxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=\";\n            const response = await fetch(CLICK_SOUND_BASE64);\n            const arrayBuffer = await response.arrayBuffer();\n            this.beatBuffer = await parent.audioContext.decodeAudioData(arrayBuffer);\n        } catch (e) {\n            alert(\"节拍音频解码失败:\", e);\n        }\n    };\n    this.playBeatSound = (time = 0) => {\n        if (!this.beatBuffer) return;\n        const source = parent.audioContext.createBufferSource();\n        source.buffer = this.beatBuffer;\n        source.connect(parent.audioContext.destination);\n        source.start(time);\n    };\n}"
  },
  {
    "path": "core/app_spectrogram.js",
    "content": "/**\n * 管理频谱显示\n * 会使用 parent.layers.spectrum 画布\n * @param {App} parent \n */\nfunction _Spectrogram(parent) {\n    this.colorStep1 = 90;\n    this.colorStep2 = 240;\n\n    this._multiple = parseFloat(document.getElementById('multiControl').value);  // 幅度的倍数\n    Object.defineProperty(this, 'multiple', {\n        get: function() { return this._multiple; },\n        set: function(m) {\n            this._multiple = m;\n            parent.layers.spectrum.dirty = true;\n        }\n    });\n\n    this._contrast = parseFloat(document.getElementById('contrastControl').value);  // 对比度\n    Object.defineProperty(this, 'contrast', {\n        get: function() { return this._contrast; },\n        set: function(c) {\n            this._contrast = c;\n            parent.layers.spectrum.dirty = true;\n        }\n    });\n\n    this._Hmultiple = 1;  // 谐波的倍数\n    Object.defineProperty(this, 'Hmultiple', {\n        get: function() { return this._Hmultiple; },\n        set: function(m) {\n            this._Hmultiple = m;\n            parent.layers.spectrum.dirty = true;\n        }\n    });\n\n    this._spectrogram = null;   // .raw属性为底层一维buffer\n    Object.defineProperty(this, 'spectrogram', {\n        get: function() { return this._spectrogram; },\n        set: function(s) {\n            if (!s) {\n                this._spectrogram = this.harmonic = null;\n                parent.xnum = 0;\n            } else {\n                if (s.raw != this._spectrogram?.raw) {\n                    this._spectrogram = s;\n                    this.harmonic = null;\n                }\n                parent.xnum = s.length;\n                parent.scroll2();\n            }\n        }\n    });\n\n    this.harmonic = null;  // 对谐波的估计 在parent.Analyser._reduceHarmonic中计算得到\n\n    this.getColor = (value) => {    // 0-step1，是蓝色的亮度从0变为50%；step1-step2，是颜色由蓝色变为红色；step2-255，保持红色\n        value = value || 0; // 防NaN\n        if (value < 0) value = 0;\n        let hue = 0, lightness = 50;    // Red hue\n        if (value <= this.colorStep1) {\n            hue = 240;  // Blue hue\n            lightness = (value / this.colorStep1) * 50; // Lightness from 0% to 50%\n        } else if (value <= this.colorStep2) {\n            hue = 240 - ((value - this.colorStep1) / (this.colorStep2 - this.colorStep1)) * 240;\n        } return `hsl(${hue}, 100%, ${lightness}%)`;\n    };\n    // 预计算颜色查找表\n    this.colorLUT = ((LUT_SIZE = 384) => {\n        const c = new OffscreenCanvas(LUT_SIZE, 1);\n        const ctx = c.getContext('2d', { alpha: false });\n        for (let i = 0; i < LUT_SIZE; i++) {\n            const value = (i / (LUT_SIZE - 1)) * 255;\n            ctx.fillStyle = this.getColor(value);\n            ctx.fillRect(i, 0, 1, 1);\n        }\n        const data = ctx.getImageData(0, 0, LUT_SIZE, 1).data;\n        // 检测平台字节序\n        const littleEndian = (function() {\n            const buf = new ArrayBuffer(4);\n            new DataView(buf).setUint32(0, 0x12345678, true);\n            return new Uint8Array(buf)[0] === 0x78;\n        })();\n        let u32 = new Uint32Array(LUT_SIZE);\n        u32.scale = (LUT_SIZE - 1) / 255;\n        for (let i = 0; i < LUT_SIZE; i++) {\n            const idx = i << 2;\n            const r = data[idx], g = data[idx + 1], b = data[idx + 2], a = 255;\n            // 小端: ARGB 大端: RGBA\n            u32[i] = littleEndian ? (a << 24) | (b << 16) | (g << 8) | r : (r << 24) | (g << 16) | (b << 8) | a;\n        } return u32;\n    })();\n    // 闭包存储\n    var imageData = null;\n    var dataCanvas = null;\n    this.onresize = () => { // 在parent.width / parent.height / parent.resize 中被调用\n        const canvas = parent.layers.spectrum;\n        const ctx = canvas.ctx;\n        // 实际视图的最大行列数\n        let cols = Math.ceil(canvas.width / parent._width) + 1, rows = Math.ceil(canvas.height / parent._height) + 1;\n        // 频谱列主序 这里存转置后的\n        imageData = ctx.createImageData(rows, cols);\n        ctx.imageSmoothingEnabled = parent._width < 1 || parent._height < 1;\n        imageData.u32 = new Uint32Array(imageData.data.buffer);\n        if (dataCanvas) {\n            dataCanvas.width = rows;\n            dataCanvas.height = cols;\n        } else {\n            dataCanvas = new OffscreenCanvas(rows, cols);\n            dataCanvas.ctx = dataCanvas.getContext('2d', { alpha: false });\n        }\n        ctx.strokeStyle = \"#FFFFFF\";    // 分界线颜色\n        ctx.fillStyle = '#25262d';      // 背景颜色\n    };\n    // 供外部调用的接口 返回一个可以用[][]访问的对象 值为最终计算结果\n    this.getCurrentSpectrum = () => {\n        const _this = this;\n        const view = {\n            length: this._spectrogram.length,\n            buffer: new Float32Array(this._spectrogram[0].length),\n            currentFrame: -1\n        };\n        return new Proxy(view, {\n            get(target, prop) {\n                if (prop in target) return target[prop];\n                const frameID = parseInt(prop);\n                if (isNaN(frameID) || frameID < 0 || frameID >= target.length) return undefined;\n                const b = target.buffer;\n                if (frameID === target.currentFrame) return b;\n                const s = _this._spectrogram[frameID];\n                const h = _this.harmonic?.[frameID];\n                if (h) for (let i = 0; i < b.length; i++) {\n                    let amp = s[i] - h[i] * _this._Hmultiple;\n                    b[i] = Math.pow(Math.max(0, amp), _this._contrast) * _this._multiple;\n                } else for (let i = 0; i < b.length; i++) {\n                    b[i] = Math.pow(Math.max(0, s[i]), _this._contrast) * _this._multiple;\n                }\n                target.currentFrame = frameID;\n                return b;\n            }\n        });\n    };\n    this.renderSpectrum = (ctx) => {\n        // 填充数据到imagerData 随spectrum的列主序\n        for (let frameID = parent.idXstart, x = 0, off = 0; frameID < parent.idXend; frameID++, x++, off += imageData.width) {\n            const s = this._spectrogram[frameID];\n            const h = this.harmonic?.[frameID];\n            for (let y = parent.idYstart, j = off; y < parent.idYend; y++, j++) {\n                let amp = s[y] - (h?.[y] ?? 0) * this._Hmultiple;\n                amp = Math.pow(Math.max(0, amp), this._contrast) * this._multiple;\n                const colorID = Math.min(this.colorLUT.length - 1, Math.round(amp * this.colorLUT.scale));\n                imageData.u32[j] = this.colorLUT[colorID];\n            }\n        } dataCanvas.ctx.putImageData(imageData, 0, 0);\n        // 把dataCanvas画到目标canvas上 drawImage 承担三个任务：旋转、缩放、偏移\n        ctx.save();\n        ctx.translate(0, 0); ctx.rotate(-Math.PI * 0.5);\n        ctx.drawImage(\n            dataCanvas, \n            0, 0, imageData.width, imageData.height,\n            -parent.rectYstart, parent.rectXstart,\n            imageData.width * parent._height, imageData.height * parent._width\n        ); ctx.restore();\n    }\n    this.render = ({ctx, width, height}) => {\n        if (this._spectrogram) this.renderSpectrum(ctx);\n        // 填涂剩余部分\n        let end = parent.idXend * parent._width - parent.scrollX;\n        let w = width - end;\n        if (w > 0) ctx.fillRect(end, 0, w, height);\n        // 绘制分界线\n        ctx.beginPath();\n        for (let y = (((parent.idYstart / 12) | 0) + 1) * 12,\n            rectY = height - parent._height * y + parent.scrollY,\n            dy = -12 * parent._height;\n            y < parent.idYend; y += 12, rectY += dy) {\n            ctx.moveTo(0, rectY);\n            ctx.lineTo(width, rectY);\n        } ctx.stroke();\n    };\n}"
  },
  {
    "path": "core/app_timebar.js",
    "content": "/// <reference path=\"../ui/contextMenu.js\" />\n\n/**\n * 顶部时间轴\n * @param {App} parent \n */\nfunction _TimeBar(parent) {\n    this.interval = 10; // 每个标注的间隔块数 在updateInterval中更新\n    // 重复区间参数 单位：毫秒 如果start>end则区间不起作用\n    this.repeatStart = -1;\n    this.repeatEnd = -1;\n    /**\n     * 设置重复区间专用函数 便于统一管理行为副作用\n     * @param {number || null} start 单位：毫秒\n     * @param {number || null} end 单位：毫秒\n     */\n    this.setRepeat = (start = null, end = null) => {\n        if (start !== null) this.repeatStart = start;\n        if (end !== null) this.repeatEnd = end;\n    };\n    /**\n     * 毫秒转 分:秒:毫秒\n     * @param {number} ms 毫秒数\n     * @returns [分,秒,毫秒]\n     */\n    this.msToClock = (ms) => {\n        return [\n            Math.floor(ms / 60000),\n            Math.floor((ms % 60000) / 1000),\n            ms % 1000 | 0\n        ];\n    };\n    this.msToClockString = (ms) => {\n        const t = this.msToClock(ms);\n        return `${t[0].toString().padStart(2, \"0\")}:${t[1].toString().padStart(2, \"0\")}:${t[2].toString().padStart(3, \"0\")}`;\n    };\n    // timeBar的上半部分画时间轴 并绘制工作区重复区间和时间指针\n    this.render = () => {\n        const canvas = parent.timeBar;\n        const ctx = parent.timeBar.ctx;\n        let idstart = Math.ceil(parent.idXstart / this.interval - 0.1); // 画面中第一个时间点的序号\n        let dt = this.interval * parent.dt;     // 时间的步长\n        let dp = parent.width * this.interval;  // 像素的步长\n        let timeAt = dt * idstart;              // 对应的毫秒\n        let p = idstart * dp - parent.scrollX;  // 对应的像素\n        let h = canvas.height >> 1;             // 上半部分\n        ctx.fillStyle = '#25262d';\n        ctx.fillRect(0, 0, canvas.width, h);\n        ctx.fillStyle = '#8e95a6';\n        //== 画刻度 标时间 ==//\n        ctx.strokeStyle = '#ff0000';\n        ctx.beginPath();\n        for (let endPix = canvas.width + (dp >> 1); p < endPix; p += dp, timeAt += dt) {\n            ctx.moveTo(p, 0);\n            ctx.lineTo(p, h);\n            ctx.fillText(this.msToClockString(timeAt), p - 28, 16);\n        } ctx.stroke();\n        //== 画重复区间 ==//\n        let begin = parent._width * this.repeatStart / parent.dt - parent.scrollX;  // 单位：像素\n        let end = parent._width * this.repeatEnd / parent.dt - parent.scrollX;\n        const spectrum = parent.layers.action.ctx;\n        const spectrumHeight = parent.layers.height;\n        // 画线\n        if (begin >= 0 && begin < canvas.width) {   // 画左边\n            ctx.beginPath(); spectrum.beginPath();\n            ctx.strokeStyle = spectrum.strokeStyle = '#20ff20';\n            ctx.moveTo(begin, 0); ctx.lineTo(begin, canvas.height);\n            spectrum.moveTo(begin, 0); spectrum.lineTo(begin, spectrumHeight);\n            ctx.stroke(); spectrum.stroke();\n        }\n        if (end >= 0 && end < canvas.width) {       // 画右边\n            ctx.beginPath(); spectrum.beginPath();\n            ctx.strokeStyle = spectrum.strokeStyle = '#ff2020';\n            ctx.moveTo(end, 0); ctx.lineTo(end, canvas.height);\n            spectrum.moveTo(end, 0); spectrum.lineTo(end, spectrumHeight);\n            ctx.stroke(); spectrum.stroke();\n        }\n        // 画区间 如果begin>end则区间不起作用，不绘制\n        if (begin < end) {\n            begin = Math.max(begin + 1, 0); end = Math.min(end - 1, canvas.width);\n            ctx.fillStyle = spectrum.fillStyle = '#80808044';\n            ctx.fillRect(begin, 0, end - begin, canvas.height);\n            spectrum.fillRect(begin, 0, end - begin, spectrumHeight);\n        }\n        //== 画当前时间指针 ==//\n        spectrum.strokeStyle = 'white';\n        begin = parent.time / parent.dt * parent._width - parent.scrollX;\n        if (begin >= 0 && begin < canvas.width) {\n            spectrum.beginPath();\n            spectrum.moveTo(begin, 0);\n            spectrum.lineTo(begin, spectrumHeight);\n            spectrum.stroke();\n        }\n    };\n    this.updateInterval = () => {   // 根据parent.width改变 在width的setter中调用\n        const fontWidth = parent.timeBar.ctx.measureText('00:00:000').width * 1.2;\n        // 如果间距小于fontWidth则细分\n        this.interval = Math.max(1, Math.ceil(fontWidth / parent._width));\n    };\n    this.contextMenu = new ContextMenu([\n        {\n            name: \"设置重复区间开始位置\",\n            callback: (e_father, e_self) => {\n                this.setRepeat((e_father.offsetX + parent.scrollX) * parent.TperP, null);\n            }\n        }, {\n            name: \"设置重复区间结束位置\",\n            callback: (e_father, e_self) => {\n                this.setRepeat(null, (e_father.offsetX + parent.scrollX) * parent.TperP);\n            }\n        }, {\n            name: '<span style=\"color: red;\">取消重复区间</span>',\n            onshow: () => this.repeatStart >= 0 || this.repeatEnd >= 0,\n            callback: () => {\n                this.setRepeat(-1, -1);\n            }\n        }, {\n            name: \"从此处播放\",\n            callback: (e_father, e_self) => {\n                parent.AudioPlayer.stop();\n                parent.AudioPlayer.start((e_father.offsetX + parent.scrollX) * parent.TperP);\n            }\n        }\n    ]);\n}"
  },
  {
    "path": "dataProcess/AI/AIEntrance.js",
    "content": "var AI = {\ncombineChannels: (audioChannel) => {\n    const wav = new Float32Array(audioChannel.getChannelData(0));\n    // 求和。不求平均是因为模型内部有归一化\n    if (audioChannel.numberOfChannels !== 1) {\n        const len = wav.length;\n        for (let i = 1; i < audioChannel.numberOfChannels; i++) {\n            const cData = audioChannel.getChannelData(i);\n            for (let j = 0; j < len; j++) wav[j] += cData[j];\n        }\n    } return wav;\n},\nbasicamt: (audioChannel) => {\n    const timeDomain = AI.combineChannels(audioChannel);\n    return new Promise((resolve, reject) => {\n        const basicamtWorker = new Worker(\"./dataProcess/AI/basicamt_worker.js\");\n        basicamtWorker.onmessage = ({data}) => {\n            if (data.type === 'error') {\n                console.error(data.message);\n                reject(\"疑似因为音频过长导致内存不足！\");\n                basicamtWorker.terminate();\n            } resolve(data);  // 返回的是音符事件\n            basicamtWorker.terminate();\n        };\n        basicamtWorker.onerror = (e) => {\n            console.error(e.message);\n            reject(e);\n            basicamtWorker.terminate();\n        };\n        basicamtWorker.postMessage(timeDomain, [timeDomain.buffer]);\n    });\n},\nseptimbre: (audioChannel, k) => {\n    const timeDomain = AI.combineChannels(audioChannel);\n    return new Promise((resolve, reject) => {\n        const septimbreWorker = new Worker(\"./dataProcess/AI/septimbre_worker.js\");\n        septimbreWorker.onmessage = ({data}) => {\n            if (data.type === 'error') {\n                console.error(data.message);\n                reject(\"疑似因为音频过长导致内存不足！\");\n                septimbreWorker.terminate();\n            } resolve(data);\n            septimbreWorker.terminate();\n        };\n        septimbreWorker.onerror = (e) => {\n            console.error(e.message);\n            reject(e);\n            septimbreWorker.terminate();\n        };\n        septimbreWorker.postMessage(k);\n        septimbreWorker.postMessage(timeDomain, [timeDomain.buffer]);\n    });\n}\n};"
  },
  {
    "path": "dataProcess/AI/SpectralClustering.js",
    "content": "/**\n * 谱聚类算法\n * @param {Array<Float32Array>} feats\n * @param {number} numClusters \n */\nfunction SpectralClustering(feats, numClusters, affinityFunc) {\n    // 1. 计算修改后的归一化拉普拉斯矩阵 Lsym = I + D^(-1/2) * W * D^(-1/2)\n    const L = TriangleMatrix.Lsym(feats, affinityFunc);\n    // 2. 使用正交迭代法计算前k个特征向量\n    const U = TriangleMatrix.orthogonalIteration(L, numClusters);\n    // console.log(U);\n    // 3. 转置并归一化\n    const { flatMatrix, n, k } = transposeAndNormalize(U);\n    // 4. 基于 Pivoted QR 选择聚类中心\n    return clusterQR(flatMatrix, n, k);\n}\n\n/**\n * 转置并归一化 (Transpose & Normalize)\n * 优化点:\n * 1. 预计算范数：利用原始数据的内存布局（顺序读取）计算模长；乘法代替除法：预先计算 1/norm\n * 2. 分块写入 (Tiling)：将转置过程分块，确保写入 `flat` 数组时命中缓存\n * 3. 减少重复计算：提前解构引用，避免在循环内多次查找 `eigenVectors[r]`\n * 4. 手动维护索引，消除循环内的乘法运算\n * @param {Array<Float32Array>} eigenVectors 大小为 k 的数组，每个元素长 n\n * @param {number} BLOCK_SIZE L1 缓存分块大小\n * @returns {{flatMatrix: Float32Array, n: number, k: number}}\n */\nfunction transposeAndNormalize(eigenVectors, BLOCK_SIZE = 1024) {\n    const k = eigenVectors.length;\n    const n = eigenVectors[0].length;\n    const flat = new Float32Array(n * k);\n\n    // normSq[i] 存储第 i 个数据点（即第 i 行）的模长平方\n    const normSq = new Float32Array(n);\n\n    // 1. 预计算模长 (保持不变，因为这是最高效的)\n    for (let r = 0; r < k; r++) {\n        const vec = eigenVectors[r];\n        for (let i = 0; i < n; i++) {\n            normSq[i] += vec[i] * vec[i];\n        }\n    }\n    // 归一化系数\n    for (let i = 0; i < n; i++) normSq[i] = 1.0 / Math.sqrt(normSq[i] + 1e-10);\n\n    // 2. 分块转置\n    // 由于 k 很小，一行的数据量很小 (20 bytes)。\n    // 我们可以适当增大 BLOCK_SIZE，比如 1024 或 2048\n\n    // 提前解构引用，避免在循环里查找 eigenVectors[r]\n    const vecs = Array.from({ length: k }, (_, i) => eigenVectors[i]);\n\n    for (let iBase = 0; iBase < n; iBase += BLOCK_SIZE) {\n        // 确定当前块的边界\n        const iLimit = (iBase + BLOCK_SIZE < n) ? (iBase + BLOCK_SIZE) : n;\n\n        for (let r = 0; r < k; r++) {\n            const vec = vecs[r];\n            // 手动维护索引，消除循环内的 (i * k) 乘法\n            // 初始索引：当前块起始行(iBase) * k + 当前列(r)\n            let flatIndex = iBase * k + r;\n            for (let i = iBase; i < iLimit; i++) {\n                // 直接使用指针\n                flat[flatIndex] = vec[i] * normSq[i];\n                // 步进为 k，因为 flat 是行优先存储，\n                // 同一列的下一个元素在 flat 中相隔 k 个位置\n                flatIndex += k;\n            }\n        }\n    }\n    return { flatMatrix: flat, n, k };\n}\n\n\n/**\n * 完整的 Cluster QR 聚类\n * 包含：中心点选择 + 标签分配\n * \n * @param {Float32Array} flatMatrix (n * k) 归一化后的特征矩阵 (只读)\n * @param {number} n 点的数量\n * @param {number} k 聚类数量\n * @returns {Int32Array} 长度为 n 的数组，labels[i] 表示第 i 个点属于第几类 (0 到 k-1)\n */\nfunction clusterQR(flatMatrix, n, k) {\n    // --- 阶段 1: 准备工作 ---\n    \n    // 1. 必须复制一份数据用于 QR 分解的残差计算\n    // 因为 MGS 算法会破坏性地修改数据，而我们最后分配时需要原始数据\n    // 这里的内存开销是必要的 (n * k * 4 bytes)\n    const residualsMatrix = flatMatrix.slice(); \n    \n    const centroidIndices = new Int32Array(k);\n    const residualNorms = new Float32Array(n);\n    \n    // 初始化残差模长 (由于输入已归一化，初始全为 1.0)\n    // 但为了保险，还是算一下，或者直接 fill(1.0) 如果上一步很自信\n    residualNorms.fill(1.0); \n\n    const currentPivot = new Float32Array(k);\n\n    // --- 阶段 2: 选择中心点 (Pivot Selection) ---\n    for (let step = 0; step < k; step++) {\n        // 2.1 寻找残差最大的点\n        let maxNorm = -1.0;\n        let pivotIdx = -1;\n        \n        for (let i = 0; i < n; i++) {\n            if (residualNorms[i] > maxNorm) {\n                maxNorm = residualNorms[i];\n                pivotIdx = i;\n            }\n        }\n        \n        // 记录中心点索引\n        centroidIndices[step] = pivotIdx;\n        \n        if (maxNorm < 1e-6) break; // 剩余点都几乎为0了\n\n        // 2.2 提取 pivot 向量 (从残差矩阵中提取)\n        const pivotOffset = pivotIdx * k;\n        const pivotScale = 1.0 / Math.sqrt(maxNorm);\n        \n        for (let j = 0; j < k; j++) {\n            currentPivot[j] = residualsMatrix[pivotOffset + j] * pivotScale;\n        }\n\n        // 2.3 正交化 (更新残差矩阵)\n        for (let i = 0; i < n; i++) {\n            if (residualNorms[i] < 0) continue; // 已选过的跳过\n            if (i === pivotIdx) {\n                residualNorms[i] = -1.0; \n                continue;\n            }\n\n            const offset = i * k;\n            \n            // dot = <residual_i, pivot>\n            let dot = 0.0;\n            for (let j = 0; j < k; j++) {\n                dot += residualsMatrix[offset + j] * currentPivot[j];\n            }\n\n            // residual_i = residual_i - dot * pivot\n            let newNorm = 0.0;\n            for (let j = 0; j < k; j++) {\n                const val = residualsMatrix[offset + j] - dot * currentPivot[j];\n                residualsMatrix[offset + j] = val;\n                newNorm += val * val;\n            }\n            residualNorms[i] = newNorm;\n        }\n    }\n\n    // --- 阶段 3: 分配标签 (Label Assignment) ---\n    // 既然数据已经归一化，欧氏距离最近等价于余弦相似度最大 (Dot Product Largest)\n    \n    const labels = new Int32Array(n);\n    \n    // 为了极致性能，先将 k 个中心点的原始向量提取到连续内存中\n    // 这样在遍历 n 个点时，中心点数据能更好地待在 Cache 里\n    const centerVectors = new Float32Array(k * k);\n    for (let c = 0; c < k; c++) {\n        const centerIdx = centroidIndices[c];\n        const srcOffset = centerIdx * k;\n        const destOffset = c * k;\n        for(let j=0; j<k; j++) {\n            centerVectors[destOffset + j] = flatMatrix[srcOffset + j];\n        }\n    }\n\n    // 对每个点进行分类\n    for (let i = 0; i < n; i++) {\n        let maxSim = -Infinity;\n        let bestCluster = 0;\n        \n        const pointOffset = i * k;\n        \n        // 遍历所有中心点，找最相似的\n        for (let c = 0; c < k; c++) {\n            const centerOffset = c * k;\n            \n            // 计算点积 (Dot Product)\n            let dot = 0.0;\n            for (let j = 0; j < k; j++) {\n                dot += flatMatrix[pointOffset + j] * centerVectors[centerOffset + j];\n            }\n            \n            if (dot > maxSim) {\n                maxSim = dot;\n                bestCluster = c;\n            }\n        }\n        labels[i] = bestCluster;\n    }\n\n    return labels;\n}\n\n\nclass TriangleMatrix {\n    constructor(size) {\n        this.size = size;\n        this.data = new Float32Array((size * (size + 1)) / 2);\n    }\n\n    // 发现效果比exp(cos-1)好\n    static cosineAffinityExp(featureA, featureB) {\n        let dot = 0;\n        for (let i = 0; i < featureA.length; i++) {\n            dot += featureA[i] * featureB[i];\n        }\n        return Math.exp(dot);\n    }\n\n    /**\n     * 直接计算归一化拉普拉斯矩阵\n     * 但是正交迭代法求的是绝对值最大特征值对应的特征向量，而需要的是最小特征值对应的特征向量\n     * 因此将本来的\"I-\"换成了\"I+\"，此时特征向量不变，特征值变为原来的2-λ\n     * @param {Array<Float32Array>} features \n     * @param {Function(Float32Array, Float32Array): number} func W(i, j) = func(features[i], features[j])\n     * @returns {TriangleMatrix} D^(-1/2) * W * D^(-1/2) + I\n     */\n    static Lsym(features, func = TriangleMatrix.cosineAffinityExp) {\n        const size = features.length;\n        const affine = new TriangleMatrix(size);\n        const rowSums = new Float32Array(size);\n        const data = affine.data;\n        // 不算自环，直接跳过第一个\n        for (let j = 1, idx = 1; j < size; j++, idx++) {    // col\n            const colFeature = features[j];\n            for (let i = 0; i < j; i++, idx++) {            // row\n                const affi = func(colFeature, features[i]);\n                data[idx] = affi;\n                rowSums[i] += affi;\n                rowSums[j] += affi;\n            }\n        }\n        // 此时对角线元素均为0\n        // 归一化\n        for (let j = 0, idx = 0; j < size; j++, idx++) {\n            for (let i = 0; i < j; i++, idx++) {    // 本应是i <= j，但是对角线元素单独处理，所以将最后一个idx++放在外层\n                const div = Math.sqrt(rowSums[i] * rowSums[j]);\n                if (div > 1e-10) data[idx] = data[idx] / div;\n                else data[idx] = 0;\n            }\n            // 对角线元素设为1\n            data[idx] = 1;\n        }\n        return affine;\n    }\n\n    _index(i, j) {\n        // 内联优化建议：在热路径中尽量手动计算，减少函数调用开销\n        if (i > j) return (i * (i + 1)) / 2 + j;\n        return (j * (j + 1)) / 2 + i;\n    }\n\n    /**\n     * 优化的矩阵乘法 Z = A * Q\n     * @param {Array<Float32Array>} Q_in 输入向量组 (k个)\n     * @param {Array<Float32Array>} Z_out 输出向量组 (k个，预分配好)\n     */\n    mult_mat_optimized(Q_in, Z_out) {\n        const size = this.size;\n        const k = Q_in.length;\n        const data = this.data;\n\n        // 清空输出 buffer\n        for (let r = 0; r < k; r++) Z_out[r].fill(0);\n\n        for (let j = 0, idx = 0; j < size; j++) {\n            for (let i = 0; i <= j; i++, idx++) {\n                const val = data[idx];\n                for (let r = 0; r < k; r++) {\n                    const vecIn = Q_in[r];\n                    const vecOut = Z_out[r];\n                    vecOut[i] += val * vecIn[j];\n                    if (i !== j) vecOut[j] += val * vecIn[i];\n                }\n            }\n        }\n    }\n\n    /**\n     * 正交迭代法 求前k个绝对值最大的特征值对应的特征向量\n     * @param {TriangleMatrix} A 建议是 I + D^{-0.5}WD^{-0.5}\n     * @param {number} numVectors 需要的特征向量数量\n     * @param {number} numIterations 迭代次数\n     * @return {Array<Float32Array>} 特征向量矩阵 size * numVectors\n     */\n    static orthogonalIteration(A, numVectors, numIterations = 30) {\n        const size = A.size;\n\n        // 双缓冲\n        let Q = Array.from({ length: numVectors }, () => new Float32Array(size));\n        let Z = Array.from({ length: numVectors }, () => new Float32Array(size));\n\n        // 初始化 Q 为随机并正交化\n        for (let r = 0; r < numVectors; r++) {\n            for (let i = 0; i < size; i++) Q[r][i] = Math.random();\n        }\n        SchmidtInPlace(Q); // 原地正交化\n\n        // 迭代\n        for (let iter = 0; iter < numIterations; iter++) {\n            // Z = A * Q (写入 Z buffer)\n            A.mult_mat_optimized(Q, Z);\n            // Q = Schmidt(Z) (原地正交化 Z，结果仍在 Z buffer 中)\n            SchmidtInPlace(Z);\n            // 交换 buffer：Z 变成了下一次的 Q，原来的 Q 变成下一次的废弃 buffer (Z)\n            const temp = Q; Q = Z; Z = temp;\n        }\n        return Q;\n    }\n}\n\n/**\n * 施密特正交化 (原地修改版 / In-Place MGS)\n * 没有任何内存分配，速度极快\n * @param {Array<Float32Array>} V 向量组\n */\nfunction SchmidtInPlace(V) {\n    const k = V.length;\n    const n = V[0].length;\n\n    for (let i = 0; i < k; i++) {\n        const qi = V[i];\n\n        // 归一化当前向量\n        let dot = 0.0;\n        for (let x = 0; x < n; x++) dot += qi[x] * qi[x];\n        const norm = Math.sqrt(dot);\n        const scale = norm < 1e-10 ? 0 : 1.0 / norm;\n        for (let x = 0; x < n; x++) qi[x] *= scale;\n\n        // 正交化后续向量 (MGS)\n        for (let j = i + 1; j < k; j++) {\n            const vj = V[j];\n\n            // 计算投影 proj = <vj, qi>\n            let proj = 0.0;\n            for (let x = 0; x < n; x++) proj += vj[x] * qi[x];\n\n            // 减去投影 vj = vj - proj * qi\n            for (let x = 0; x < n; x++) vj[x] -= proj * qi[x];\n        }\n    }\n}"
  },
  {
    "path": "dataProcess/AI/basicamt_worker.js",
    "content": "// const ort_folder = 'https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/';\n// self.importScripts(ort_folder + 'ort.wasm.min.js');\n// ort.env.wasm.wasmPaths = ort_folder;\nself.importScripts('./postprocess.js');\nself.importScripts('./dist/bundle.min.js')\nort.env.wasm.wasmPaths = './dist/'\n\nconst model = ort.InferenceSession.create(\n    './basicamt_44100.onnx',\n    { executionProviders: ['wasm'] }\n);\n\nself.onmessage = function ({data}) {\n    const tensorInput = new ort.Tensor('float32', data, [1, 1, data.length]);\n    model.then((m) => {\n        return m.run({ audio: tensorInput });\n    }).then((results) => {\n        const note_events = createNotes(\n            results.onset, results.frame,\n            0.22, 0.38\n        );\n        self.postMessage(note_events);\n    }).catch((e) => {\n        // promise中的报错不会触发worker.onerror回调，即使这里throw了。所以只能用onmessage\n        self.postMessage({ type: 'error', message: e.message });\n    });\n};"
  },
  {
    "path": "dataProcess/AI/postprocess.js",
    "content": "function createNotes(\n    onsetTensor, frameTensor,\n    frame_thresh = 0.22,\n    onset_thresh = 0.38,\n    min_note_len = 6,\n    energy_tol = 10,\n    midi_offset = 24\n) {\n    // 模型中已经对onset和frame进行归一化了\n    const raw_frameData = frameTensor.cpuData;\n    const frameDim = frameTensor.dims;  // [1, 84, frames]\n    const raw_onsetData = onsetTensor.cpuData;\n    const onsetDim = onsetTensor.dims;  // [1, 84, frames]\n    // 两个dim应该一样\n    if (frameDim[1] !== onsetDim[1] || frameDim[2] !== onsetDim[2]) {\n        throw new Error(\"frameDim[1] !== onsetDim[1] || frameDim[2] !== onsetDim[2]\");\n    }\n    const frameNum = frameDim[2];\n    const noteNum = frameDim[1];\n\n    const frameData = Array(noteNum);\n    const onsetData = Array(noteNum);\n    for (let i = 0; i < noteNum; i++) {\n        // 和raw共享内存\n        frameData[i] = new Float32Array(raw_frameData.buffer, i * frameNum * 4, frameNum);\n        onsetData[i] = new Float32Array(raw_onsetData.buffer, i * frameNum * 4, frameNum);\n    }\n\n    get_infered_onsets(onsetData, frameData, 3);\n\n    const peaks = findPeak(onsetData, onset_thresh);\n    peaks.sort((a, b) => b[0] - a[0]);  // 按照时间反过来排序\n\n    const remaining_energy = Array(noteNum);    // 复制一份frameData，用于修改数据\n    for (let i = 0; i < noteNum; i++) remaining_energy[i] = new Float32Array(frameData[i]);\n\n    const note_events = [];\n    for (const [note_start_idx, freq_idx] of peaks) {\n        // 如果剩下的距离不够放一个最短的音符，就跳过\n        if (note_start_idx >= frameNum - min_note_len) continue;\n\n        let note_end_idx = note_start_idx + 1;\n        let k = 0;  // 连续k个小于frame_thresh的帧\n        const freqArray = remaining_energy[freq_idx];\n        // 向后搜索，连续energy_tol帧小于frame_thresh（或者到达最后一帧），就认为这个音符结束。目的是将分散的frames合并\n        while (note_end_idx < frameNum && k < energy_tol) {\n            if (freqArray[note_end_idx] < frame_thresh) k++;\n            else k = 0;\n            note_end_idx++;\n        }\n        note_end_idx -= k;  // 回到音符结尾\n\n        if (note_end_idx - note_start_idx < min_note_len) continue;  // 跳过短音符\n        freqArray.fill(0, note_start_idx, note_end_idx);  // 将这个音符的frame清零\n\n        // 认为半音不会同时出现，因为不能构成和弦\n        if (freq_idx < noteNum - 1)\n            remaining_energy[freq_idx + 1].fill(0, note_start_idx, note_end_idx);\n        if (freq_idx > 0)\n            remaining_energy[freq_idx - 1].fill(0, note_start_idx, note_end_idx);\n\n        // 对frameData在start和end中间的求平均\n        let sum = 0;\n        for (let i = note_start_idx; i < note_end_idx; i++)\n            sum += frameData[freq_idx][i];\n\n        note_events.push({\n            onset: note_start_idx,\n            offset: note_end_idx,\n            note: freq_idx + midi_offset,\n            velocity: sum / (note_end_idx - note_start_idx)\n        });\n    }\n    \n    // 不依赖onset，根据frames中的极大值找额外的音符\n    const maxes = [];\n    for (let n = 0; n < noteNum; n++) {\n        const thisNote = frameData[n];\n        for (let t = 1; t < frameNum; t++) {\n            if (thisNote[t] > frame_thresh) maxes.push([thisNote[t], n, t]);\n        }\n    }\n    maxes.sort((a, b) => b[0] - a[0]);  // 按照能量从大到小排序\n\n    for (const [_, n, t] of maxes) {\n        // 可能被前面的循环置零了\n        if (remaining_energy[n][t] < frame_thresh) continue;\n        // 后向搜索\n        let note_end_idx = t + 1;\n        let k = 0;\n        const freqArray = remaining_energy[n];\n        while (note_end_idx < frameNum && k < energy_tol) {\n            if (freqArray[note_end_idx] < frame_thresh) k++;\n            else k = 0;\n            note_end_idx++;\n        }\n        note_end_idx -= k;\n        // 前向搜索\n        let note_start_idx = t - 1;\n        k = 0;\n        while (note_start_idx > 0 && k < energy_tol) {\n            if (freqArray[note_start_idx] < frame_thresh) k++;\n            else k = 0;\n            note_start_idx--;\n        }\n        note_start_idx += (k + 1);  // 之前多减了1，而fill是左闭右开\n\n        // 不管长度符不符合，都置零\n        freqArray.fill(0, note_start_idx, note_end_idx);\n        if (n < noteNum - 1)\n            remaining_energy[n + 1].fill(0, note_start_idx, note_end_idx);\n        if (n > 0)\n            remaining_energy[n - 1].fill(0, note_start_idx, note_end_idx);\n\n\n        if (note_end_idx - note_start_idx < min_note_len) continue;\n\n        let sum = 0;\n        for (let i = note_start_idx; i < note_end_idx; i++)\n            sum += frameData[n][i];\n\n        note_events.push({\n            onset: note_start_idx,\n            offset: note_end_idx,\n            note: n + midi_offset,\n            velocity: sum / (note_end_idx - note_start_idx)\n        });\n    }\n    return note_events;\n}\n\n/**\n * 从frame中推断新的onset 会修改传入的的onsets\n * @param {Array<Float32Array>} onsets \n * @param {Array<Float32Array>} frames \n * @param {number} n_diff \n */\nfunction get_infered_onsets(onsets, frames, n_diff = 2) {\n    const frameNum = frames[0].length;\n    const noteNum = frames.length;\n    const inffered_onsets = Array(noteNum);\n    let infered_max = -1e10;    // 用于归一化\n    for (let n = 0; n < noteNum; n++) {\n        const notetime = new Float32Array(frameNum);\n        const thisFrame = frames[n];\n        for (let t = n_diff; t < frameNum; t++) {\n            let min_diff = 1e10;\n            // 对每个时间点求最小的差值\n            for (let k = 1; k <= n_diff; k++) {\n                let diff = thisFrame[t] - thisFrame[t - k];\n                if (diff < min_diff) min_diff = diff;\n            }\n            if (min_diff > infered_max) infered_max = min_diff;\n            notetime[t] = min_diff;\n        }\n        inffered_onsets[n] = notetime\n    }\n    // 归一化 由于onset在模型内部已经归一化了，所以onset的最大值就是1\n    for (let n = 0; n < noteNum; n++) {\n        for (let t = 0; t < frameNum; t++) {\n            let temp = inffered_onsets[n][t] / infered_max;\n            if (temp > onsets[n][t]) onsets[n][t] = temp;\n        }\n    }\n}\n\nfunction findPeak(x2d, threshold = 0) {\n    const H = x2d.length;\n    const W = x2d[0].length - 1;\n    let peak = [];\n    for (let h = 0; h < H; h++) {\n        const row = x2d[h];\n        let last_is_up = true;  // 由于模型用的是sigmoid，所以全部大于零，所以第一个之前的导数一定大于零\n        for (let w = 0; w < W; w++) {\n            if (row[w] < threshold) continue;\n            if (last_is_up) {\n                if (row[w] > row[w + 1]) {  // 下一个小于当前，说明当前是峰值\n                    peak.push([w, h]);\n                    last_is_up = false;\n                } else if (row[w] == row[w + 1]) {\n                    let _w = w + 1;\n                    // 下一个等于当前，要看后面第一个非零导数是否小于零\n                    while (_w < W) {\n                        if (row[_w] == row[_w + 1]) _w++;\n                        else if (row[_w] < row[_w + 1]) break;\n                        else {  // 后面变小了，说明当前是峰值\n                            last_is_up = false;\n                            peak.push([w, h]);\n                            w = _w;\n                            break;\n                        }\n                    }\n                }\n            } else {\n                last_is_up = (row[w] < row[w + 1]);\n            } \n        }\n    } return peak;\n}"
  },
  {
    "path": "dataProcess/AI/septimbre_44100.onnx",
    "content": "\b\n\u0012\u0007pytorch\u001a\u000b2.9.0+cu128:*\n\u0005\n\u0005audio\u0012\u0005val_0\u001a\fnode_Shape_0\"\u0005Shape*\n\n\u0003end\u0018\u0003\u0001\u0002*\f\n\u0005start\u0018\u0002\u0001\u0002J\u0001\n\tnamespace\u0012w_empty_nn_module_stack_from_metadata_hook: _empty_nn_module_stack_from_metadata_hook/sym_size_int_85: aten.sym_size.intJd\n\u001epkg.torch.onnx.class_hierarchy\u0012B['_empty_nn_module_stack_from_metadata_hook', 'aten.sym_size.int']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012q%sym_size_int_85 : [num_users=1] = call_function[target=torch.ops.aten.sym_size.int](args = (%x, 2), kwargs = {})J^\n\u001apkg.torch.onnx.name_scopes\u0012@['_empty_nn_module_stack_from_metadata_hook', 'sym_size_int_85']Js\n\u001apkg.torch.onnx.stack_trace\u0012UFile \"torch/fx/passes/runtime_assert.py\", line 24, in insert_deferred_runtime_asserts\n\u0005\n\u0005val_0\u0012\u000fsym_size_int_85\u001a\u0014node_sym_size_int_85\"\u0007SqueezeJ\u0001\n\tnamespace\u0012w_empty_nn_module_stack_from_metadata_hook: _empty_nn_module_stack_from_metadata_hook/sym_size_int_85: aten.sym_size.intJd\n\u001epkg.torch.onnx.class_hierarchy\u0012B['_empty_nn_module_stack_from_metadata_hook', 'aten.sym_size.int']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012q%sym_size_int_85 : [num_users=1] = call_function[target=torch.ops.aten.sym_size.int](args = (%x, 2), kwargs = {})J^\n\u001apkg.torch.onnx.name_scopes\u0012@['_empty_nn_module_stack_from_metadata_hook', 'sym_size_int_85']Js\n\u001apkg.torch.onnx.stack_trace\u0012UFile \"torch/fx/passes/runtime_assert.py\", line 24, in insert_deferred_runtime_asserts\n\u0001\n\u0005audio\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\u0006conv1d\u001a\u000enode_Conv_1554\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\u0006\n\u0006conv1d\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0004flip\u001a\tnode_flip\"\u0005SliceJu\n\tnamespace\u0012h: septimbre.SepTimbreAMT_44100/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip: aten.flip.defaultJp\n\u001epkg.torch.onnx.class_hierarchy\u0012N['septimbre.SepTimbreAMT_44100', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012n%flip : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d, [-1]), kwargs = {})JH\n\u001apkg.torch.onnx.name_scopes\u0012*['', 'septimbre_amt.cqt.filtfilt', 'flip']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 190, in forward\n    x = self.septimbre_amt.cqt.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0001\n\u0004flip\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\bconv1d_1\u001a\u000enode_Conv_1555\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\u0006\n\bconv1d_1\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0006flip_1\u001a\u000bnode_flip_1\"\u0005SliceJw\n\tnamespace\u0012j: septimbre.SepTimbreAMT_44100/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_1: aten.flip.defaultJp\n\u001epkg.torch.onnx.class_hierarchy\u0012N['septimbre.SepTimbreAMT_44100', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%flip_1 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_1, [-1]), kwargs = {})JJ\n\u001apkg.torch.onnx.name_scopes\u0012,['', 'septimbre_amt.cqt.filtfilt', 'flip_1']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 190, in forward\n    x = self.septimbre_amt.cqt.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0004\n\u0006flip_1\n\u0006val_25\n\u0006val_29\n\u0006val_33\n\u0006val_33\u0012\u0007slice_1\u001a\fnode_slice_1\"\u0005SliceJF\n\tnamespace\u00129: septimbre.SepTimbreAMT_44100/slice_1: aten.slice.TensorJW\n\u001epkg.torch.onnx.class_hierarchy\u00125['septimbre.SepTimbreAMT_44100', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_1 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%cat, 2, 0, 9223372036854775807, 2), kwargs = {})J-\n\u001apkg.torch.onnx.name_scopes\u0012\u000f['', 'slice_1']J\u0001\n\u001apkg.torch.onnx.stack_trace\u0012{File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 190, in forward\n    x = self.septimbre_amt.cqt.down2sample(x)\n\u0001\n\u0007slice_1\n\u001dseptimbre_amt.cqt.cqt_kernels\u0012\bconv1d_2\u001a\u000enode_Conv_1556\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u000f\n\u0004pads@\u0001@\u0001\u0001\u0007*\u000f\n\u0007strides@\u0002\u0001\u0007\n\u0007\n\bconv1d_2\n\u0006val_47\u0012\u0004view\u001a\tnode_view\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0001\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/view: aten.view.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.view.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012z%view : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%conv1d_2, [1, 2, 36, -1]), kwargs = {})JP\n\u001apkg.torch.onnx.name_scopes\u00122['', 'septimbre_amt', 'septimbre_amt.cqt', 'view']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 321, in forward\n    CQT_results = [firstOctave.view(firstOctave.size(0), 2, self.bins_per_octave, -1)]\n\u0001\n\u0007slice_1\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\bconv1d_3\u001a\u000enode_Conv_1557\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\bconv1d_3\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0006flip_2\u001a\u000bnode_flip_2\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_2: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%flip_2 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_3, [-1]), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_2']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0001\n\u0006flip_2\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\bconv1d_4\u001a\u000enode_Conv_1558\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\bconv1d_4\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0006flip_3\u001a\u000bnode_flip_3\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_3: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%flip_3 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_4, [-1]), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_3']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0007\n\u0006flip_3\n\u0006val_25\n\u0006val_29\n\u0006val_33\n\u0006val_33\u0012\u0007slice_2\u001a\fnode_slice_2\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/slice_2: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_2 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%cat_1, 2, 0, 9223372036854775807, 2), kwargs = {})JS\n\u001apkg.torch.onnx.name_scopes\u00125['', 'septimbre_amt', 'septimbre_amt.cqt', 'slice_2']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n\u0001\n\u0007slice_2\n\u001dseptimbre_amt.cqt.cqt_kernels\u0012\bconv1d_5\u001a\u000enode_Conv_1559\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u000f\n\u0004pads@\u0001@\u0001\u0001\u0007*\u000f\n\u0007strides@\u0001\u0001\u0007\n\b\n\bconv1d_5\n\u0006val_47\u0012\u0006view_1\u001a\u000bnode_view_1\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0001\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/view_1: aten.view.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.view.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012|%view_1 : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%conv1d_5, [1, 2, 36, -1]), kwargs = {})JR\n\u001apkg.torch.onnx.name_scopes\u00124['', 'septimbre_amt', 'septimbre_amt.cqt', 'view_1']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 326, in forward\n    CQT_results.append(CQT_result.view(CQT_result.size(0), 2, self.bins_per_octave, -1))\n\u0001\n\u0007slice_2\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\bconv1d_6\u001a\u000enode_Conv_1560\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\bconv1d_6\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0006flip_4\u001a\u000bnode_flip_4\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_4: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%flip_4 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_6, [-1]), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_4']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0001\n\u0006flip_4\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\bconv1d_7\u001a\u000enode_Conv_1561\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\bconv1d_7\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0006flip_5\u001a\u000bnode_flip_5\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_5: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%flip_5 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_7, [-1]), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_5']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0007\n\u0006flip_5\n\u0006val_25\n\u0006val_29\n\u0006val_33\n\u0006val_33\u0012\u0007slice_3\u001a\fnode_slice_3\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/slice_3: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_3 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%cat_2, 2, 0, 9223372036854775807, 2), kwargs = {})JS\n\u001apkg.torch.onnx.name_scopes\u00125['', 'septimbre_amt', 'septimbre_amt.cqt', 'slice_3']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n\u0001\n\u0007slice_3\n\u001dseptimbre_amt.cqt.cqt_kernels\u0012\bconv1d_8\u001a\u000enode_Conv_1562\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u000f\n\u0004pads@\u0001@\u0001\u0001\u0007*\u000e\n\u0007strides@@\u0001\u0007\n\b\n\bconv1d_8\n\u0006val_47\u0012\u0006view_2\u001a\u000bnode_view_2\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0001\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/view_2: aten.view.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.view.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012|%view_2 : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%conv1d_8, [1, 2, 36, -1]), kwargs = {})JR\n\u001apkg.torch.onnx.name_scopes\u00124['', 'septimbre_amt', 'septimbre_amt.cqt', 'view_2']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 326, in forward\n    CQT_results.append(CQT_result.view(CQT_result.size(0), 2, self.bins_per_octave, -1))\n\u0001\n\u0007slice_3\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\bconv1d_9\u001a\u000enode_Conv_1563\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\bconv1d_9\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0006flip_6\u001a\u000bnode_flip_6\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_6: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%flip_6 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_9, [-1]), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_6']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0001\n\u0006flip_6\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\tconv1d_10\u001a\u000enode_Conv_1564\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\tconv1d_10\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0006flip_7\u001a\u000bnode_flip_7\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_7: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012s%flip_7 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_10, [-1]), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_7']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0007\n\u0006flip_7\n\u0006val_25\n\u0006val_29\n\u0006val_33\n\u0006val_33\u0012\u0007slice_4\u001a\fnode_slice_4\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/slice_4: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_4 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%cat_3, 2, 0, 9223372036854775807, 2), kwargs = {})JS\n\u001apkg.torch.onnx.name_scopes\u00125['', 'septimbre_amt', 'septimbre_amt.cqt', 'slice_4']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n\u0001\n\u0007slice_4\n\u001dseptimbre_amt.cqt.cqt_kernels\u0012\tconv1d_11\u001a\u000enode_Conv_1565\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u000f\n\u0004pads@\u0001@\u0001\u0001\u0007*\u000e\n\u0007strides@ \u0001\u0007\n\b\n\tconv1d_11\n\u0006val_47\u0012\u0006view_3\u001a\u000bnode_view_3\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0001\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/view_3: aten.view.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.view.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012}%view_3 : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%conv1d_11, [1, 2, 36, -1]), kwargs = {})JR\n\u001apkg.torch.onnx.name_scopes\u00124['', 'septimbre_amt', 'septimbre_amt.cqt', 'view_3']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 326, in forward\n    CQT_results.append(CQT_result.view(CQT_result.size(0), 2, self.bins_per_octave, -1))\n\u0001\n\u0007slice_4\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\tconv1d_12\u001a\u000enode_Conv_1566\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\tconv1d_12\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0006flip_8\u001a\u000bnode_flip_8\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_8: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012s%flip_8 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_12, [-1]), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_8']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0001\n\u0006flip_8\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\tconv1d_13\u001a\u000enode_Conv_1567\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\tconv1d_13\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0006flip_9\u001a\u000bnode_flip_9\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_9: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012s%flip_9 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_13, [-1]), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_9']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0007\n\u0006flip_9\n\u0006val_25\n\u0006val_29\n\u0006val_33\n\u0006val_33\u0012\u0007slice_5\u001a\fnode_slice_5\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/slice_5: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_5 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%cat_4, 2, 0, 9223372036854775807, 2), kwargs = {})JS\n\u001apkg.torch.onnx.name_scopes\u00125['', 'septimbre_amt', 'septimbre_amt.cqt', 'slice_5']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n\u0001\n\u0007slice_5\n\u001dseptimbre_amt.cqt.cqt_kernels\u0012\tconv1d_14\u001a\u000enode_Conv_1568\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u000f\n\u0004pads@\u0001@\u0001\u0001\u0007*\u000e\n\u0007strides@\u0010\u0001\u0007\n\b\n\tconv1d_14\n\u0006val_47\u0012\u0006view_4\u001a\u000bnode_view_4\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0001\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/view_4: aten.view.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.view.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012}%view_4 : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%conv1d_14, [1, 2, 36, -1]), kwargs = {})JR\n\u001apkg.torch.onnx.name_scopes\u00124['', 'septimbre_amt', 'septimbre_amt.cqt', 'view_4']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 326, in forward\n    CQT_results.append(CQT_result.view(CQT_result.size(0), 2, self.bins_per_octave, -1))\n\u0001\n\u0007slice_5\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\tconv1d_15\u001a\u000enode_Conv_1569\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\tconv1d_15\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0007flip_10\u001a\fnode_flip_10\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_10: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012t%flip_10 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_15, [-1]), kwargs = {})Jq\n\u001apkg.torch.onnx.name_scopes\u0012S['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_10']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0001\n\u0007flip_10\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\tconv1d_16\u001a\u000enode_Conv_1570\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\tconv1d_16\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0007flip_11\u001a\fnode_flip_11\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_11: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012t%flip_11 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_16, [-1]), kwargs = {})Jq\n\u001apkg.torch.onnx.name_scopes\u0012S['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_11']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0007\n\u0007flip_11\n\u0006val_25\n\u0006val_29\n\u0006val_33\n\u0006val_33\u0012\u0007slice_6\u001a\fnode_slice_6\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/slice_6: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_6 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%cat_5, 2, 0, 9223372036854775807, 2), kwargs = {})JS\n\u001apkg.torch.onnx.name_scopes\u00125['', 'septimbre_amt', 'septimbre_amt.cqt', 'slice_6']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n\u0001\n\u0007slice_6\n\u001dseptimbre_amt.cqt.cqt_kernels\u0012\tconv1d_17\u001a\u000enode_Conv_1571\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u000f\n\u0004pads@\u0001@\u0001\u0001\u0007*\u000e\n\u0007strides@\b\u0001\u0007\n\b\n\tconv1d_17\n\u0006val_47\u0012\u0006view_5\u001a\u000bnode_view_5\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0001\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/view_5: aten.view.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.view.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012}%view_5 : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%conv1d_17, [1, 2, 36, -1]), kwargs = {})JR\n\u001apkg.torch.onnx.name_scopes\u00124['', 'septimbre_amt', 'septimbre_amt.cqt', 'view_5']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 326, in forward\n    CQT_results.append(CQT_result.view(CQT_result.size(0), 2, self.bins_per_octave, -1))\n\u0001\n\u0007slice_6\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\tconv1d_18\u001a\u000enode_Conv_1572\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\tconv1d_18\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0007flip_12\u001a\fnode_flip_12\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_12: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012t%flip_12 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_18, [-1]), kwargs = {})Jq\n\u001apkg.torch.onnx.name_scopes\u0012S['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_12']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0001\n\u0007flip_12\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\tconv1d_19\u001a\u000enode_Conv_1573\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\tconv1d_19\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0007flip_13\u001a\fnode_flip_13\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_13: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012t%flip_13 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_19, [-1]), kwargs = {})Jq\n\u001apkg.torch.onnx.name_scopes\u0012S['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_13']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0007\n\u0007flip_13\n\u0006val_25\n\u0006val_29\n\u0006val_33\n\u0006val_33\u0012\u0007slice_7\u001a\fnode_slice_7\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/slice_7: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_7 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%cat_6, 2, 0, 9223372036854775807, 2), kwargs = {})JS\n\u001apkg.torch.onnx.name_scopes\u00125['', 'septimbre_amt', 'septimbre_amt.cqt', 'slice_7']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n\u0001\n\u0007slice_7\n\u001dseptimbre_amt.cqt.cqt_kernels\u0012\tconv1d_20\u001a\u000enode_Conv_1574\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u000f\n\u0004pads@\u0001@\u0001\u0001\u0007*\u000e\n\u0007strides@\u0004\u0001\u0007\n\b\n\tconv1d_20\n\u0006val_47\u0012\u0006view_6\u001a\u000bnode_view_6\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0001\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/view_6: aten.view.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.view.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012}%view_6 : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%conv1d_20, [1, 2, 36, -1]), kwargs = {})JR\n\u001apkg.torch.onnx.name_scopes\u00124['', 'septimbre_amt', 'septimbre_amt.cqt', 'view_6']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 326, in forward\n    CQT_results.append(CQT_result.view(CQT_result.size(0), 2, self.bins_per_octave, -1))\n\u0001\n\u0007slice_7\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\tconv1d_21\u001a\u000enode_Conv_1575\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\tconv1d_21\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0007flip_14\u001a\fnode_flip_14\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_14: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012t%flip_14 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_21, [-1]), kwargs = {})Jq\n\u001apkg.torch.onnx.name_scopes\u0012S['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_14']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0001\n\u0007flip_14\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\tconv1d_22\u001a\u000enode_Conv_1576\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\r\n\u0004pads@\u0010@\u0010\u0001\u0007*\u000e\n\u0007strides@\u0001\u0001\u0007\n\t\n\tconv1d_22\n\u0005val_9\n\u0006val_10\n\u0005val_9\n\u0005val_9\u0012\u0007flip_15\u001a\fnode_flip_15\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/septimbre_amt.cqt.filtfilt: model.CQT.FIRfiltfilt/flip_15: aten.flip.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'model.CQT.FIRfiltfilt', 'aten.flip.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012t%flip_15 : [num_users=1] = call_function[target=torch.ops.aten.flip.default](args = (%conv1d_22, [-1]), kwargs = {})Jq\n\u001apkg.torch.onnx.name_scopes\u0012S['', 'septimbre_amt', 'septimbre_amt.cqt', 'septimbre_amt.cqt.filtfilt', 'flip_15']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 210, in forward\n    channels = [self.filtfilt(x[:, i:i+1]) for i in range(x.size(1))]\n\u0007\n\u0007flip_15\n\u0006val_25\n\u0006val_29\n\u0006val_33\n\u0006val_33\u0012\u0007slice_8\u001a\fnode_slice_8\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/slice_8: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_8 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%cat_7, 2, 0, 9223372036854775807, 2), kwargs = {})JS\n\u001apkg.torch.onnx.name_scopes\u00125['', 'septimbre_amt', 'septimbre_amt.cqt', 'slice_8']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 324, in forward\n    x = self.down2sample(x)\n\u0001\n\u0007slice_8\n\u001dseptimbre_amt.cqt.cqt_kernels\u0012\tconv1d_23\u001a\u000enode_Conv_1577\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0010\n\tdilations@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u000f\n\u0004pads@\u0001@\u0001\u0001\u0007*\u000e\n\u0007strides@\u0002\u0001\u0007\n\b\n\tconv1d_23\n\u0006val_47\u0012\u0006view_7\u001a\u000bnode_view_7\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0001\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/view_7: aten.view.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012i['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.view.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012}%view_7 : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%conv1d_23, [1, 2, 36, -1]), kwargs = {})JR\n\u001apkg.torch.onnx.name_scopes\u00124['', 'septimbre_amt', 'septimbre_amt.cqt', 'view_7']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 326, in forward\n    CQT_results.append(CQT_result.view(CQT_result.size(0), 2, self.bins_per_octave, -1))\n\b\n\u0006view_7\n\u0006view_6\n\u0006view_5\n\u0006view_4\n\u0006view_3\n\u0006view_2\n\u0006view_1\n\u0004view\u0012\u0005cat_8\u001a\nnode_cat_8\"\u0006Concat*\u000b\n\u0004axis\u0018\u0002\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.cqt: model.CQT.CQTsmall_fir/cat_8: aten.cat.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012h['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'model.CQT.CQTsmall_fir', 'aten.cat.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%cat_8 : [num_users=1] = call_function[target=torch.ops.aten.cat.default](args = ([%view_7, %view_6, %view_5, %view_4, %view_3, %view_2, %view_1, %view], 2), kwargs = {})JQ\n\u001apkg.torch.onnx.name_scopes\u00123['', 'septimbre_amt', 'septimbre_amt.cqt', 'cat_8']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 137, in forward\n    x = self.cqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/CQT.py\", line 328, in forward\n    return torch.cat(CQT_results, dim=2)\n\t\n\u0005cat_8\n\u0007val_349\u0012\u0005pow_1\u001a\nnode_pow_1\"\u0003PowJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/pow_1: aten.pow.Tensor_ScalarJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'aten.pow.Tensor_Scalar']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%pow_1 : [num_users=1] = call_function[target=torch.ops.aten.pow.Tensor_Scalar](args = (%cat_8, 2), kwargs = {})Jl\n\u001apkg.torch.onnx.name_scopes\u0012N['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'pow_1']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 236, in forward\n    eng = torch.sum(x.pow(2), dim=1, keepdim=True)\n\t\n\u0005pow_1\n\u0007val_353\u0012\u0005sum_1\u001a\nnode_sum_1\"\tReduceSum*\u000f\n\bkeepdims\u0018\u0001\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/sum_1: aten.sum.dim_IntListJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'aten.sum.dim_IntList']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012v%sum_1 : [num_users=2] = call_function[target=torch.ops.aten.sum.dim_IntList](args = (%pow_1, [1], True), kwargs = {})Jl\n\u001apkg.torch.onnx.name_scopes\u0012N['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'sum_1']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 236, in forward\n    eng = torch.sum(x.pow(2), dim=1, keepdim=True)\n\t\n\u0005sum_1\n\u0006val_33\u0012\u0005sum_2\u001a\nnode_sum_2\"\tReduceSum*\u000f\n\bkeepdims\u0018\u0001\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/sum_2: aten.sum.dim_IntListJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'aten.sum.dim_IntList']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012v%sum_2 : [num_users=1] = call_function[target=torch.ops.aten.sum.dim_IntList](args = (%sum_1, [2], True), kwargs = {})Jl\n\u001apkg.torch.onnx.name_scopes\u0012N['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'sum_2']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 238, in forward\n    eng_per_frame = torch.sum(eng, dim=2, keepdim=True)\n\t\n\u0005sum_2\n\u0007val_632\u0012\u0007val_359\u001a\u0013node_ReduceMean_359\"\nReduceMean*\u000f\n\bkeepdims\u0018\u0001\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0005sum_2\n\u0007val_359\u0012\u0007val_360\u001a\fnode_Sub_360\"\u0003SubJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0007val_360\n\u0007val_360\u0012\u0007val_361\u001a\fnode_Mul_361\"\u0003MulJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0007val_361\n\u0007val_632\u0012\u0007val_362\u001a\u0013node_ReduceMean_362\"\nReduceMean*\u000f\n\bkeepdims\u0018\u0000\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0005sum_2\u0012\u0007val_363\u001a\u000enode_Shape_363\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0007val_363\n\u0007val_632\u0012\u0007val_364\u001a\u000fnode_Gather_364\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0007val_364\u0012\u0007val_365\u001a\u0013node_ReduceProd_365\"\nReduceProd*\u000f\n\bkeepdims\u0018\u0000\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n3\n\u0007val_365\u0012\u0007val_366\u001a\u000enode_Cast_1438\"\u0004Cast*\t\n\u0002to\u0018\u0001\u0001\u0002\n\t\n\u0007val_362\n\u0007val_366\u0012\u0007val_367\u001a\fnode_Mul_367\"\u0003MulJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0007val_366\n\u0007val_369\u0012\u0007val_370\u001a\fnode_Sub_370\"\u0003SubJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0007val_367\n\u0007val_370\u0012\u0003var\u001a\bnode_var\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/var: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%var : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%sum_2, [3], 1.0), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'var']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\n\n\u0003var\n\u0007val_379\u0012\u0007val_380\u001a\u0010node_Reshape_380\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/broadcast_in_dim: prims.broadcast_in_dim.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'prims.broadcast_in_dim.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%broadcast_in_dim : [num_users=1] = call_function[target=torch.ops.prims.broadcast_in_dim.default](args = (%var, [1, 1, 1, 1], [0, 1, 2]), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'broadcast_in_dim']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0007val_380\u0012\u0004sqrt\u001a\tnode_sqrt\"\u0004SqrtJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/sqrt: aten.sqrt.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'aten.sqrt.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012s%sqrt : [num_users=1] = call_function[target=torch.ops.aten.sqrt.default](args = (%broadcast_in_dim,), kwargs = {})Jk\n\u001apkg.torch.onnx.name_scopes\u0012M['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'sqrt']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 241, in forward\n    std = torch.std(eng_per_frame, dim=3, keepdim=True, unbiased=True)\n\t\n\u0005sum_1\n\u0007val_382\u0012\u0007add_607\u001a\fnode_add_607\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/add_607: aten.add.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'aten.add.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%add_607 : [num_users=1] = call_function[target=torch.ops.aten.add.Tensor](args = (%sum_1, 1.01e-08), kwargs = {})Jn\n\u001apkg.torch.onnx.name_scopes\u0012P['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'add_607']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 249, in forward\n    return torch.log(eng + 1.01e-8) - torch.log(std)\n\b\n\u0007add_607\u0012\u0003log\u001a\bnode_log\"\u0003LogJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/log: aten.log.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'aten.log.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012h%log : [num_users=1] = call_function[target=torch.ops.aten.log.default](args = (%add_607,), kwargs = {})Jj\n\u001apkg.torch.onnx.name_scopes\u0012L['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'log']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 249, in forward\n    return torch.log(eng + 1.01e-8) - torch.log(std)\n\b\n\u0004sqrt\u0012\u0005log_1\u001a\nnode_log_1\"\u0003LogJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/log_1: aten.log.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'aten.log.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012g%log_1 : [num_users=1] = call_function[target=torch.ops.aten.log.default](args = (%sqrt,), kwargs = {})Jl\n\u001apkg.torch.onnx.name_scopes\u0012N['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'log_1']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 249, in forward\n    return torch.log(eng + 1.01e-8) - torch.log(std)\n\t\n\u0003log\n\u0005log_1\u0012\u0006sub_94\u001a\u000bnode_sub_94\"\u0003SubJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.eng: model.layers.EnergyNorm/sub_94: aten.sub.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.EnergyNorm', 'aten.sub.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012m%sub_94 : [num_users=8] = call_function[target=torch.ops.aten.sub.Tensor](args = (%log, %log_1), kwargs = {})Jm\n\u001apkg.torch.onnx.name_scopes\u0012O['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.eng', 'sub_94']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 20, in forward\n    eng = self.eng(x)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 249, in forward\n    return torch.log(eng + 1.01e-8) - torch.log(std)\n\n\n\u0007val_383\n\u000fsym_size_int_85\u0012\u0007add_617\u001a\fnode_add_617\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_617: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012h%add_617 : [num_users=1] = call_function[target=operator.add](args = (1, %sym_size_int_85), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_617']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_617\n\u0006val_30\u0012\ffloordiv_359\u001a\u0011node_floordiv_359\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/floordiv_359: <built-in function floordiv>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function floordiv>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%floordiv_359 : [num_users=1] = call_function[target=operator.floordiv](args = (%add_617, 2), kwargs = {})Jt\n\u001apkg.torch.onnx.name_scopes\u0012V['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'floordiv_359']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\t\n\u0007val_383\n\ffloordiv_359\u0012\u0007add_618\u001a\fnode_add_618\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_618: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\n\u0016pkg.torch.onnx.fx_node\u0012e%add_618 : [num_users=1] = call_function[target=operator.add](args = (1, %floordiv_359), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_618']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_618\n\u0006val_30\u0012\ffloordiv_360\u001a\u0011node_floordiv_360\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/floordiv_360: <built-in function floordiv>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function floordiv>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%floordiv_360 : [num_users=1] = call_function[target=operator.floordiv](args = (%add_618, 2), kwargs = {})Jt\n\u001apkg.torch.onnx.name_scopes\u0012V['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'floordiv_360']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\t\n\u0007val_383\n\ffloordiv_360\u0012\u0007add_619\u001a\fnode_add_619\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_619: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\n\u0016pkg.torch.onnx.fx_node\u0012e%add_619 : [num_users=1] = call_function[target=operator.add](args = (1, %floordiv_360), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_619']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_619\n\u0006val_30\u0012\ffloordiv_361\u001a\u0011node_floordiv_361\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/floordiv_361: <built-in function floordiv>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function floordiv>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%floordiv_361 : [num_users=1] = call_function[target=operator.floordiv](args = (%add_619, 2), kwargs = {})Jt\n\u001apkg.torch.onnx.name_scopes\u0012V['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'floordiv_361']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\t\n\u0007val_383\n\ffloordiv_361\u0012\u0007add_620\u001a\fnode_add_620\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_620: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\n\u0016pkg.torch.onnx.fx_node\u0012e%add_620 : [num_users=1] = call_function[target=operator.add](args = (1, %floordiv_361), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_620']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_620\n\u0006val_30\u0012\ffloordiv_362\u001a\u0011node_floordiv_362\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/floordiv_362: <built-in function floordiv>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function floordiv>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%floordiv_362 : [num_users=1] = call_function[target=operator.floordiv](args = (%add_620, 2), kwargs = {})Jt\n\u001apkg.torch.onnx.name_scopes\u0012V['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'floordiv_362']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\t\n\u0007val_383\n\ffloordiv_362\u0012\u0007add_621\u001a\fnode_add_621\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_621: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\n\u0016pkg.torch.onnx.fx_node\u0012e%add_621 : [num_users=1] = call_function[target=operator.add](args = (1, %floordiv_362), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_621']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_621\n\u0006val_30\u0012\ffloordiv_363\u001a\u0011node_floordiv_363\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/floordiv_363: <built-in function floordiv>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function floordiv>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%floordiv_363 : [num_users=1] = call_function[target=operator.floordiv](args = (%add_621, 2), kwargs = {})Jt\n\u001apkg.torch.onnx.name_scopes\u0012V['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'floordiv_363']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\t\n\u0007val_383\n\ffloordiv_363\u0012\u0007add_622\u001a\fnode_add_622\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_622: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\n\u0016pkg.torch.onnx.fx_node\u0012e%add_622 : [num_users=1] = call_function[target=operator.add](args = (1, %floordiv_363), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_622']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_622\n\u0006val_30\u0012\ffloordiv_364\u001a\u0011node_floordiv_364\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/floordiv_364: <built-in function floordiv>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function floordiv>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%floordiv_364 : [num_users=1] = call_function[target=operator.floordiv](args = (%add_622, 2), kwargs = {})Jt\n\u001apkg.torch.onnx.name_scopes\u0012V['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'floordiv_364']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\t\n\u0007val_383\n\ffloordiv_364\u0012\u0007add_623\u001a\fnode_add_623\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_623: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\n\u0016pkg.torch.onnx.fx_node\u0012e%add_623 : [num_users=1] = call_function[target=operator.add](args = (1, %floordiv_364), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_623']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_623\n\u0006val_30\u0012\ffloordiv_365\u001a\u0011node_floordiv_365\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/floordiv_365: <built-in function floordiv>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function floordiv>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%floordiv_365 : [num_users=1] = call_function[target=operator.floordiv](args = (%add_623, 2), kwargs = {})Jt\n\u001apkg.torch.onnx.name_scopes\u0012V['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'floordiv_365']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\t\n\u0007val_383\n\ffloordiv_365\u0012\u0007add_624\u001a\fnode_add_624\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_624: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\n\u0016pkg.torch.onnx.fx_node\u0012e%add_624 : [num_users=1] = call_function[target=operator.add](args = (1, %floordiv_365), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_624']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_624\n\u0006val_30\u0012\ffloordiv_366\u001a\u0011node_floordiv_366\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/floordiv_366: <built-in function floordiv>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function floordiv>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%floordiv_366 : [num_users=1] = call_function[target=operator.floordiv](args = (%add_624, 2), kwargs = {})Jt\n\u001apkg.torch.onnx.name_scopes\u0012V['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'floordiv_366']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\t\n\u0007val_384\n\ffloordiv_366\u0012\u0007add_625\u001a\fnode_add_625\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_625: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012f%add_625 : [num_users=1] = call_function[target=operator.add](args = (-1, %floordiv_366), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_625']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_625\n\u0006val_30\u0012\ffloordiv_367\u001a\u0011node_floordiv_367\"\u0003DivJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/floordiv_367: <built-in function floordiv>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function floordiv>']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%floordiv_367 : [num_users=1] = call_function[target=operator.floordiv](args = (%add_625, 2), kwargs = {})Jt\n\u001apkg.torch.onnx.name_scopes\u0012V['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'floordiv_367']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\t\n\u0007val_383\n\ffloordiv_367\u0012\u0007add_626\u001a\fnode_add_626\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/add_626: <built-in function add>J\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', '<built-in function add>']J\n\u0016pkg.torch.onnx.fx_node\u0012e%add_626 : [num_users=2] = call_function[target=operator.add](args = (1, %floordiv_367), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'add_626']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007add_626\n\u0005val_9\u0012\u0007val_390\u001a\u0010node_Reshape_390\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/zeros: aten.zeros.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.zeros.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%zeros : [num_users=3] = call_function[target=torch.ops.aten.zeros.default](args = ([1, 8, 252, %add_626],), kwargs = {dtype: torch.float32, device: cpu, pin_memory: False})Jm\n\u001apkg.torch.onnx.name_scopes\u0012O['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'zeros']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007val_353\n\bval_1177\n\u0007val_484\n\u0007val_390\u0012\u0007val_391\u001a\u000fnode_Concat_391\"\u0006Concat*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/zeros: aten.zeros.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.zeros.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%zeros : [num_users=3] = call_function[target=torch.ops.aten.zeros.default](args = ([1, 8, 252, %add_626],), kwargs = {dtype: torch.float32, device: cpu, pin_memory: False})Jm\n\u001apkg.torch.onnx.name_scopes\u0012O['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'zeros']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0007val_385\n\u0007val_391\u0012\u0005zeros\u001a\nnode_zeros\"\u0006ExpandJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/zeros: aten.zeros.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.zeros.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%zeros : [num_users=3] = call_function[target=torch.ops.aten.zeros.default](args = ([1, 8, 252, %add_626],), kwargs = {dtype: torch.float32, device: cpu, pin_memory: False})Jm\n\u001apkg.torch.onnx.name_scopes\u0012O['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'zeros']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 26, in forward\n    shifted = torch.zeros((batch_size, channels * len(self.shifts), self.output_bins, length), device=x.device, dtype=x.dtype)\n\n\n\u0006sub_94\n\u0006val_25\n\u0007val_398\n\u0006val_33\n\u0007val_353\u0012\u0007slice_9\u001a\fnode_slice_9\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_9: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012v%slice_9 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%sub_94, 2, 0, 216), kwargs = {})Jo\n\u001apkg.torch.onnx.name_scopes\u0012Q['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_9']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0005zeros\n\u0006val_25\n\u0007val_353\n\u0007val_353\n\u0007val_353\u0012\bslice_14\u001a\rnode_slice_14\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_14: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012t%slice_14 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%zeros, 1, 0, 1), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_14']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007slice_9\u0012\u0007val_476\u001a\u0012node_Transpose_476\"\tTranspose*\u0011\n\u0004perm@\u0003@\u0001@\u0002@\u0000\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_15, %copy, 3, 0, 9223372036854775807), kwargs = {})Ju\n\u001apkg.torch.onnx.name_scopes\u0012W['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n0\n\u0007val_476\u0012\u0007val_478\u001a\u0012node_Identity_1615\"\bIdentity\n\n\n\bslice_14\u0012\u0007val_480\u001a\u000enode_Shape_480\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_1: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_14, %slice_scatter, 2, 36, 252), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_1']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007val_480\n\u0006val_30\u0012\u0007val_481\u001a\u000fnode_Gather_481\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_1: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_14, %slice_scatter, 2, 36, 252), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_1']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0006val_22\n\u0007val_481\n\u0007val_383\u0012\u0007val_482\u001a\u000enode_Range_482\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_1: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_14, %slice_scatter, 2, 36, 252), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_1']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007val_482\n\u0007val_483\n\u0007val_484\n\u0006val_25\n\u0007val_353\u0012\u0007val_486\u001a\u000enode_Slice_486\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_1: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_14, %slice_scatter, 2, 36, 252), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_1']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007val_486\n\u0005val_9\u0012\u0007val_487\u001a\u0012node_Unsqueeze_487\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_1: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_14, %slice_scatter, 2, 36, 252), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_1']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\nE\n\u0007val_478\u0012\u0007val_488\u001a\u0013node_Transpose_1580\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0003@\u0000\u0001\u0007\n\n\n\bslice_14\u0012\u0007val_489\u001a\u0012node_Transpose_489\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0000@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_1: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_14, %slice_scatter, 2, 36, 252), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_1']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007val_489\n\u0007val_487\n\u0007val_488\u0012\u0007val_490\u001a\u0012node_ScatterND_490\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_1: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_14, %slice_scatter, 2, 36, 252), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_1']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0005zeros\u0012\u0007val_492\u001a\u000enode_Shape_492\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_2: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_2 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%zeros, %slice_scatter_1, 1, 0, 1), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_2']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007val_492\n\u0007val_383\u0012\u0007val_493\u001a\u000fnode_Gather_493\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_2: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_2 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%zeros, %slice_scatter_1, 1, 0, 1), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_2']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0006val_22\n\u0007val_493\n\u0007val_383\u0012\u0007val_494\u001a\u000enode_Range_494\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_2: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_2 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%zeros, %slice_scatter_1, 1, 0, 1), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_2']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007val_494\n\u0006val_25\n\u0007val_353\n\u0006val_25\n\u0007val_353\u0012\u0007val_498\u001a\u000enode_Slice_498\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_2: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_2 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%zeros, %slice_scatter_1, 1, 0, 1), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_2']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007val_498\n\u0005val_9\u0012\u0007val_499\u001a\u0012node_Unsqueeze_499\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_2: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_2 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%zeros, %slice_scatter_1, 1, 0, 1), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_2']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\nE\n\u0007val_490\u0012\u0007val_500\u001a\u0013node_Transpose_1581\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0002@\u0000@\u0003\u0001\u0007\n\n\n\u0005zeros\u0012\u0007val_501\u001a\u0012node_Transpose_501\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_2: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_2 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%zeros, %slice_scatter_1, 1, 0, 1), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_2']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007val_501\n\u0007val_499\n\u0007val_500\u0012\u0007val_502\u001a\u0012node_ScatterND_502\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_2: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_2 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%zeros, %slice_scatter_1, 1, 0, 1), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_2']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0007val_502\u0012\u000fslice_scatter_2\u001a\u0014node_slice_scatter_2\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_2: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_2 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%zeros, %slice_scatter_1, 1, 0, 1), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_2']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 30, in forward\n    shifted[:, i*channels:(i+1)*channels, -shift:self.output_bins, :] = x[:, :, :self.output_bins+shift, :]\n\n\n\u0006sub_94\n\u0006val_25\n\u0007val_484\n\u0006val_33\n\u0007val_353\u0012\bslice_19\u001a\rnode_slice_19\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_19: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%slice_19 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%sub_94, 2, 0, 252), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_19']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bslice_19\u0012\u0007val_562\u001a\u0012node_Transpose_562\"\tTranspose*\u0011\n\u0004perm@\u0003@\u0001@\u0002@\u0000\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_3: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_3 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_25, %copy_1, 3, 0, 9223372036854775807), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_3']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n0\n\u0007val_562\u0012\u0007val_564\u001a\u0012node_Identity_1616\"\bIdentity\n\n\n\u000fslice_scatter_2\u0012\u0007val_566\u001a\u000enode_Shape_566\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_4: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_4 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_2, %slice_scatter_3, 1, 1, 2), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_4']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_566\n\u0007val_383\u0012\u0007val_567\u001a\u000fnode_Gather_567\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_4: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_4 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_2, %slice_scatter_3, 1, 1, 2), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_4']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\u0007val_567\n\u0007val_383\u0012\u0007val_568\u001a\u000enode_Range_568\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_4: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_4 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_2, %slice_scatter_3, 1, 1, 2), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_4']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_568\n\u0007val_353\n\u0006val_33\n\u0006val_25\n\u0007val_353\u0012\u0007val_572\u001a\u000enode_Slice_572\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_4: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_4 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_2, %slice_scatter_3, 1, 1, 2), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_4']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_572\n\u0005val_9\u0012\u0007val_573\u001a\u0012node_Unsqueeze_573\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_4: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_4 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_2, %slice_scatter_3, 1, 1, 2), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_4']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nE\n\u0007val_564\u0012\u0007val_574\u001a\u0013node_Transpose_1584\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0003@\u0002@\u0000\u0001\u0007\n\n\n\u000fslice_scatter_2\u0012\u0007val_575\u001a\u0012node_Transpose_575\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_4: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_4 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_2, %slice_scatter_3, 1, 1, 2), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_4']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_575\n\u0007val_573\n\u0007val_574\u0012\u0007val_576\u001a\u0012node_ScatterND_576\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_4: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_4 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_2, %slice_scatter_3, 1, 1, 2), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_4']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_576\u0012\u000fslice_scatter_4\u001a\u0014node_slice_scatter_4\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_4: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_4 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_2, %slice_scatter_3, 1, 1, 2), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_4']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006sub_94\n\u0007val_483\n\u0007val_484\n\u0006val_33\n\u0007val_353\u0012\bslice_28\u001a\rnode_slice_28\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_28: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012x%slice_28 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%sub_94, 2, 36, 252), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_28']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u000fslice_scatter_4\n\u0006val_33\n\u0007val_632\n\u0007val_353\n\u0007val_353\u0012\bslice_36\u001a\rnode_slice_36\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_36: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012~%slice_36 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_scatter_4, 1, 2, 3), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_36']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bslice_28\u0012\u0007val_656\u001a\u0012node_Transpose_656\"\tTranspose*\u0011\n\u0004perm@\u0003@\u0001@\u0002@\u0000\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_5: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_5 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_37, %copy_2, 3, 0, 9223372036854775807), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_5']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n0\n\u0007val_656\u0012\u0007val_658\u001a\u0012node_Identity_1617\"\bIdentity\n\n\n\bslice_36\u0012\u0007val_660\u001a\u000enode_Shape_660\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_6: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_6 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_36, %slice_scatter_5, 2, 0, 216), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_6']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_660\n\u0006val_30\u0012\u0007val_661\u001a\u000fnode_Gather_661\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_6: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_6 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_36, %slice_scatter_5, 2, 0, 216), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_6']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\u0007val_661\n\u0007val_383\u0012\u0007val_662\u001a\u000enode_Range_662\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_6: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_6 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_36, %slice_scatter_5, 2, 0, 216), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_6']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_662\n\u0006val_25\n\u0007val_398\n\u0006val_25\n\u0007val_353\u0012\u0007val_666\u001a\u000enode_Slice_666\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_6: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_6 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_36, %slice_scatter_5, 2, 0, 216), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_6']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_666\n\u0005val_9\u0012\u0007val_667\u001a\u0012node_Unsqueeze_667\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_6: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_6 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_36, %slice_scatter_5, 2, 0, 216), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_6']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nE\n\u0007val_658\u0012\u0007val_668\u001a\u0013node_Transpose_1587\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0003@\u0000\u0001\u0007\n\n\n\bslice_36\u0012\u0007val_669\u001a\u0012node_Transpose_669\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0000@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_6: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_6 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_36, %slice_scatter_5, 2, 0, 216), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_6']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_669\n\u0007val_667\n\u0007val_668\u0012\u0007val_670\u001a\u0012node_ScatterND_670\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_6: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_6 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_36, %slice_scatter_5, 2, 0, 216), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_6']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u000fslice_scatter_4\u0012\u0007val_672\u001a\u000enode_Shape_672\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_7: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_7 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_4, %slice_scatter_6, 1, 2, 3), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_7']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_672\n\u0007val_383\u0012\u0007val_673\u001a\u000fnode_Gather_673\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_7: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_7 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_4, %slice_scatter_6, 1, 2, 3), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_7']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\u0007val_673\n\u0007val_383\u0012\u0007val_674\u001a\u000enode_Range_674\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_7: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_7 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_4, %slice_scatter_6, 1, 2, 3), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_7']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_674\n\u0006val_33\n\u0007val_632\n\u0006val_25\n\u0007val_353\u0012\u0007val_678\u001a\u000enode_Slice_678\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_7: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_7 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_4, %slice_scatter_6, 1, 2, 3), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_7']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_678\n\u0005val_9\u0012\u0007val_679\u001a\u0012node_Unsqueeze_679\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_7: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_7 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_4, %slice_scatter_6, 1, 2, 3), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_7']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nE\n\u0007val_670\u0012\u0007val_680\u001a\u0013node_Transpose_1588\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0002@\u0000@\u0003\u0001\u0007\n\n\n\u000fslice_scatter_4\u0012\u0007val_681\u001a\u0012node_Transpose_681\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_7: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_7 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_4, %slice_scatter_6, 1, 2, 3), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_7']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_681\n\u0007val_679\n\u0007val_680\u0012\u0007val_682\u001a\u0012node_ScatterND_682\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_7: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_7 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_4, %slice_scatter_6, 1, 2, 3), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_7']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_682\u0012\u000fslice_scatter_7\u001a\u0014node_slice_scatter_7\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_7: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_7 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_4, %slice_scatter_6, 1, 2, 3), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_7']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006sub_94\n\u0007val_686\n\u0007val_484\n\u0006val_33\n\u0007val_353\u0012\bslice_41\u001a\rnode_slice_41\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_41: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012x%slice_41 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%sub_94, 2, 57, 252), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_41']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u000fslice_scatter_7\n\u0007val_632\n\u0007val_741\n\u0007val_353\n\u0007val_353\u0012\bslice_49\u001a\rnode_slice_49\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_49: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012~%slice_49 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_scatter_7, 1, 3, 4), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_49']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bslice_41\u0012\u0007val_765\u001a\u0012node_Transpose_765\"\tTranspose*\u0011\n\u0004perm@\u0003@\u0001@\u0002@\u0000\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_8: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_8 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_50, %copy_3, 3, 0, 9223372036854775807), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_8']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n0\n\u0007val_765\u0012\u0007val_767\u001a\u0012node_Identity_1618\"\bIdentity\n\n\n\bslice_49\u0012\u0007val_769\u001a\u000enode_Shape_769\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_9: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_9 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_49, %slice_scatter_8, 2, 0, 195), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_9']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_769\n\u0006val_30\u0012\u0007val_770\u001a\u000fnode_Gather_770\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_9: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_9 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_49, %slice_scatter_8, 2, 0, 195), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_9']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\u0007val_770\n\u0007val_383\u0012\u0007val_771\u001a\u000enode_Range_771\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_9: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_9 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_49, %slice_scatter_8, 2, 0, 195), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_9']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_771\n\u0006val_25\n\u0007val_773\n\u0006val_25\n\u0007val_353\u0012\u0007val_775\u001a\u000enode_Slice_775\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_9: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_9 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_49, %slice_scatter_8, 2, 0, 195), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_9']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_775\n\u0005val_9\u0012\u0007val_776\u001a\u0012node_Unsqueeze_776\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_9: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_9 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_49, %slice_scatter_8, 2, 0, 195), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_9']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nE\n\u0007val_767\u0012\u0007val_777\u001a\u0013node_Transpose_1591\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0003@\u0000\u0001\u0007\n\n\n\bslice_49\u0012\u0007val_778\u001a\u0012node_Transpose_778\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0000@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_9: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_9 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_49, %slice_scatter_8, 2, 0, 195), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_9']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_778\n\u0007val_776\n\u0007val_777\u0012\u0007val_779\u001a\u0012node_ScatterND_779\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_9: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_9 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_49, %slice_scatter_8, 2, 0, 195), kwargs = {})Jw\n\u001apkg.torch.onnx.name_scopes\u0012Y['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_9']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u000fslice_scatter_7\u0012\u0007val_781\u001a\u000enode_Shape_781\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_10: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_10 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_7, %slice_scatter_9, 1, 3, 4), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_10']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_781\n\u0007val_383\u0012\u0007val_782\u001a\u000fnode_Gather_782\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_10: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_10 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_7, %slice_scatter_9, 1, 3, 4), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_10']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\u0007val_782\n\u0007val_383\u0012\u0007val_783\u001a\u000enode_Range_783\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_10: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_10 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_7, %slice_scatter_9, 1, 3, 4), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_10']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_783\n\u0007val_632\n\u0007val_741\n\u0006val_25\n\u0007val_353\u0012\u0007val_787\u001a\u000enode_Slice_787\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_10: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_10 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_7, %slice_scatter_9, 1, 3, 4), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_10']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_787\n\u0005val_9\u0012\u0007val_788\u001a\u0012node_Unsqueeze_788\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_10: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_10 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_7, %slice_scatter_9, 1, 3, 4), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_10']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nE\n\u0007val_779\u0012\u0007val_789\u001a\u0013node_Transpose_1592\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0002@\u0000@\u0003\u0001\u0007\n\n\n\u000fslice_scatter_7\u0012\u0007val_790\u001a\u0012node_Transpose_790\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_10: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_10 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_7, %slice_scatter_9, 1, 3, 4), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_10']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_790\n\u0007val_788\n\u0007val_789\u0012\u0007val_791\u001a\u0012node_ScatterND_791\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_10: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_10 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_7, %slice_scatter_9, 1, 3, 4), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_10']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_791\u0012\u0010slice_scatter_10\u001a\u0015node_slice_scatter_10\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_10: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_10 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_7, %slice_scatter_9, 1, 3, 4), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_10']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006sub_94\n\u0007val_795\n\u0007val_484\n\u0006val_33\n\u0007val_353\u0012\bslice_54\u001a\rnode_slice_54\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_54: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012x%slice_54 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%sub_94, 2, 72, 252), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_54']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0010slice_scatter_10\n\u0007val_741\n\u0007val_850\n\u0007val_353\n\u0007val_353\u0012\bslice_62\u001a\rnode_slice_62\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_62: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012%slice_62 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_scatter_10, 1, 4, 5), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_62']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bslice_54\u0012\u0007val_874\u001a\u0012node_Transpose_874\"\tTranspose*\u0011\n\u0004perm@\u0003@\u0001@\u0002@\u0000\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_11: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_11 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_63, %copy_4, 3, 0, 9223372036854775807), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_11']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n0\n\u0007val_874\u0012\u0007val_876\u001a\u0012node_Identity_1619\"\bIdentity\n\n\n\bslice_62\u0012\u0007val_878\u001a\u000enode_Shape_878\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_12: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_12 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_62, %slice_scatter_11, 2, 0, 180), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_12']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_878\n\u0006val_30\u0012\u0007val_879\u001a\u000fnode_Gather_879\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_12: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_12 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_62, %slice_scatter_11, 2, 0, 180), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_12']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\u0007val_879\n\u0007val_383\u0012\u0007val_880\u001a\u000enode_Range_880\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_12: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_12 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_62, %slice_scatter_11, 2, 0, 180), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_12']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_880\n\u0006val_25\n\u0007val_882\n\u0006val_25\n\u0007val_353\u0012\u0007val_884\u001a\u000enode_Slice_884\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_12: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_12 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_62, %slice_scatter_11, 2, 0, 180), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_12']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_884\n\u0005val_9\u0012\u0007val_885\u001a\u0012node_Unsqueeze_885\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_12: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_12 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_62, %slice_scatter_11, 2, 0, 180), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_12']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nE\n\u0007val_876\u0012\u0007val_886\u001a\u0013node_Transpose_1595\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0003@\u0000\u0001\u0007\n\n\n\bslice_62\u0012\u0007val_887\u001a\u0012node_Transpose_887\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0000@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_12: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_12 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_62, %slice_scatter_11, 2, 0, 180), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_12']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_887\n\u0007val_885\n\u0007val_886\u0012\u0007val_888\u001a\u0012node_ScatterND_888\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_12: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_12 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_62, %slice_scatter_11, 2, 0, 180), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_12']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0010slice_scatter_10\u0012\u0007val_890\u001a\u000enode_Shape_890\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_13: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_13 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_10, %slice_scatter_12, 1, 4, 5), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_13']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_890\n\u0007val_383\u0012\u0007val_891\u001a\u000fnode_Gather_891\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_13: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_13 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_10, %slice_scatter_12, 1, 4, 5), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_13']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\u0007val_891\n\u0007val_383\u0012\u0007val_892\u001a\u000enode_Range_892\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_13: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_13 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_10, %slice_scatter_12, 1, 4, 5), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_13']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_892\n\u0007val_741\n\u0007val_850\n\u0006val_25\n\u0007val_353\u0012\u0007val_896\u001a\u000enode_Slice_896\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_13: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_13 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_10, %slice_scatter_12, 1, 4, 5), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_13']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_896\n\u0005val_9\u0012\u0007val_897\u001a\u0012node_Unsqueeze_897\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_13: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_13 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_10, %slice_scatter_12, 1, 4, 5), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_13']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nE\n\u0007val_888\u0012\u0007val_898\u001a\u0013node_Transpose_1596\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0002@\u0000@\u0003\u0001\u0007\n\n\n\u0010slice_scatter_10\u0012\u0007val_899\u001a\u0012node_Transpose_899\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_13: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_13 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_10, %slice_scatter_12, 1, 4, 5), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_13']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_899\n\u0007val_897\n\u0007val_898\u0012\u0007val_900\u001a\u0012node_ScatterND_900\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_13: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_13 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_10, %slice_scatter_12, 1, 4, 5), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_13']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_900\u0012\u0010slice_scatter_13\u001a\u0015node_slice_scatter_13\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_13: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_13 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_10, %slice_scatter_12, 1, 4, 5), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_13']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006sub_94\n\u0007val_904\n\u0007val_484\n\u0006val_33\n\u0007val_353\u0012\bslice_67\u001a\rnode_slice_67\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_67: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012x%slice_67 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%sub_94, 2, 84, 252), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_67']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0010slice_scatter_13\n\u0007val_850\n\u0007val_959\n\u0007val_353\n\u0007val_353\u0012\bslice_75\u001a\rnode_slice_75\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_75: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012%slice_75 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_scatter_13, 1, 5, 6), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_75']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bslice_67\u0012\u0007val_983\u001a\u0012node_Transpose_983\"\tTranspose*\u0011\n\u0004perm@\u0003@\u0001@\u0002@\u0000\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_14: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_14 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_76, %copy_5, 3, 0, 9223372036854775807), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_14']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n0\n\u0007val_983\u0012\u0007val_985\u001a\u0012node_Identity_1620\"\bIdentity\n\n\n\bslice_75\u0012\u0007val_987\u001a\u000enode_Shape_987\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_15: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_15 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_75, %slice_scatter_14, 2, 0, 168), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_15']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_987\n\u0006val_30\u0012\u0007val_988\u001a\u000fnode_Gather_988\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_15: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_15 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_75, %slice_scatter_14, 2, 0, 168), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_15']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\u0007val_988\n\u0007val_383\u0012\u0007val_989\u001a\u000enode_Range_989\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_15: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_15 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_75, %slice_scatter_14, 2, 0, 168), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_15']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_989\n\u0006val_25\n\u0007val_991\n\u0006val_25\n\u0007val_353\u0012\u0007val_993\u001a\u000enode_Slice_993\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_15: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_15 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_75, %slice_scatter_14, 2, 0, 168), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_15']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_993\n\u0005val_9\u0012\u0007val_994\u001a\u0012node_Unsqueeze_994\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_15: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_15 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_75, %slice_scatter_14, 2, 0, 168), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_15']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nE\n\u0007val_985\u0012\u0007val_995\u001a\u0013node_Transpose_1599\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0003@\u0000\u0001\u0007\n\n\n\bslice_75\u0012\u0007val_996\u001a\u0012node_Transpose_996\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0000@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_15: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_15 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_75, %slice_scatter_14, 2, 0, 168), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_15']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_996\n\u0007val_994\n\u0007val_995\u0012\u0007val_997\u001a\u0012node_ScatterND_997\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_15: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_15 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_75, %slice_scatter_14, 2, 0, 168), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_15']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0010slice_scatter_13\u0012\u0007val_999\u001a\u000enode_Shape_999\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_16: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_16 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_13, %slice_scatter_15, 1, 5, 6), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_16']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0007val_999\n\u0007val_383\u0012\bval_1000\u001a\u0010node_Gather_1000\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_16: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_16 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_13, %slice_scatter_15, 1, 5, 6), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_16']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\bval_1000\n\u0007val_383\u0012\bval_1001\u001a\u000fnode_Range_1001\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_16: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_16 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_13, %slice_scatter_15, 1, 5, 6), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_16']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1001\n\u0007val_850\n\u0007val_959\n\u0006val_25\n\u0007val_353\u0012\bval_1005\u001a\u000fnode_Slice_1005\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_16: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_16 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_13, %slice_scatter_15, 1, 5, 6), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_16']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1005\n\u0005val_9\u0012\bval_1006\u001a\u0013node_Unsqueeze_1006\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_16: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_16 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_13, %slice_scatter_15, 1, 5, 6), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_16']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nF\n\u0007val_997\u0012\bval_1007\u001a\u0013node_Transpose_1600\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0002@\u0000@\u0003\u0001\u0007\n\n\n\u0010slice_scatter_13\u0012\bval_1008\u001a\u0013node_Transpose_1008\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_16: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_16 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_13, %slice_scatter_15, 1, 5, 6), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_16']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1008\n\bval_1006\n\bval_1007\u0012\bval_1009\u001a\u0013node_ScatterND_1009\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_16: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_16 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_13, %slice_scatter_15, 1, 5, 6), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_16']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1009\u0012\u0010slice_scatter_16\u001a\u0015node_slice_scatter_16\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_16: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_16 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_13, %slice_scatter_15, 1, 5, 6), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_16']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006sub_94\n\bval_1013\n\u0007val_484\n\u0006val_33\n\u0007val_353\u0012\bslice_80\u001a\rnode_slice_80\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_80: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012x%slice_80 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%sub_94, 2, 93, 252), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_80']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0010slice_scatter_16\n\u0007val_959\n\bval_1068\n\u0007val_353\n\u0007val_353\u0012\bslice_88\u001a\rnode_slice_88\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_88: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012%slice_88 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_scatter_16, 1, 6, 7), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_88']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bslice_80\u0012\bval_1092\u001a\u0013node_Transpose_1092\"\tTranspose*\u0011\n\u0004perm@\u0003@\u0001@\u0002@\u0000\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_17: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_17 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_89, %copy_6, 3, 0, 9223372036854775807), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_17']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n2\n\bval_1092\u0012\bval_1094\u001a\u0012node_Identity_1621\"\bIdentity\n\n\n\bslice_88\u0012\bval_1096\u001a\u000fnode_Shape_1096\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_18: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_18 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_88, %slice_scatter_17, 2, 0, 159), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_18']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1096\n\u0006val_30\u0012\bval_1097\u001a\u0010node_Gather_1097\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_18: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_18 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_88, %slice_scatter_17, 2, 0, 159), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_18']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\bval_1097\n\u0007val_383\u0012\bval_1098\u001a\u000fnode_Range_1098\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_18: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_18 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_88, %slice_scatter_17, 2, 0, 159), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_18']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1098\n\u0006val_25\n\bval_1100\n\u0006val_25\n\u0007val_353\u0012\bval_1102\u001a\u000fnode_Slice_1102\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_18: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_18 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_88, %slice_scatter_17, 2, 0, 159), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_18']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1102\n\u0005val_9\u0012\bval_1103\u001a\u0013node_Unsqueeze_1103\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_18: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_18 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_88, %slice_scatter_17, 2, 0, 159), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_18']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nG\n\bval_1094\u0012\bval_1104\u001a\u0013node_Transpose_1603\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0003@\u0000\u0001\u0007\n\n\n\bslice_88\u0012\bval_1105\u001a\u0013node_Transpose_1105\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0000@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_18: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_18 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_88, %slice_scatter_17, 2, 0, 159), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_18']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1105\n\bval_1103\n\bval_1104\u0012\bval_1106\u001a\u0013node_ScatterND_1106\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_18: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_18 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_88, %slice_scatter_17, 2, 0, 159), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_18']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0010slice_scatter_16\u0012\bval_1108\u001a\u000fnode_Shape_1108\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_19: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_19 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_16, %slice_scatter_18, 1, 6, 7), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_19']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1108\n\u0007val_383\u0012\bval_1109\u001a\u0010node_Gather_1109\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_19: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_19 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_16, %slice_scatter_18, 1, 6, 7), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_19']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\bval_1109\n\u0007val_383\u0012\bval_1110\u001a\u000fnode_Range_1110\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_19: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_19 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_16, %slice_scatter_18, 1, 6, 7), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_19']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1110\n\u0007val_959\n\bval_1068\n\u0006val_25\n\u0007val_353\u0012\bval_1114\u001a\u000fnode_Slice_1114\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_19: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_19 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_16, %slice_scatter_18, 1, 6, 7), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_19']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1114\n\u0005val_9\u0012\bval_1115\u001a\u0013node_Unsqueeze_1115\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_19: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_19 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_16, %slice_scatter_18, 1, 6, 7), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_19']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nG\n\bval_1106\u0012\bval_1116\u001a\u0013node_Transpose_1604\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0002@\u0000@\u0003\u0001\u0007\n\n\n\u0010slice_scatter_16\u0012\bval_1117\u001a\u0013node_Transpose_1117\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_19: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_19 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_16, %slice_scatter_18, 1, 6, 7), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_19']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1117\n\bval_1115\n\bval_1116\u0012\bval_1118\u001a\u0013node_ScatterND_1118\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_19: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_19 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_16, %slice_scatter_18, 1, 6, 7), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_19']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1118\u0012\u0010slice_scatter_19\u001a\u0015node_slice_scatter_19\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_19: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_19 : [num_users=3] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_16, %slice_scatter_18, 1, 6, 7), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_19']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006sub_94\n\bval_1122\n\u0007val_484\n\u0006val_33\n\u0007val_353\u0012\bslice_93\u001a\rnode_slice_93\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_93: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012y%slice_93 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%sub_94, 2, 101, 252), kwargs = {})Jp\n\u001apkg.torch.onnx.name_scopes\u0012R['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_93']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0010slice_scatter_19\n\bval_1068\n\bval_1177\n\u0007val_353\n\u0007val_353\u0012\tslice_101\u001a\u000enode_slice_101\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_101: aten.slice.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_101 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_scatter_19, 1, 7, 8), kwargs = {})Jq\n\u001apkg.torch.onnx.name_scopes\u0012S['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_101']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bslice_93\u0012\bval_1201\u001a\u0013node_Transpose_1201\"\tTranspose*\u0011\n\u0004perm@\u0003@\u0001@\u0002@\u0000\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_20: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_20 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_102, %copy_7, 3, 0, 9223372036854775807), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_20']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n2\n\bval_1201\u0012\bval_1203\u001a\u0012node_Identity_1622\"\bIdentity\n\n\n\tslice_101\u0012\bval_1205\u001a\u000fnode_Shape_1205\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_21: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_21 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_101, %slice_scatter_20, 2, 0, 151), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_21']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1205\n\u0006val_30\u0012\bval_1206\u001a\u0010node_Gather_1206\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_21: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_21 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_101, %slice_scatter_20, 2, 0, 151), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_21']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\bval_1206\n\u0007val_383\u0012\bval_1207\u001a\u000fnode_Range_1207\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_21: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_21 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_101, %slice_scatter_20, 2, 0, 151), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_21']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1207\n\u0006val_25\n\bval_1209\n\u0006val_25\n\u0007val_353\u0012\bval_1211\u001a\u000fnode_Slice_1211\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_21: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_21 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_101, %slice_scatter_20, 2, 0, 151), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_21']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1211\n\u0005val_9\u0012\bval_1212\u001a\u0013node_Unsqueeze_1212\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_21: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_21 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_101, %slice_scatter_20, 2, 0, 151), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_21']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nG\n\bval_1203\u0012\bval_1213\u001a\u0013node_Transpose_1607\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0003@\u0000\u0001\u0007\n\n\n\tslice_101\u0012\bval_1214\u001a\u0013node_Transpose_1214\"\tTranspose*\u0011\n\u0004perm@\u0002@\u0001@\u0000@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_21: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_21 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_101, %slice_scatter_20, 2, 0, 151), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_21']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1214\n\bval_1212\n\bval_1213\u0012\bval_1215\u001a\u0013node_ScatterND_1215\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_21: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_21 : [num_users=1] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_101, %slice_scatter_20, 2, 0, 151), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_21']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0010slice_scatter_19\u0012\bval_1217\u001a\u000fnode_Shape_1217\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_22: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_22 : [num_users=2] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_19, %slice_scatter_21, 1, 7, 8), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_22']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1217\n\u0007val_383\u0012\bval_1218\u001a\u0010node_Gather_1218\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_22: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_22 : [num_users=2] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_19, %slice_scatter_21, 1, 7, 8), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_22']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\u0006val_22\n\bval_1218\n\u0007val_383\u0012\bval_1219\u001a\u000fnode_Range_1219\"\u0005RangeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_22: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_22 : [num_users=2] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_19, %slice_scatter_21, 1, 7, 8), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_22']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1219\n\bval_1068\n\bval_1177\n\u0006val_25\n\u0007val_353\u0012\bval_1223\u001a\u000fnode_Slice_1223\"\u0005SliceJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_22: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_22 : [num_users=2] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_19, %slice_scatter_21, 1, 7, 8), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_22']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1223\n\u0005val_9\u0012\bval_1224\u001a\u0013node_Unsqueeze_1224\"\tUnsqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_22: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_22 : [num_users=2] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_19, %slice_scatter_21, 1, 7, 8), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_22']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\nG\n\bval_1215\u0012\bval_1225\u001a\u0013node_Transpose_1608\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0002@\u0000@\u0003\u0001\u0007\n\n\n\u0010slice_scatter_19\u0012\bval_1226\u001a\u0013node_Transpose_1226\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_22: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_22 : [num_users=2] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_19, %slice_scatter_21, 1, 7, 8), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_22']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1226\n\bval_1224\n\bval_1225\u0012\bval_1227\u001a\u0013node_ScatterND_1227\"\tScatterND*\u0014\n\treduction\"\u0004none\u0001\u0003J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_22: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_22 : [num_users=2] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_19, %slice_scatter_21, 1, 7, 8), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_22']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\n\n\bval_1227\u0012\u0010slice_scatter_22\u001a\u0015node_slice_scatter_22\"\tTranspose*\u0011\n\u0004perm@\u0001@\u0000@\u0002@\u0003\u0001\u0007J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.hcqt: septimbre.HCQTpreprocess/septimbre_amt.hcqt.HCQT: model.layers.HarmonicaStacking/slice_scatter_22: aten.slice_scatter.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.HCQTpreprocess', 'model.layers.HarmonicaStacking', 'aten.slice_scatter.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%slice_scatter_22 : [num_users=2] = call_function[target=torch.ops.aten.slice_scatter.default](args = (%slice_scatter_19, %slice_scatter_21, 1, 7, 8), kwargs = {})Jx\n\u001apkg.torch.onnx.name_scopes\u0012Z['', 'septimbre_amt', 'septimbre_amt.hcqt', 'septimbre_amt.hcqt.HCQT', 'slice_scatter_22']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 138, in forward\n    x = self.hcqt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 22, in forward\n    stacked = self.HCQT(eng)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 32, in forward\n    shifted[:, i*channels:(i+1)*channels, :self.output_bins-shift, :] = x[:, :, shift:self.output_bins, :]\n\b\n\u0010slice_scatter_22\n\u001bseptimbre_amt.note_branch.k\u0012\u0007mul_595\u001a\fnode_mul_595\"\u0003MulJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/mul_595: aten.mul.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012l['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'aten.mul.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%mul_595 : [num_users=1] = call_function[target=torch.ops.aten.mul.Tensor](args = (%slice_scatter_22, %p_septimbre_amt_note_branch_k), kwargs = {})J[\n\u001apkg.torch.onnx.name_scopes\u0012=['', 'septimbre_amt', 'septimbre_amt.note_branch', 'mul_595']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 49, in forward\n    x = x * self.k + self.b\n\b\n\u0007mul_595\n\u001bseptimbre_amt.note_branch.b\u0012\u0007add_824\u001a\fnode_add_824\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/add_824: aten.add.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012l['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'aten.add.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%add_824 : [num_users=2] = call_function[target=torch.ops.aten.add.Tensor](args = (%mul_595, %p_septimbre_amt_note_branch_b), kwargs = {})J[\n\u001apkg.torch.onnx.name_scopes\u0012=['', 'septimbre_amt', 'septimbre_amt.note_branch', 'add_824']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 49, in forward\n    x = x * self.k + self.b\n\u0001\n\u0007add_824\n2septimbre_amt.note_branch.early_conv.0.conv.weight\n\fadd_824_bias\u0012\u0007getitem\u001a\u000enode_Conv_1609\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0002@\u0002@\u0002@\u0002\u0001\u0007*\u0010\n\u0007strides@\u0001@\u0001\u0001\u0007\n\u000f\n\u0007getitem\u0012\nleaky_relu\u001a\u000fnode_leaky_relu\"\tLeakyRelu*\u000f\n\u0005alpha\u0015\n#<\u0001\u0001J\u0003\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/septimbre_amt.note_branch.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.note_branch.early_conv.0: model.layers.CBLR/septimbre_amt.note_branch.early_conv.0.act: torch.nn.modules.activation.LeakyReLU/leaky_relu: aten.leaky_relu.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'torch.nn.modules.container.Sequential', 'model.layers.CBLR', 'torch.nn.modules.activation.LeakyReLU', 'aten.leaky_relu.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012v%leaky_relu : [num_users=1] = call_function[target=torch.ops.aten.leaky_relu.default](args = (%getitem,), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.note_branch', 'septimbre_amt.note_branch.early_conv', 'septimbre_amt.note_branch.early_conv.0', 'septimbre_amt.note_branch.early_conv.0.act', 'leaky_relu']J\u0006\n\u001apkg.torch.onnx.stack_trace\u0012\u0006File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 51, in forward\n    early_conv = self.early_conv(x)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 215, in forward\n    x = self.act(x)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/activation.py\", line 922, in forward\n    return F.leaky_relu(input, self.negative_slope, self.inplace)\n\u0001\n\nleaky_relu\n-septimbre_amt.note_branch.early_conv.1.weight\n+septimbre_amt.note_branch.early_conv.1.bias\u0012\tgetitem_3\u001a\u000enode_Conv_1610\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0003@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@$@\u0001@$@\u0001\u0001\u0007*\u0010\n\u0007strides@\u0001@\u0001\u0001\u0007\n\u0007\n\tgetitem_3\n\u0007add_824\u0012\u0007add_856\u001a\fnode_add_856\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/add_856: aten.add.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012l['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'aten.add.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012v%add_856 : [num_users=1] = call_function[target=torch.ops.aten.add.Tensor](args = (%getitem_3, %add_824), kwargs = {})J[\n\u001apkg.torch.onnx.name_scopes\u0012=['', 'septimbre_amt', 'septimbre_amt.note_branch', 'add_856']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 54, in forward\n    res = self.res(early_conv + x)\n\t\n\u0007add_856\u0012\u0004relu\u001a\tnode_relu\"\u0004ReluJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/septimbre_amt.note_branch.res: torch.nn.modules.activation.ReLU/relu: aten.relu.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'torch.nn.modules.activation.ReLU', 'aten.relu.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%relu : [num_users=1] = call_function[target=torch.ops.aten.relu.default](args = (%add_856,), kwargs = {})Jy\n\u001apkg.torch.onnx.name_scopes\u0012[['', 'septimbre_amt', 'septimbre_amt.note_branch', 'septimbre_amt.note_branch.res', 'relu']J\u0004\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 54, in forward\n    res = self.res(early_conv + x)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/activation.py\", line 144, in forward\n    return F.relu(input, inplace=self.inplace)\n\u0001\n\u0004relu\n*septimbre_amt.note_branch.neck.conv.weight\n\trelu_bias\u0012\tgetitem_6\u001a\u000enode_Conv_1611\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0002@\u0002@\u0002@\u0002\u0001\u0007*\u0010\n\u0007strides@\u0001@\u0001\u0001\u0007\n\u000b\n\tgetitem_6\u0012\u0006relu_1\u001a\u000bnode_relu_1\"\u0004ReluJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/septimbre_amt.note_branch.neck: model.layers.CBR/septimbre_amt.note_branch.neck.act: torch.nn.modules.activation.ReLU/relu_1: aten.relu.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'model.layers.CBR', 'torch.nn.modules.activation.ReLU', 'aten.relu.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012n%relu_1 : [num_users=2] = call_function[target=torch.ops.aten.relu.default](args = (%getitem_6,), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.note_branch', 'septimbre_amt.note_branch.neck', 'septimbre_amt.note_branch.neck.act', 'relu_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 55, in forward\n    neck = self.neck(res)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 193, in forward\n    x = self.act(x)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/activation.py\", line 144, in forward\n    return F.relu(input, inplace=self.inplace)\n\u000e\n\u0006relu_1\n*septimbre_amt.note_branch.conv_yn.0.weight\n(septimbre_amt.note_branch.conv_yn.0.bias\u0012\bconv2d_1\u001a\rnode_conv2d_1\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0001@\u0002@\u0001@\u0002\u0001\u0007*\u0010\n\u0007strides@\u0003@\u0001\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/septimbre_amt.note_branch.conv_yn: torch.nn.modules.container.Sequential/septimbre_amt.note_branch.conv_yn.0: torch.nn.modules.conv.Conv2d/conv2d_1: aten.conv2d.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.conv.Conv2d', 'aten.conv2d.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%conv2d_1 : [num_users=1] = call_function[target=torch.ops.aten.conv2d.default](args = (%relu_1, %p_septimbre_amt_note_branch_conv_yn_0_weight, %p_septimbre_amt_note_branch_conv_yn_0_bias, [3, 1], [1, 2]), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.note_branch', 'septimbre_amt.note_branch.conv_yn', 'septimbre_amt.note_branch.conv_yn.0', 'conv2d_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 58, in forward\n    yn = self.conv_yn(neck)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/conv.py\", line 548, in forward\n    return self._conv_forward(input, self.weight, self.bias)\n\f\n\bconv2d_1\u0012\u0007sigmoid\u001a\fnode_sigmoid\"\u0007SigmoidJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/septimbre_amt.note_branch.conv_yn: torch.nn.modules.container.Sequential/septimbre_amt.note_branch.conv_yn.1: torch.nn.modules.activation.Sigmoid/sigmoid: aten.sigmoid.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.activation.Sigmoid', 'aten.sigmoid.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012q%sigmoid : [num_users=2] = call_function[target=torch.ops.aten.sigmoid.default](args = (%conv2d_1,), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.note_branch', 'septimbre_amt.note_branch.conv_yn', 'septimbre_amt.note_branch.conv_yn.1', 'sigmoid']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 58, in forward\n    yn = self.conv_yn(neck)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/activation.py\", line 359, in forward\n    return torch.sigmoid(input)\n\u0001\n\u0006relu_1\n.septimbre_amt.note_branch.conv_yo1.conv.weight\n\u000brelu_1_bias\u0012\tgetitem_9\u001a\u000enode_Conv_1613\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0002@\u0001@\u0002@\u0001\u0001\u0007*\u0010\n\u0007strides@\u0003@\u0001\u0001\u0007\n\u000b\n\tgetitem_9\u0012\u0006relu_2\u001a\u000bnode_relu_2\"\u0004ReluJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/septimbre_amt.note_branch.conv_yo1: model.layers.CBR/septimbre_amt.note_branch.conv_yo1.act: torch.nn.modules.activation.ReLU/relu_2: aten.relu.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'model.layers.CBR', 'torch.nn.modules.activation.ReLU', 'aten.relu.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012n%relu_2 : [num_users=1] = call_function[target=torch.ops.aten.relu.default](args = (%getitem_9,), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.note_branch', 'septimbre_amt.note_branch.conv_yo1', 'septimbre_amt.note_branch.conv_yo1.act', 'relu_2']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0004File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 61, in forward\n    _yo = self.conv_yo1(neck)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 193, in forward\n    x = self.act(x)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/activation.py\", line 144, in forward\n    return F.relu(input, inplace=self.inplace)\n\u0007\n\u0007sigmoid\n\u0006relu_2\u0012\u0006concat\u001a\u000bnode_concat\"\u0006Concat*\u000b\n\u0004axis\u0018\u0001\u0001\u0002J\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/concat: aten.concat.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012p['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'aten.concat.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012{%concat : [num_users=1] = call_function[target=torch.ops.aten.concat.default](args = ([%sigmoid, %relu_2], 1), kwargs = {})JZ\n\u001apkg.torch.onnx.name_scopes\u0012<['', 'septimbre_amt', 'septimbre_amt.note_branch', 'concat']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 63, in forward\n    yo = torch.concat((yn, _yo), dim=1)\n\u000f\n\u0006concat\n+septimbre_amt.note_branch.conv_yo2.0.weight\n)septimbre_amt.note_branch.conv_yo2.0.bias\u0012\rconvolution_2\u001a\u0012node_convolution_2\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0001@\u0002@\u0001@\u0002\u0001\u0007*\u0010\n\u0007strides@\u0001@\u0001\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/septimbre_amt.note_branch.conv_yo2: torch.nn.modules.container.Sequential/septimbre_amt.note_branch.conv_yo2.0: torch.nn.modules.conv.Conv2d/convolution_2: aten.convolution.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.conv.Conv2d', 'aten.convolution.default']J\u0002\n\u0016pkg.torch.onnx.fx_node\u0012\u0002%convolution_2 : [num_users=1] = call_function[target=torch.ops.aten.convolution.default](args = (%concat, %p_septimbre_amt_note_branch_conv_yo2_0_weight, %p_septimbre_amt_note_branch_conv_yo2_0_bias, [1, 1], [1, 2], [1, 1], False, [0, 0], 1), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.note_branch', 'septimbre_amt.note_branch.conv_yo2', 'septimbre_amt.note_branch.conv_yo2.0', 'convolution_2']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 65, in forward\n    yo = self.conv_yo2(yo)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/conv.py\", line 548, in forward\n    return self._conv_forward(input, self.weight, self.bias)\n\f\n\rconvolution_2\u0012\tsigmoid_1\u001a\u000enode_sigmoid_1\"\u0007SigmoidJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/septimbre_amt.note_branch.conv_yo2: torch.nn.modules.container.Sequential/septimbre_amt.note_branch.conv_yo2.1: torch.nn.modules.activation.Sigmoid/sigmoid_1: aten.sigmoid.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.activation.Sigmoid', 'aten.sigmoid.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012x%sigmoid_1 : [num_users=1] = call_function[target=torch.ops.aten.sigmoid.default](args = (%convolution_2,), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.note_branch', 'septimbre_amt.note_branch.conv_yo2', 'septimbre_amt.note_branch.conv_yo2.1', 'sigmoid_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 65, in forward\n    yo = self.conv_yo2(yo)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/activation.py\", line 359, in forward\n    return torch.sigmoid(input)\n\b\n\tsigmoid_1\n\u0007val_353\u0012\u0007squeeze\u001a\fnode_squeeze\"\u0007SqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/squeeze: aten.squeeze.dimJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012m['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'aten.squeeze.dim']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%squeeze : [num_users=2] = call_function[target=torch.ops.aten.squeeze.dim](args = (%sigmoid_1, 1), kwargs = {})J[\n\u001apkg.torch.onnx.name_scopes\u0012=['', 'septimbre_amt', 'septimbre_amt.note_branch', 'squeeze']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 67, in forward\n    return yo.squeeze(1), yn.squeeze(1)  # (batch, 7*12, len), (batch, 7*12, len)\n\b\n\u0007sigmoid\n\u0007val_353\u0012\tsqueeze_1\u001a\u000enode_squeeze_1\"\u0007SqueezeJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.note_branch: septimbre.NotePredictBranch/squeeze_1: aten.squeeze.dimJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012m['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.NotePredictBranch', 'aten.squeeze.dim']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%squeeze_1 : [num_users=2] = call_function[target=torch.ops.aten.squeeze.dim](args = (%sigmoid, 1), kwargs = {})J]\n\u001apkg.torch.onnx.name_scopes\u0012?['', 'septimbre_amt', 'septimbre_amt.note_branch', 'squeeze_1']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0003File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 144, in forward\n    note_onset, note_pred = self.note_branch(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 67, in forward\n    return yo.squeeze(1), yn.squeeze(1)  # (batch, 7*12, len), (batch, 7*12, len)\n\u0007\n\u0010slice_scatter_22\n\u0017septimbre_amt.encoder.k\u0012\u0007mul_740\u001a\fnode_mul_740\"\u0003MulJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/mul_740: aten.mul.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012b['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'aten.mul.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%mul_740 : [num_users=1] = call_function[target=torch.ops.aten.mul.Tensor](args = (%slice_scatter_22, %p_septimbre_amt_encoder_k), kwargs = {})JW\n\u001apkg.torch.onnx.name_scopes\u00129['', 'septimbre_amt', 'septimbre_amt.encoder', 'mul_740']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 109, in forward\n    x = x * self.k + self.b\n\u0007\n\u0007mul_740\n\u0017septimbre_amt.encoder.b\u0012\u0007add_927\u001a\fnode_add_927\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/add_927: aten.add.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012b['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'aten.add.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%add_927 : [num_users=2] = call_function[target=torch.ops.aten.add.Tensor](args = (%mul_740, %p_septimbre_amt_encoder_b), kwargs = {})JW\n\u001apkg.torch.onnx.name_scopes\u00129['', 'septimbre_amt', 'septimbre_amt.encoder', 'add_927']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 109, in forward\n    x = x * self.k + self.b\n\u000e\n\u0007add_927\n)septimbre_amt.encoder.early_conv.0.weight\n'septimbre_amt.encoder.early_conv.0.bias\u0012\rconvolution_3\u001a\u0012node_convolution_3\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0002@\u0002@\u0002@\u0002\u0001\u0007*\u0010\n\u0007strides@\u0001@\u0001\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.encoder.early_conv.0: torch.nn.modules.conv.Conv2d/convolution_3: aten.convolution.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.conv.Conv2d', 'aten.convolution.default']J\u0002\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%convolution_3 : [num_users=1] = call_function[target=torch.ops.aten.convolution.default](args = (%add_927, %p_septimbre_amt_encoder_early_conv_0_weight, %p_septimbre_amt_encoder_early_conv_0_bias, [1, 1], [2, 2], [1, 1], False, [0, 0], 1), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.early_conv', 'septimbre_amt.encoder.early_conv.0', 'convolution_3']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/conv.py\", line 548, in forward\n    return self._conv_forward(input, self.weight, self.bias)\n\r\n\rconvolution_3\n\bval_1253\u0012\bval_1254\u001a\u0011node_Reshape_1254\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.encoder.early_conv.1: torch.nn.modules.normalization.GroupNorm/group_norm: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%convolution_3, 4, %p_septimbre_amt_encoder_early_conv_1_weight, %p_septimbre_amt_encoder_early_conv_1_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.early_conv', 'septimbre_amt.encoder.early_conv.1', 'group_norm']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\u000e\n\bval_1254\n\bval_1257\n\bval_1260\u0012\bval_1261\u001a\u001fnode_InstanceNormalization_1261\"\u0015InstanceNormalization*\u0011\n\u0007epsilon\u0015'7\u0001\u0001J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.encoder.early_conv.1: torch.nn.modules.normalization.GroupNorm/group_norm: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%convolution_3, 4, %p_septimbre_amt_encoder_early_conv_1_weight, %p_septimbre_amt_encoder_early_conv_1_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.early_conv', 'septimbre_amt.encoder.early_conv.1', 'group_norm']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\r\n\rconvolution_3\u0012\bval_1262\u001a\u000fnode_Shape_1262\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.encoder.early_conv.1: torch.nn.modules.normalization.GroupNorm/group_norm: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%convolution_3, 4, %p_septimbre_amt_encoder_early_conv_1_weight, %p_septimbre_amt_encoder_early_conv_1_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.early_conv', 'septimbre_amt.encoder.early_conv.1', 'group_norm']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\r\n\bval_1261\n\bval_1262\u0012\bval_1263\u001a\u0011node_Reshape_1263\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.encoder.early_conv.1: torch.nn.modules.normalization.GroupNorm/group_norm: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%convolution_3, 4, %p_septimbre_amt_encoder_early_conv_1_weight, %p_septimbre_amt_encoder_early_conv_1_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.early_conv', 'septimbre_amt.encoder.early_conv.1', 'group_norm']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\r\n\bval_1263\n\bval_1269\u0012\bval_1270\u001a\rnode_Mul_1270\"\u0003MulJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.encoder.early_conv.1: torch.nn.modules.normalization.GroupNorm/group_norm: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%convolution_3, 4, %p_septimbre_amt_encoder_early_conv_1_weight, %p_septimbre_amt_encoder_early_conv_1_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.early_conv', 'septimbre_amt.encoder.early_conv.1', 'group_norm']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\r\n\bval_1270\n\bval_1271\u0012\ngroup_norm\u001a\u000fnode_group_norm\"\u0003AddJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.encoder.early_conv.1: torch.nn.modules.normalization.GroupNorm/group_norm: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%convolution_3, 4, %p_septimbre_amt_encoder_early_conv_1_weight, %p_septimbre_amt_encoder_early_conv_1_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.early_conv', 'septimbre_amt.encoder.early_conv.1', 'group_norm']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\f\n\ngroup_norm\u0012\fleaky_relu_1\u001a\u0011node_leaky_relu_1\"\tLeakyRelu*\u000f\n\u0005alpha\u0015\n#<\u0001\u0001J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.encoder.early_conv.2: torch.nn.modules.activation.LeakyReLU/leaky_relu_1: aten.leaky_relu.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.activation.LeakyReLU', 'aten.leaky_relu.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012{%leaky_relu_1 : [num_users=1] = call_function[target=torch.ops.aten.leaky_relu.default](args = (%group_norm,), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.early_conv', 'septimbre_amt.encoder.early_conv.2', 'leaky_relu_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/activation.py\", line 922, in forward\n    return F.leaky_relu(input, self.negative_slope, self.inplace)\n\u000e\n\fleaky_relu_1\n)septimbre_amt.encoder.early_conv.3.weight\n'septimbre_amt.encoder.early_conv.3.bias\u0012\bconv2d_3\u001a\rnode_conv2d_3\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0003@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@$@\u0001@$@\u0001\u0001\u0007*\u0010\n\u0007strides@\u0001@\u0001\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.early_conv: torch.nn.modules.container.Sequential/septimbre_amt.encoder.early_conv.3: torch.nn.modules.conv.Conv2d/conv2d_3: aten.conv2d.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.conv.Conv2d', 'aten.conv2d.default']J\u0002\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%conv2d_3 : [num_users=1] = call_function[target=torch.ops.aten.conv2d.default](args = (%leaky_relu_1, %p_septimbre_amt_encoder_early_conv_3_weight, %p_septimbre_amt_encoder_early_conv_3_bias, [1, 1], [36, 1], [3, 1]), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.early_conv', 'septimbre_amt.encoder.early_conv.3', 'conv2d_3']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/conv.py\", line 548, in forward\n    return self._conv_forward(input, self.weight, self.bias)\n\u0007\n\bconv2d_3\n\u0007add_927\u0012\u0007add_955\u001a\fnode_add_955\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/add_955: aten.add.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012b['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'aten.add.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012u%add_955 : [num_users=1] = call_function[target=torch.ops.aten.add.Tensor](args = (%conv2d_3, %add_927), kwargs = {})JW\n\u001apkg.torch.onnx.name_scopes\u00129['', 'septimbre_amt', 'septimbre_amt.encoder', 'add_955']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 111, in forward\n    x = self.early_conv(x) + x\n\r\n\u0007add_955\n\bval_1275\u0012\bval_1276\u001a\u0011node_Reshape_1276\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.neck: torch.nn.modules.container.Sequential/septimbre_amt.encoder.neck.0: torch.nn.modules.normalization.GroupNorm/group_norm_1: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm_1 : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%add_955, 2, %p_septimbre_amt_encoder_neck_0_weight, %p_septimbre_amt_encoder_neck_0_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012|['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.neck', 'septimbre_amt.encoder.neck.0', 'group_norm_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 112, in forward\n    emb = self.neck(x)      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\r\n\bval_1276\n\bval_1279\n\bval_1282\u0012\bval_1283\u001a\u001fnode_InstanceNormalization_1283\"\u0015InstanceNormalization*\u0011\n\u0007epsilon\u0015'7\u0001\u0001J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.neck: torch.nn.modules.container.Sequential/septimbre_amt.encoder.neck.0: torch.nn.modules.normalization.GroupNorm/group_norm_1: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm_1 : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%add_955, 2, %p_septimbre_amt_encoder_neck_0_weight, %p_septimbre_amt_encoder_neck_0_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012|['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.neck', 'septimbre_amt.encoder.neck.0', 'group_norm_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 112, in forward\n    emb = self.neck(x)      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\r\n\u0007add_955\u0012\bval_1284\u001a\u000fnode_Shape_1284\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.neck: torch.nn.modules.container.Sequential/septimbre_amt.encoder.neck.0: torch.nn.modules.normalization.GroupNorm/group_norm_1: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm_1 : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%add_955, 2, %p_septimbre_amt_encoder_neck_0_weight, %p_septimbre_amt_encoder_neck_0_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012|['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.neck', 'septimbre_amt.encoder.neck.0', 'group_norm_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 112, in forward\n    emb = self.neck(x)      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\r\n\bval_1283\n\bval_1284\u0012\bval_1285\u001a\u0011node_Reshape_1285\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.neck: torch.nn.modules.container.Sequential/septimbre_amt.encoder.neck.0: torch.nn.modules.normalization.GroupNorm/group_norm_1: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm_1 : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%add_955, 2, %p_septimbre_amt_encoder_neck_0_weight, %p_septimbre_amt_encoder_neck_0_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012|['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.neck', 'septimbre_amt.encoder.neck.0', 'group_norm_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 112, in forward\n    emb = self.neck(x)      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\r\n\bval_1285\n\bval_1291\u0012\bval_1292\u001a\rnode_Mul_1292\"\u0003MulJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.neck: torch.nn.modules.container.Sequential/septimbre_amt.encoder.neck.0: torch.nn.modules.normalization.GroupNorm/group_norm_1: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm_1 : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%add_955, 2, %p_septimbre_amt_encoder_neck_0_weight, %p_septimbre_amt_encoder_neck_0_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012|['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.neck', 'septimbre_amt.encoder.neck.0', 'group_norm_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 112, in forward\n    emb = self.neck(x)      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\r\n\bval_1292\n\bval_1293\u0012\fgroup_norm_1\u001a\u0011node_group_norm_1\"\u0003AddJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.neck: torch.nn.modules.container.Sequential/septimbre_amt.encoder.neck.0: torch.nn.modules.normalization.GroupNorm/group_norm_1: aten.group_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.normalization.GroupNorm', 'aten.group_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%group_norm_1 : [num_users=1] = call_function[target=torch.ops.aten.group_norm.default](args = (%add_955, 2, %p_septimbre_amt_encoder_neck_0_weight, %p_septimbre_amt_encoder_neck_0_bias), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012|['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.neck', 'septimbre_amt.encoder.neck.0', 'group_norm_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 112, in forward\n    emb = self.neck(x)      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 325, in forward\n    return F.group_norm(input, self.num_groups, self.weight, self.bias, self.eps)\n\u000e\n\fgroup_norm_1\n#septimbre_amt.encoder.neck.1.weight\n!septimbre_amt.encoder.neck.1.bias\u0012\rconvolution_4\u001a\u0012node_convolution_4\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0002@\u0002@\u0002@\u0002\u0001\u0007*\u0010\n\u0007strides@\u0001@\u0001\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.neck: torch.nn.modules.container.Sequential/septimbre_amt.encoder.neck.1: torch.nn.modules.conv.Conv2d/convolution_4: aten.convolution.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.conv.Conv2d', 'aten.convolution.default']J\u0002\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%convolution_4 : [num_users=1] = call_function[target=torch.ops.aten.convolution.default](args = (%group_norm_1, %p_septimbre_amt_encoder_neck_1_weight, %p_septimbre_amt_encoder_neck_1_bias, [1, 1], [2, 2], [1, 1], False, [0, 0], 1), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012}['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.neck', 'septimbre_amt.encoder.neck.1', 'convolution_4']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 112, in forward\n    emb = self.neck(x)      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/conv.py\", line 548, in forward\n    return self._conv_forward(input, self.weight, self.bias)\n\f\n\rconvolution_4\n\bval_1295\u0012\u0005prelu\u001a\nnode_prelu\"\u0005PReluJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.neck: torch.nn.modules.container.Sequential/septimbre_amt.encoder.neck.2: torch.nn.modules.activation.PReLU/prelu: aten.prelu.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.activation.PReLU', 'aten.prelu.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%prelu : [num_users=2] = call_function[target=torch.ops.aten.prelu.default](args = (%convolution_4, %p_septimbre_amt_encoder_neck_2_weight), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012u['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.neck', 'septimbre_amt.encoder.neck.2', 'prelu']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 112, in forward\n    emb = self.neck(x)      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/activation.py\", line 1638, in forward\n    return F.prelu(input, self.weight)\n\f\n\u0005prelu\u0012\u0007permute\u001a\fnode_permute\"\tTranspose*\u0011\n\u0004perm@\u0000@\u0002@\u0003@\u0001\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.res1: torch.nn.modules.container.Sequential/septimbre_amt.encoder.res1.0: model.layers.LayerNorm2d/permute: aten.permute.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.LayerNorm2d', 'aten.permute.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012{%permute : [num_users=1] = call_function[target=torch.ops.aten.permute.default](args = (%prelu, [0, 2, 3, 1]), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012w['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.res1', 'septimbre_amt.encoder.res1.0', 'permute']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 113, in forward\n    emb = self.res1(emb) + emb      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 113, in forward\n    x = x.permute(0, 2, 3, 1)  # (batch, n_bins, len, channel)\n\u0010\n\u0007permute\n.septimbre_amt.encoder.res1.0.layer_norm.weight\n,septimbre_amt.encoder.res1.0.layer_norm.bias\u0012\nlayer_norm\u001a\u000fnode_layer_norm\"\u0012LayerNormalization*\u0014\n\u0004axis\u0018\u0001\u0001\u0002*\u0011\n\u0007epsilon\u0015E-2\u0001\u0001*\u0011\n\nstash_type\u0018\u0001\u0001\u0002J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.res1: torch.nn.modules.container.Sequential/septimbre_amt.encoder.res1.0: model.layers.LayerNorm2d/septimbre_amt.encoder.res1.0.layer_norm: torch.nn.modules.normalization.LayerNorm/layer_norm: aten.layer_norm.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.LayerNorm2d', 'torch.nn.modules.normalization.LayerNorm', 'aten.layer_norm.default']J\u0002\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%layer_norm : [num_users=1] = call_function[target=torch.ops.aten.layer_norm.default](args = (%permute, [16], %p_septimbre_amt_encoder_res1_0_layer_norm_weight, %p_septimbre_amt_encoder_res1_0_layer_norm_bias, 1.01e-08), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.res1', 'septimbre_amt.encoder.res1.0', 'septimbre_amt.encoder.res1.0.layer_norm', 'layer_norm']J\u0006\n\u001apkg.torch.onnx.stack_trace\u0012\u0006File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 113, in forward\n    emb = self.res1(emb) + emb      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 114, in forward\n    x = self.layer_norm(x)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/normalization.py\", line 229, in forward\n    return F.layer_norm(\n\f\n\nlayer_norm\u0012\tpermute_1\u001a\u000enode_permute_1\"\tTranspose*\u0011\n\u0004perm@\u0000@\u0003@\u0001@\u0002\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.res1: torch.nn.modules.container.Sequential/septimbre_amt.encoder.res1.0: model.layers.LayerNorm2d/permute_1: aten.permute.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.LayerNorm2d', 'aten.permute.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%permute_1 : [num_users=1] = call_function[target=torch.ops.aten.permute.default](args = (%layer_norm, [0, 3, 1, 2]), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012y['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.res1', 'septimbre_amt.encoder.res1.0', 'permute_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 113, in forward\n    emb = self.res1(emb) + emb      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 115, in forward\n    x = x.permute(0, 3, 1, 2)  # (batch, channel, n_bins, len)\n\u000e\n\tpermute_1\n#septimbre_amt.encoder.res1.1.weight\n!septimbre_amt.encoder.res1.1.bias\u0012\rconvolution_5\u001a\u0012node_convolution_5\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0001@\u0001@\u0001@\u0001\u0001\u0007*\u0010\n\u0007strides@\u0001@\u0001\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.res1: torch.nn.modules.container.Sequential/septimbre_amt.encoder.res1.1: torch.nn.modules.conv.Conv2d/convolution_5: aten.convolution.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.conv.Conv2d', 'aten.convolution.default']J\u0002\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%convolution_5 : [num_users=1] = call_function[target=torch.ops.aten.convolution.default](args = (%permute_1, %p_septimbre_amt_encoder_res1_1_weight, %p_septimbre_amt_encoder_res1_1_bias, [1, 1], [1, 1], [1, 1], False, [0, 0], 1), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012}['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.res1', 'septimbre_amt.encoder.res1.1', 'convolution_5']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 113, in forward\n    emb = self.res1(emb) + emb      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/conv.py\", line 548, in forward\n    return self._conv_forward(input, self.weight, self.bias)\n\f\n\rconvolution_5\u0012\u0006relu_3\u001a\u000bnode_relu_3\"\u0004ReluJ\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.res1: torch.nn.modules.container.Sequential/septimbre_amt.encoder.res1.2: torch.nn.modules.activation.ReLU/relu_3: aten.relu.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.activation.ReLU', 'aten.relu.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%relu_3 : [num_users=1] = call_function[target=torch.ops.aten.relu.default](args = (%convolution_5,), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012v['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.res1', 'septimbre_amt.encoder.res1.2', 'relu_3']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 113, in forward\n    emb = self.res1(emb) + emb      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/activation.py\", line 144, in forward\n    return F.relu(input, inplace=self.inplace)\n\u000e\n\u0006relu_3\n#septimbre_amt.encoder.res1.3.weight\n!septimbre_amt.encoder.res1.3.bias\u0012\rconvolution_6\u001a\u0012node_convolution_6\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0001@\u0001@\u0001@\u0001\u0001\u0007*\u0010\n\u0007strides@\u0001@\u0001\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.res1: torch.nn.modules.container.Sequential/septimbre_amt.encoder.res1.3: torch.nn.modules.conv.Conv2d/convolution_6: aten.convolution.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.conv.Conv2d', 'aten.convolution.default']J\u0002\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%convolution_6 : [num_users=1] = call_function[target=torch.ops.aten.convolution.default](args = (%relu_3, %p_septimbre_amt_encoder_res1_3_weight, %p_septimbre_amt_encoder_res1_3_bias, [1, 1], [1, 1], [1, 1], False, [0, 0], 1), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012}['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.res1', 'septimbre_amt.encoder.res1.3', 'convolution_6']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 113, in forward\n    emb = self.res1(emb) + emb      # (B, 16, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/conv.py\", line 548, in forward\n    return self._conv_forward(input, self.weight, self.bias)\n\u0007\n\rconvolution_6\n\u0005prelu\u0012\u0007add_995\u001a\fnode_add_995\"\u0003AddJ\u0001\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/add_995: aten.add.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012b['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'aten.add.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012x%add_995 : [num_users=3] = call_function[target=torch.ops.aten.add.Tensor](args = (%convolution_6, %prelu), kwargs = {})JW\n\u001apkg.torch.onnx.name_scopes\u00129['', 'septimbre_amt', 'septimbre_amt.encoder', 'add_995']J\u0003\n\u001apkg.torch.onnx.stack_trace\u0012\u0002File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 113, in forward\n    emb = self.res1(emb) + emb      # (B, 16, 84, T)\n\u000b\n\u0007add_995\n\bval_1300\u0012\u0004mean\u001a\tnode_mean\"\nReduceMean*\u000f\n\bkeepdims\u0018\u0001\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/mean: aten.mean.dimJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'aten.mean.dim']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012u%mean : [num_users=1] = call_function[target=torch.ops.aten.mean.dim](args = (%add_995, [-1, -2], True), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012r['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'mean']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\f\n\u0007add_995\n\bval_1301\u0012\bval_1302\u001a\u0014node_ReduceMean_1300\"\nReduceMean*\u000f\n\bkeepdims\u0018\u0001\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\u0007add_995\n\bval_1302\u0012\bval_1303\u001a\rnode_Sub_1301\"\u0003SubJ\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\bval_1303\n\bval_1303\u0012\bval_1304\u001a\rnode_Mul_1302\"\u0003MulJ\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\f\n\bval_1304\n\bval_1301\u0012\bval_1305\u001a\u0014node_ReduceMean_1303\"\nReduceMean*\u000f\n\bkeepdims\u0018\u0000\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\u0007add_995\u0012\bval_1306\u001a\u000fnode_Shape_1304\"\u0005Shape*\f\n\u0005start\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\bval_1306\n\bval_1301\u0012\bval_1307\u001a\u0010node_Gather_1305\"\u0006Gather*\u000b\n\u0004axis\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\f\n\bval_1307\u0012\bval_1308\u001a\u0014node_ReduceProd_1306\"\nReduceProd*\u000f\n\bkeepdims\u0018\u0000\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n5\n\bval_1308\u0012\bval_1309\u001a\u000enode_Cast_1548\"\u0004Cast*\t\n\u0002to\u0018\u0001\u0001\u0002\n\u000b\n\bval_1305\n\bval_1309\u0012\bval_1310\u001a\rnode_Mul_1308\"\u0003MulJ\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\bval_1309\n\u0007val_369\u0012\bval_1312\u001a\rnode_Sub_1310\"\u0003SubJ\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\bval_1310\n\bval_1312\u0012\u0005var_1\u001a\nnode_var_1\"\u0003DivJ\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/var_1: prims.var.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.var.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%var_1 : [num_users=1] = call_function[target=torch.ops.prims.var.default](args = (%add_995, [3, 2], 1.0), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012s['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'var_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\f\n\u0005var_1\n\bval_1320\u0012\bval_1321\u001a\u0011node_Reshape_1319\"\u0007Reshape*\u0010\n\tallowzero\u0018\u0000\u0001\u0002J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/broadcast_in_dim_1: prims.broadcast_in_dim.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'prims.broadcast_in_dim.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%broadcast_in_dim_1 : [num_users=1] = call_function[target=torch.ops.prims.broadcast_in_dim.default](args = (%var_1, [1, 16, 1, 1], [0, 1]), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012\u0001['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'broadcast_in_dim_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\bval_1321\u0012\u0006sqrt_1\u001a\u000bnode_sqrt_1\"\u0004SqrtJ\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/sqrt_1: aten.sqrt.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'aten.sqrt.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012w%sqrt_1 : [num_users=1] = call_function[target=torch.ops.aten.sqrt.default](args = (%broadcast_in_dim_1,), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012t['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'sqrt_1']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\u0007add_995\n\u0004mean\u0012\u0007sub_205\u001a\fnode_sub_205\"\u0003SubJ\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/sub_205: aten.sub.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'aten.sub.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012q%sub_205 : [num_users=1] = call_function[target=torch.ops.aten.sub.Tensor](args = (%add_995, %mean), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012u['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'sub_205']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\u0007sub_205\n\u0006sqrt_1\u0012\u0003div\u001a\bnode_div\"\u0003DivJ\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/div: aten.div.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'aten.div.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012q%div : [num_users=1] = call_function[target=torch.ops.aten.div.Tensor](args = (%sub_205, %add_1002), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012q['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'div']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000b\n\u0003div\n\u001dseptimbre_amt.encoder.emb.0.k\u0012\u0007mul_863\u001a\fnode_mul_863\"\u0003MulJ\u0002\n\tnamespace\u0012\u0001: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.0: model.layers.CenterNorm2d/mul_863: aten.mul.TensorJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'model.layers.CenterNorm2d', 'aten.mul.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%mul_863 : [num_users=1] = call_function[target=torch.ops.aten.mul.Tensor](args = (%div, %p_septimbre_amt_encoder_emb_0_k), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012u['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.0', 'mul_863']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/septimbre/../model/layers.py\", line 126, in forward\n    return self.center_norm(x, self.eps) * self.k\n\u000e\n\u0007mul_863\n\"septimbre_amt.encoder.emb.1.weight\n septimbre_amt.encoder.emb.1.bias\u0012\bconv2d_4\u001a\rnode_conv2d_4\"\u0004Conv*\u0015\n\bauto_pad\"\u0006NOTSET\u0001\u0003*\u0012\n\tdilations@\u0001@\u0001\u0001\u0007*\f\n\u0005group\u0018\u0001\u0001\u0002*\u0011\n\u0004pads@\u0001@\u0002@\u0001@\u0002\u0001\u0007*\u0010\n\u0007strides@\u0003@\u0001\u0001\u0007J\u0002\n\tnamespace\u0012\u0002: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/septimbre_amt.encoder: septimbre.Encoder/septimbre_amt.encoder.emb: torch.nn.modules.container.Sequential/septimbre_amt.encoder.emb.1: torch.nn.modules.conv.Conv2d/conv2d_4: aten.conv2d.defaultJ\u0001\n\u001epkg.torch.onnx.class_hierarchy\u0012\u0001['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'septimbre.Encoder', 'torch.nn.modules.container.Sequential', 'torch.nn.modules.conv.Conv2d', 'aten.conv2d.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%conv2d_4 : [num_users=2] = call_function[target=torch.ops.aten.conv2d.default](args = (%mul_863, %p_septimbre_amt_encoder_emb_1_weight, %p_septimbre_amt_encoder_emb_1_bias, [3, 1], [1, 2]), kwargs = {})J\u0001\n\u001apkg.torch.onnx.name_scopes\u0012v['', 'septimbre_amt', 'septimbre_amt.encoder', 'septimbre_amt.encoder.emb', 'septimbre_amt.encoder.emb.1', 'conv2d_4']J\u0005\n\u001apkg.torch.onnx.stack_trace\u0012\u0005File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 146, in forward\n    emb = self.encoder(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 114, in forward\n    emb = self.emb(emb)  # (B, emb_dims, 84, T)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/container.py\", line 250, in forward\n    input = module(input)\n  File \"/home/liruigang/timbreAMT/.venv/lib/python3.12/site-packages/torch/nn/modules/conv.py\", line 548, in forward\n    return self._conv_forward(input, self.weight, self.bias)\n\u0007\n\bconv2d_4\n\u0007val_353\u0012\u0012linalg_vector_norm\u001a\u0017node_linalg_vector_norm\"\bReduceL2*\u000f\n\bkeepdims\u0018\u0001\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002J\u0001\n\tnamespace\u0012x: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/linalg_vector_norm: aten.linalg_vector_norm.defaultJ\n\u001epkg.torch.onnx.class_hierarchy\u0012]['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'aten.linalg_vector_norm.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%linalg_vector_norm : [num_users=1] = call_function[target=torch.ops.aten.linalg_vector_norm.default](args = (%conv2d_4, 2, [1], True), kwargs = {})JI\n\u001apkg.torch.onnx.name_scopes\u0012+['', 'septimbre_amt', 'linalg_vector_norm']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0001File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 151, in forward\n    emb = nn.functional.normalize(emb, p=2, dim=1)\n\u0006\n\u0012linalg_vector_norm\n\bval_1327\u0012\tclamp_min\u001a\u000enode_clamp_min\"\u0004ClipJs\n\tnamespace\u0012f: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/clamp_min: aten.clamp_min.defaultJv\n\u001epkg.torch.onnx.class_hierarchy\u0012T['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'aten.clamp_min.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%clamp_min : [num_users=1] = call_function[target=torch.ops.aten.clamp_min.default](args = (%linalg_vector_norm, 1e-12), kwargs = {})J@\n\u001apkg.torch.onnx.name_scopes\u0012\"['', 'septimbre_amt', 'clamp_min']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0001File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 151, in forward\n    emb = nn.functional.normalize(emb, p=2, dim=1)\n\u0006\n\u0007val_353\n\bval_1330\n\u0007val_904\n\u0007val_390\u0012\bval_1333\u001a\u0010node_Concat_1331\"\u0006Concat*\u000b\n\u0004axis\u0018\u0000\u0001\u0002Jm\n\tnamespace\u0012`: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/expand: aten.expand.defaultJs\n\u001epkg.torch.onnx.class_hierarchy\u0012Q['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'aten.expand.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%expand : [num_users=1] = call_function[target=torch.ops.aten.expand.default](args = (%clamp_min, [1, 12, 84, %add_626]), kwargs = {})J=\n\u001apkg.torch.onnx.name_scopes\u0012\u001f['', 'septimbre_amt', 'expand']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0001File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 151, in forward\n    emb = nn.functional.normalize(emb, p=2, dim=1)\n\u0006\n\tclamp_min\n\bval_1333\u0012\u0006expand\u001a\u000bnode_expand\"\u0006ExpandJm\n\tnamespace\u0012`: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/expand: aten.expand.defaultJs\n\u001epkg.torch.onnx.class_hierarchy\u0012Q['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'aten.expand.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012\u0001%expand : [num_users=1] = call_function[target=torch.ops.aten.expand.default](args = (%clamp_min, [1, 12, 84, %add_626]), kwargs = {})J=\n\u001apkg.torch.onnx.name_scopes\u0012\u001f['', 'septimbre_amt', 'expand']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0001File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 151, in forward\n    emb = nn.functional.normalize(emb, p=2, dim=1)\n\u0005\n\bconv2d_4\n\u0006expand\u0012\tembedding\u001a\nnode_div_1\"\u0003DivJh\n\tnamespace\u0012[: septimbre.SepTimbreAMT_44100/septimbre_amt: septimbre.SepTimbreAMT/div_1: aten.div.TensorJo\n\u001epkg.torch.onnx.class_hierarchy\u0012M['septimbre.SepTimbreAMT_44100', 'septimbre.SepTimbreAMT', 'aten.div.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%div_1 : [num_users=1] = call_function[target=torch.ops.aten.div.Tensor](args = (%conv2d_4, %expand), kwargs = {})J<\n\u001apkg.torch.onnx.name_scopes\u0012\u001e['', 'septimbre_amt', 'div_1']J\u0002\n\u001apkg.torch.onnx.stack_trace\u0012\u0001File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 191, in forward\n    onset, note, emb = self.septimbre_amt(x)\n  File \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 151, in forward\n    emb = nn.functional.normalize(emb, p=2, dim=1)\n\u0004\n\u0007squeeze\u0012\u0005max_1\u001a\nnode_max_1\"\tReduceMax*\u000f\n\bkeepdims\u0018\u0000\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002JC\n\tnamespace\u00126: septimbre.SepTimbreAMT_44100/max_1: aten.max.defaultJV\n\u001epkg.torch.onnx.class_hierarchy\u00124['septimbre.SepTimbreAMT_44100', 'aten.max.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012j%max_1 : [num_users=1] = call_function[target=torch.ops.aten.max.default](args = (%squeeze,), kwargs = {})J+\n\u001apkg.torch.onnx.name_scopes\u0012\r['', 'max_1']J\u0001\n\u001apkg.torch.onnx.stack_trace\u0012fFile \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 192, in forward\n    onset /= onset.max()\n\u0004\n\u0007squeeze\n\u0005max_1\u0012\u0005div_2\u001a\nnode_div_2\"\u0003DivJB\n\tnamespace\u00125: septimbre.SepTimbreAMT_44100/div_2: aten.div.TensorJU\n\u001epkg.torch.onnx.class_hierarchy\u00123['septimbre.SepTimbreAMT_44100', 'aten.div.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012p%div_2 : [num_users=1] = call_function[target=torch.ops.aten.div.Tensor](args = (%squeeze, %max_1), kwargs = {})J+\n\u001apkg.torch.onnx.name_scopes\u0012\r['', 'div_2']J\u0001\n\u001apkg.torch.onnx.stack_trace\u0012fFile \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 192, in forward\n    onset /= onset.max()\n\u0004\n\u0005div_2\n\u0007val_353\u0012\tunsqueeze\u001a\u000enode_unsqueeze\"\tUnsqueezeJM\n\tnamespace\u0012@: septimbre.SepTimbreAMT_44100/unsqueeze: aten.unsqueeze.defaultJ\\\n\u001epkg.torch.onnx.class_hierarchy\u0012:['septimbre.SepTimbreAMT_44100', 'aten.unsqueeze.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012t%unsqueeze : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%div_2, 1), kwargs = {})J/\n\u001apkg.torch.onnx.name_scopes\u0012\u0011['', 'unsqueeze']J\u0001\n\u001apkg.torch.onnx.stack_trace\u0012fFile \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 192, in forward\n    onset /= onset.max()\n\u0004\n\tunsqueeze\n\u0007val_353\u0012\u0005onset\u001a\u000enode_squeeze_2\"\u0007SqueezeJG\n\tnamespace\u0012:: septimbre.SepTimbreAMT_44100/squeeze_2: aten.squeeze.dimJV\n\u001epkg.torch.onnx.class_hierarchy\u00124['septimbre.SepTimbreAMT_44100', 'aten.squeeze.dim']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%squeeze_2 : [num_users=1] = call_function[target=torch.ops.aten.squeeze.dim](args = (%unsqueeze, 1), kwargs = {})J/\n\u001apkg.torch.onnx.name_scopes\u0012\u0011['', 'squeeze_2']J\u0001\n\u001apkg.torch.onnx.stack_trace\u0012fFile \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 192, in forward\n    onset /= onset.max()\n\u0004\n\tsqueeze_1\u0012\u0005max_2\u001a\nnode_max_2\"\tReduceMax*\u000f\n\bkeepdims\u0018\u0000\u0001\u0002*\u001b\n\u0014noop_with_empty_axes\u0018\u0000\u0001\u0002JC\n\tnamespace\u00126: septimbre.SepTimbreAMT_44100/max_2: aten.max.defaultJV\n\u001epkg.torch.onnx.class_hierarchy\u00124['septimbre.SepTimbreAMT_44100', 'aten.max.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012l%max_2 : [num_users=1] = call_function[target=torch.ops.aten.max.default](args = (%squeeze_1,), kwargs = {})J+\n\u001apkg.torch.onnx.name_scopes\u0012\r['', 'max_2']J\u0001\n\u001apkg.torch.onnx.stack_trace\u0012dFile \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 193, in forward\n    note /= note.max()\n\u0004\n\tsqueeze_1\n\u0005max_2\u0012\u0005div_3\u001a\nnode_div_3\"\u0003DivJB\n\tnamespace\u00125: septimbre.SepTimbreAMT_44100/div_3: aten.div.TensorJU\n\u001epkg.torch.onnx.class_hierarchy\u00123['septimbre.SepTimbreAMT_44100', 'aten.div.Tensor']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012r%div_3 : [num_users=1] = call_function[target=torch.ops.aten.div.Tensor](args = (%squeeze_1, %max_2), kwargs = {})J+\n\u001apkg.torch.onnx.name_scopes\u0012\r['', 'div_3']J\u0001\n\u001apkg.torch.onnx.stack_trace\u0012dFile \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 193, in forward\n    note /= note.max()\n\u0004\n\u0005div_3\n\u0007val_353\u0012\u000bunsqueeze_1\u001a\u0010node_unsqueeze_1\"\tUnsqueezeJO\n\tnamespace\u0012B: septimbre.SepTimbreAMT_44100/unsqueeze_1: aten.unsqueeze.defaultJ\\\n\u001epkg.torch.onnx.class_hierarchy\u0012:['septimbre.SepTimbreAMT_44100', 'aten.unsqueeze.default']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012v%unsqueeze_1 : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%div_3, 1), kwargs = {})J1\n\u001apkg.torch.onnx.name_scopes\u0012\u0013['', 'unsqueeze_1']J\u0001\n\u001apkg.torch.onnx.stack_trace\u0012dFile \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 193, in forward\n    note /= note.max()\n\u0004\n\u000bunsqueeze_1\n\u0007val_353\u0012\u0005frame\u001a\u000enode_squeeze_3\"\u0007SqueezeJG\n\tnamespace\u0012:: septimbre.SepTimbreAMT_44100/squeeze_3: aten.squeeze.dimJV\n\u001epkg.torch.onnx.class_hierarchy\u00124['septimbre.SepTimbreAMT_44100', 'aten.squeeze.dim']J\u0001\n\u0016pkg.torch.onnx.fx_node\u0012t%squeeze_3 : [num_users=1] = call_function[target=torch.ops.aten.squeeze.dim](args = (%unsqueeze_1, 1), kwargs = {})J/\n\u001apkg.torch.onnx.name_scopes\u0012\u0011['', 'squeeze_3']J\u0001\n\u001apkg.torch.onnx.stack_trace\u0012dFile \"/home/liruigang/timbreAMT/septimbre/septimbre.py\", line 193, in forward\n    note /= note.max()\u0012\nmain_graph*\u0004\bH\b\u0001\b\u0002\u0010\u0001B\u001dseptimbre_amt.cqt.cqt_kernelsJ\u0004N\u00036Cߴ\u0004+[5gI5œ4Fel5\u00076&6\\׶\u0003W@K777yj\"zܰ7:8WcK7\u000e,D\u0014ne!728Rr8P\u0018g ̺8%Q\u00139/c@\u0013=Iv\u001398\u00039X8Pa)25\u001559d\u000b90[*dx9_\u0015:`)8\u0005#\tU\u0014{9\u0017]:c9'\u001e\u0015\u0010[:\u000e:JZ~J;og:I:Pb9/ĺ\u001b5к9\u0005;p':),P\u001cL&\b;|#\u001d;8QS<p\u0001<t:\\;ќ:3k_\u0017.J9\u001f;z;<;\u0010D>P^;S\\;8j;:V>;&;Q\u0003;\u0003;q2i`⻶\u001fd?;k;ᆍ:xh׻ϻC:/\u0002<'\u0003;3q\b4;9;y|%\u0010Up~(;\u0017<J&;\f;\n4\u0007t:9\u0018<\u0019 ;\u000bՐ!\u0003TW`;\u0015\u0015<Mm\u0019\u000e;Cx%<\u000e;m\u0019M\u0015\u0015<`;\u0003TW!\u000bՐ\u0019 ;9\u0018<4\u0007t:\f;\nJ&;\u0017<~(;Up|%\u0010y9;4;q\b3'\u0003;/\u0002<C:ϻxh׻ᆍ:k;?;\u001fdi`q2\u0003;;\u0003Q&;V>;:;j8S\\;P^;D>\u0010<;\u001f;z;\u0017.J9k_3ќ:\\;<t:p\u0001QS<8|#\u001d;\b;L&,P\u001c)p':\u0005;9\u001b5к/ĺPb9I:;og:JZ~J\u000e:[:\u0010\u0015'\u001ec9\u0017]:{9\tU\u0014\u0005#`)8_\u0015:x9d0[*d\u000b9\u001559)25PaX8\u0003998Iv\u0013\u0013=/c@%Q\u00139̺8g \u0018񸴱PRr828e!7\u0014n\u000e,DWcK7:8ܰ7\"zjy77@K7\u0003W\\׶&6\u000765elFœ4gI5\u0004+[5Cߴ\u00036N\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000|崰-%1)5h5\u001cG+qõe6*6E<>.Z\f l\u001777ؙ6>3÷\b۷Jv\u00157N187\u0012_}z㸶8#8\u0015xyLu8\u0010\u00159bi;K\u000fZ8g958\u001fz\"Vl8̺9\u001ax9\u001b\"JKB\u0001:]\u0000:\u000b\u0001>r&:BD{\f:MX:\u001a+)8ngG\u00199_:B9\r\u0000\u001a@8\u001e:d:'QemU\u000e:ʽ:uX[\u001b\t:/;}9\u001f-b\u001f1:\u0006d_;E:$js\u0018Iz;2SB;\u0017.XȺ^2t;Zn;K\"\u0014OZiA;G;\u001f:\"%\u0013\"R:\u001d;\rb;ꌻuyj1;\u0011\u0017;\u0012z+w\u0001OSH\u0006;HE;\\4K\u0004P\u001e%Y;\u001e\u0012<_,;8\u0004/:\u0017</n;S'&\u001d9).o\n<|\u0003<')$Qs;Y\u001f<c\u001e:\u0018y;%)<y;\u0018c\u001e:Y\u001f<;Qs$')|\u0003<.o\n<9)&\u001dS'/n;\u0017</:\u00048_,;\u001e\u0012<%Y;P\u001e4K\u0004\\HE;H\u0006;OSw\u0001\u0012z+\u0011\u0017;;yj1u໘ꌻ\rb;\u001d;\"R:%\u0013\"\u001f:G;iA;ZOK\"\u0014Zn;^2t;.XȺ\u00172SB;Iz;s\u0018j$E:\u0006d_;1:b\u001f\u001f-}9/;\t:X[\u001buʽ:\u000e:Um'Qed:\u001e:@8\u0000\u001a\rB9_:\u00199gGn\u001a+)8MX:{\f:BDr&:\u000b\u0001>]\u0000:KB\u0001:J\u001b\"\u001ax9̺9Vl8\"\u001fz58g9Z8K\u000fi;b궻\u0010\u00159u8xyL\u0015#88z㸶_}\u00127N18Jv\u00157\b۷>3÷ؙ67 l\u00177.Z\f<>E*6e6õ+q\u001cGh5)5%1-|\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000cN\"\u000fA\f5M5˔4\u0013%\u001a>\u000015+6\u001476Zm\u0002_\u000b5$6\u00047<q:7:&\u00198V\u00028ŷx\u0017:48\u00028^շp\u001d业\\8.\u00119\u001d+n:\u00018~97!8xɛF\u00049B9k\u00159J\u0018P\u000e8Ϫ\u0014:\u0002f91ٹG3k\u0019\t\u001fH:p<\u001f:A߹Y\u0002y:l:ٴw\u0011'F::JҸjL?\u0013\f\u001b:l\t;+9z\bLq:w63;U\u0019:\u0015\u0013u2\u000fa\u0006:Z;|U:\u0014MoE=y;@;L\u0001\b;s;kǰ\u001f|;\u001b\u0003;\u0018ûC\u001de;;\u0002W:˻쳻Z*;|g;.;\u000eĻ\u001cH\u0004:D\u0014\u0006<ק;Nȭ{\u0015\tA;\b<O;JC\u0019I\u001b\u001c\u0001<*\u0002<3\"!_䏻^;Z\u0018<4\t\n !λ\u0000;G#'<2:\u001b\u0016y\u0002FNo;\u0005S,<0vo;\f\u0002f\u0016de:'<n;ϻ\u001b}!g\n~\u0019<Y;\u0006\"#}\u0003<\u0002<\u0007\u001dR\u0016\u001bn>\u0004<;\u000b\"\n<ې.\u000bZ\u001a;|i\b<¬:ٜiȻ{A2;;\u000b.;ARл:3;k;U-ɻf\u0013\u0011;J;\u0018$619݌;\"X;m՞@B\u0006 G;v;Dx@\u001aD:̠c;\u001b\f:b;:2/\u001c:և;;;}:\u001b\u0001)8\u000f\r;9=\u0010;흖:S򺮳޸T:ە:0cĿۀ魋:Y܄:\u0007m,\tqH*:\u0001\u0006W::\u0000\u0013<AQ!y9,P :E8q\u0012[ƹ$\"9r9\u0005\u00109:I\u0017;^]18w9\u001d\u000b9\u001b\u000f,M\u001f=+\b!9\u00138Ju%\u00003j8C8UeI~\u00158\u001018Yе\bJE[7j75E64:[\u001fed6\b7\u001b6\u0005|_a4\n\u0006\u00036KI5#@\u001c7\t-\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000ʹ\n@;\fɲ\u00125\u001aر5\u001fHϵùP~\u0019J6R\u00066!&c[vnNpn7n7\u001aG)<,\u0004`)PD\u00128\u0005&89ÊfEcٷ\u00198&;8캷@:yo*8\u00199\t÷L[Nj\u0004r&9)89\u001eY}Vsk9:\u00149\u001d7-3g9'(!:\u001bz8R+'\u0011Ñ9\u0001k:\fWT93h]99a:.9S\u001fu9a:\\.:ی2E19R\u000f;hK:uOg\u0018N9u4;K>:B\f\u0001Fb\u000b8sp\\;\b\u000f;Z\u000e:{\u0012~x9;B@;v(\u0016c\u001dr9qS;bQz;ۋ\u0016̷;;h;R\rzOջ<#\u0007F;վ;\u0005,\u0019[?T;f?;-]\u0004F~U;=J\u0001<8?X\u000e\tej\u0002;\u0003\u0010<鮸;\u0015\u000f$;z\u001d<*H:\u000eL\u00189a;Z'<i:x\u0017stJ;J-<lK*;w\u0012S\n\u0013^d;\f/<\u0013^d;S\nw\u0012lK*;J-<tJ;sx\u0017i:Z'<a;9\u000eL\u0018*H:z\u001d<$;\u000f;\u0015鮸\u0003\u0010<j\u0002;\te\u000e8?X=J\u0001<U;F~\u0004-]f?;T;[?\u0019\u0005,վ;F;<#\u0007zOջR\rh;;;̷ۋ\u0016bQz;qS;r9c\u001dv(\u0016B@;x9;\u0012~:{Z\u000e\b\u000f;sp\\;b\u000b8FB\f\u0001K>:u4;N9Og\u0018uhK:R\u000f;E192ی\\.:a:\u001fu9S.9a:99]3h\fWT9\u0001k:Ñ9'\u0011R+\u001bz8'(!:g93-\u001d7:\u00149sk9V}\u001eY)89\u0004r&9jL[N\t÷\u00199*8yo@:캷&;8\u00198Ecٷf9Ê\u0005&8PD\u00128`)<,\u0004\u001aG)n7pn7vnN&c[!R\u00066J6P~\u0019ù\u001fHϵ\u001aر5\u00125\fɲ\n@;ʹ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)\\ܴz\u001f/55wH\"zIȮ\u0012v6\fg6V;2'C77Fd\u0014-hUl7u)8[\t\u001aGz\u0019q8%8nj8QZ8\r9 \u00135,M\u000b\u0019D9\u000fFg9X\u001c\r\u001f͝9N9\u00159\u0002_L%V9\u0002:wU\rAVB<:8:ZMù`\u000b4ʇ:Oz:G_\u0013\u001b:Oۼ:\r:U\u0019`륹\u0003:\\:bS\u000f#'x&;z\u0000;u˺.?Mk璹pT;\u001a\u001a;!\u0006{W?Pq\";l\u00014;+/Ö͂h;L;8V\fg~\r9Z;yc;;1ɻ\u00019\u0003;8v;\r\u001e⻣<:\u0006D;;u\r\u0006.:$\u000b<ۆ;\u001dλ\u0006Q\u0005\u0011:\u0018<6;滈w\fV\u0001;#<;;TcL\u001c\u0011\u001f;&+<\u0015;2\u0007?\u0001\u0013P=;\u00161<\u0016n;\u0000\u000e)\r\u0012:\\X;\u00143<3X;A\u0012M\u000eo;1<\u001e\u001e>;B\u0013R\u0007c;\u000e-<\u000b&!;X\u0012ȷ;Y%<\u0018\u0003;+\u000e\u001aoʉ;@\u001a<O:l\u0007\\һ1;w\u000e<!:pM\u000eR;b\u0000<>\fA:1m绖|;׻;\u0006K93lϻ$Jj;\u000f;\u0010\u00119s]fS;\u001d;/gj2UT2\u0000:;6B;]X\u0005\u000b! ;\u0013];^r\bVp\u0005պ\u0006;\u0006.;Y󭹱V+1\\f:\u0014-\u0006;H\u0016e)\u0005Cb:\u00143:~_\u0011ɺ\u001cQ:Ԑ:\u0005:\u001a#ѹE:\u0004J:c\u001eg!Oiǆ\r:\b:)32c\ru\"%F9\u0006j9M\u0003C\u0011[\u000by~9\u00137Y9CNc}\u0016IB\u001d9\t8\u001d7j\"\u0004\u0004Ʒ78\u001b8\u001d\u000b_60bC8\u00078\u000b̆+k7<k7\u000bHf#\f7ٿ6{B\frsd<\b6\u00165N4\u0018An\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001b7KW45v\u0014c5,Kq\u0007\u0015\u00076q\u00007\\\r6\u00063\u00151\u001377`5\u001a󷈍jB7\u000b>8\u001c\u001d\u0016\f\n8lլ8緜[\u0000.D\u00069T\n9_X]Q\u0013x9\u000eF964\u000fb6\b9|9_ 8r%:n\u00139\u0017,29s:\u001cx9(sX\u0015:kr:8\u0015\b'zd4:(7:>\u0019\u0017\u0000O3I:w\u0006;I\u0018k+i\b8\u001b;'\u001b;\u0019\u0006Y\u001bV;cR';a\b>dJ;f&;ZN=\u0015eE:Z;,>\u0014;m\u0005ҡ6\u0005:\f;:\u000fwyjN;M;\u0002G:-gMQ,;Z;\u00119\u0007Fw;\u0013\u0001<Iox\u0018˄U\"*;;\u0006l#\u0000\u0017\u0015<\u0013;ӭ\u001c'_@\u0004Y'<\u0006;⻙$:2<;|\b\u0010\u001a;K;6<;K;\u0010\u001a|\b;2<:$⻺\u0006;\u0004Y'<_@\u001c'ӭ\u0013;\u0017\u0015<\u0000#\u0006l;\"*;˄Ux\u0018Io\u0013\u0001<w;F9\u0007\u0011Z;Q,;M-g\u0002G:M;yjN;\u000fw:\f;6\u0005:\u0005ҡm,>\u0014;Z;\u0015eE:=ZNf&;J;>da\bcR';V;\u001b\u0006Y\u0019'\u001b;\b8\u001b;ik+I\u0018w\u0006;I:O3\u0017\u0000>\u0019(7:d4:\b'z\u00158kr:\u0015:X(s\u001cx9s:29,\u0017n\u00139r%: 8_|9\b9b6\u000f64\u000eF9x9Q\u0013X]_T\n9D\u00069.[\u0000lլ8\n8\u0016\f\u001d򅸼\u001c\u000b>8jB7\u001a`57\u00137\u00151\u00063\\\r6q\u00007\u0007\u0015\u00076Kq,v\u0014c55KW4\u001b7\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"d41R㚴s\u00135F\u001e5lz3=\u000376H~\u001c\u0005\u001f`b]6}7R6շl7IN8\u0019'/u_\u000e88s8](k:\bCķx\u001d9w 8}]H\u00018l<9.8jq+)9N9\u0010^86\u0002s[p9\":n<\u0007nPzyI:iE:>\u000eٓC\u000e[:sG:(\u0003et\u00079>:n\u000e:gʺ#:V3\u0018;Fn$7k(lJ\t;T.;}\u0005k_^ɑYR\rW;k-;\u0010\u000e?F_9!\u0004;\f;(\u001as틻w:4;\u0000\f:\u000fٮ#F\bm;;/m޻]i:\b@;ҭ;\b;c\n\u000b;\u0010~;\u0001.\u0003\r8:9\u0014<V;\u0001oU_҆;B\u001f<M:\u0010\u001d_z;)=\u001a<@\r\u0017/1Xf\u0016<3\u0004<D*\u0001c1_ Ύ0<\u0011;\u001b\u0001U!0\u0000=;%9<0\u0000=;U!\u001b\u0001\u0011;Ύ0<_ \u0001c1D*3\u0004<f\u0016<1X\u0017/@\r)=\u001a<z;_\u0010\u001dM:B\u001f<_҆;U\u0001oV;9\u0014<\r8:.\u0003\u0001\u0010~;\u000b;c\n\b;ҭ;\b@;]i:m޻/;\bm;#F\u000fٮ\u0000\f:4;w:틻(\u001as\f;!\u0004;F_9?\u0010\u000ek-;R\rW;ɑY_^}\u0005kT.;\t;lJk(Fn$7V3\u0018;#:gʺn\u000e:>:t\u00079e(\u0003sG:[:C\u000e\u000eٓ>iE:yI:znPn<\u0007\":[p9s6\u0002\u0010^8N9)9q+j.8l<9H\u00018}]w 8x\u001d9Cķk:\b](s888u_\u000e/\u0019'IN8l7շR6}7b]6\u0005\u001f`H~\u001c6=\u00037z3lF\u001e5s\u00135㚴1R\"d4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000[&(g\u0007f<5\u000559\u0005p㭵'6F6ѶxTW\u0004$6}7\u00017Qӷ\u0002Ϸ7y?8\u0000ⷩ8q8;`p>6\u000f$9\u00078\u0019@&R5 8\u0015ߌ9w63\u001f2cZ9RF9sG;\n)\u001eq\u001d\u001f:L9\b\u0007\u000eݱ1ơ9u:8ù\u001d\u000f)b:4:\u0010\u0017۹@wɺY=:.Q:\u0002ǧLa\u0002\u000b\u000b:\u001d\u0019;0\u000f:\u0003:\u001a\u0003WRq:6;\u001f\u0017\u001e\\I{,T;B*;\u0015:C\u001c:Ε;):)\bopw6;\n;+\u0015큪;;̅Rxܻe,i9u;M5P;qȻ\u000f\u001d̻(&e;B\u0004\u0006<}A9ܮ\nՁY;h;>k/\u001b(>Rl\u001b<㖩;\u000fX\u000fbc;n-<Q:J&\u000fOȻ;7\u0007\u001f<EN\u0000\u00179h\u0004ͤ+<\u0012};q#\u0010)Y\u0010.;d{=<t3.;]T)RG3;KR,<Й\u0005U\u001d:\u0016P) <<;\u000eʻk():]/<\u0006f;1.\u0011?WS\t;Q\u001d<7A\u0001m\u001eo\u0002;wV;PG\u0019\rE9\u0015\t<Gj;$ѻ\u001cͻɵU;7;o9DX;;z\u001aY}ǻxU\u0002;;|=;8ya:;Zu#:5Ɔj\u001c2;];mՃ\u0010g\u000b%z@@;\u001ds:*񺘙\"L{\u0017:\";\u001d\u0013:q\u0001\u000eE:kP:DPֺg鹵:\ts:I5\u0014;\u00069m:n\u001b9u\f@\\\u001969\u0012,:$,\u0016XY49\u00199C69v\u00058\u0006Io9H8\t89gP6c\u000b\u000fI~'8\u0015]8m\u0001j̚\bɶ\u001a^87oyj\u001a\u001b77\u0005G6>T\u001e\u00036t6{\u0010\r=\u001961\u00105?#C\u001d4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b[\u0004@O45\u00054\u0001sql)T6M6\u0010m\"g957i\"7\"޷\u001e}߷7J8&)\u001el__8\u001e 8\u0004C\u001dpg=8\u001b59\f%7X0\u000f\u0000\u00198S9#~9B\u0010#\u00026\u001b9^\u0015F9\u001fݹ;9U.+:rVEu\u0001_:oJ*:\u0000?9\u001fe7!91:0S9R#úfɫ:,:#Q\u0006\n\n;\u001b;0\u000f:y2\u0010\n>:\u000bE;9<չ\u0003eZ9^;\u0019*;P@*偁\f:͜;ZP:#?;b<;Ҏ\u00125ȻL!M;\u001c1@;ĳo;Y;DM\n3\u0004٭';Wg;zj\u00074C\n;b\u001b<\u001a:4\u0015\n̷#;J\n\u000f<\u0002q\u0000\u001b,\u0016{\u00168,<u;\u000e1\r);3<e\"\u0011<Z\u001c{%$<\u0002<{O߻\f1|-\u001e;A<|-\u001e;\f1{O߻\u0002<%$<Z\u001c{\"\u0011<e3<);1\r\u000eu;8,<\u0016{\u0016\u0000\u001b,\u0002qJ\n\u000f<#;\n̷4\u0015\u001a:b\u001b<4C\n;j\u0007zWg;;٭'\n3\u0004DMY;o;ĳ\u001c1@;;L!M5ȻҎ\u0012b<;;#?ZP:͜;\f:偁P@*\u0019*;9^;Z\u0003e9<չ\u000bE;>:\ny2\u00100\u000f:;\u001b;\n\u0006\n#Q,:ɫ:fR#ú0S91:7!9\u001fe\u0000?9oJ*:\u0001_:EurVU.+:;9\u001fݹ^\u0015F9\u001b9\u00026#B\u0010#~9\u00198S90\u000f\u0000X\f%7\u001b59g=8\u001dp\u0004C\u001e 8_8l_\u001e&)J87\u001e}߷\"޷i\"77\"g95\u0010mM6T6ql)\u0001s\u000545O4\u0004@\u000b[\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000K^n\u000e\u000535\u0014s5~hdk1\f6\u000b7ߦt0:\u00147Ч-79\u000f\u000b9g~7\u0014N8\u0014Tt\u000f[A85A8\u0003޸Pָ8\n09\u0017\\it_9g\u00179D5Ov9԰9\u0004.\u0017\u0012øU*:9o'%MI0\u000398~:,Bn怹И:K:\u001aA]:nq:Ʌ\u000f!\r\u0011\u0014;r:\u0001*\u001b2:\\TM;+ \u0001i4b\u0006h;\b!;\u001dBjx%u:^;}zHᬻ\u0011W庅W;\u0005u;oC\"\u0015;(;m18>X2/C;\u0012\u0004;(Z\u0014\u0000+;\u000e<L9Г\u0012h\u0001t\u000b\u0002<1;\r\u0004\u0015Ve1;*<Ѐ:)u\u0004;\u0012<ŭ\u0004<Y˻L\u000f,&;4\u0001><w:H7\u0014,\u0018<S\u0013<Ȼ\u00028g\f;\u001aD<g\f;\u00028ȻS\u0013<,\u0018<\u0014H7w:4\u0001><&;L\u000f,Y˻ŭ\u0004<;\u0012<u\u0004)Ѐ:*<Ve1;\u0004\u0015\r1;\u000b\u0002<h\u0001tГ\u0012L9\u000e<\u0000+;\u0014(Z\u0012\u0004;C;2/>Xm18(;\u0015;\"oC\u0005u;W;\u0011W庖ᬻ}zH^;%u:jx\u001dB\b!;\u0006h;4b\u0001i+ \\TM;2:*\u001b\u0001r:\u0011\u0014;!\r\u000fɅnq:A]:\u001aK:И:n怹,B8~:\u00039MI0o'%9U*:\u0012ø.\u0017\u0004԰9v9OD5g\u00179_9it\u0017\\\n098Pָ\u0003޸5A8[A8\u000ft\u0014T\u0014N8g~7\u000b99\u000fЧ-7\u00147:t0ߦ\u000b71\f6dk~h\u0014s55n\u000e\u00053K^\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000ME2M\u00115s5&\u0012\u0019\tQ\u0010Y66@\u001cZv+o!7\u00067\u001bKȆ\u00008B,8dwO=q7&\u00188DFb7'\r@Yu\rc\u000b9JT8\u0006quNъ86\u001c9܀Ʒw\"ﻸ\u001f*969չ9z%:\u0006WLiVf(z:~B9ÃH\u0002@s::\\6Տ˺l9\u0001}:N9\u0005h|^\r\u0003;:ݺY\"\f:\u0019L;\u0005hgYggԛm;\u000b;\u0004X]&;Њ;ͰQ\u0010c\u001e_;\u0004;⳻ʘ;\u0002;܊R{%\u0011:=s\u0000<-:\u0001Jq,9;\u001f;\u0005\u000b^;B\u001c<?4\u0014%&7\u0006\u001f<4;\u0007(\b\f;'3*<A><s\u0012Ak=<;+\u000e/\b<\u0016#<͌/e?:c*I<Q&:A?Z\u0005\u0010\u001a$<\t<0y\u001e,u;V><\u0018\u0013z>@\u00000,<;}\nS\t\t;֝!<)\u0005(\t\u0017\u0006 <ٷb;\bVܽ\u0013b;9\u001d;,\fxrw\u0005f:3+\u0004<4ޤ:?H)JY\u0004\u000f;\u0016\u0003;w\u0018k\t;;l\u001amw6;\u0013I.;g\u000bb-\u0012;`Fy;sssW;U:E\u001d,꺺n:\u0011\u000b;yE\f\u000e9k\u0002;F\u001e9ٺ\u0010!D$\u001f:a:N0\b9\f:U\ri+j34:9y\n!܌9W9]ϸ:9͹SܷjѢ9\u001d8ag8\u0017\u000e9\u001d9L\\\r\u001fw7kY87P&\b\u0018J8S\u00178\u0006շ\u0019T\u0007\"7?7U\u0003nv+5\u001c7\"6萶Po\\kl5:95\u0013\u001d\u0001ih\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 @\t´<5\r5|\u0010kZP6\\6\u0014\u0007I\u0016_f\u0013\u000e5>7\u00126e*t.! 8)\u00168m2\u000b݀pr'8y8t۷A\t;FKh19BX8S\r\u001eg9`9a\u001bgJf89uh94\u0014g?9s00:Dw9A>\u000fC:d+I:H.I%E\u0000:n:\rN_غ\u001c`:5@:\u0001?Aa:\n4\u0002;\u0011źL,*:CQ;l\fmg\\+({;\u0017:w\u0004<\tA^;u;-(\u001e\u001e:\u0003(;h/[ѻر9;T;ǻ;;Іy\u0003\u0000;U\u0012<1d92\u0019p*}A\u0015<;{v\u0006ی:;Y\u0017<Ӕn\u0018/L\u0001;a\t<<a:<w#\u000b1<b;\u0007\u00180\u0013;*2<ܔ}Ek:L<b:@F F32<g;\u0001\u0014Z\u0019ze;\u00072<y>\r`d:(P><W\u0003;1\u0012\u000e\u0019<C;)\b5;d]\u0018<6.1\u001cpi9Ԅ\u0016<>\u0004;I%\u0007\u001c@\u0002;̦;\u0010ݩ]λ[;;gǺ\u0006Tٻ\u00076;T:r(5?;\u00156h;f]ELr\u0011:.;5\u001f43:zꔓ\u001cD];놉:\u0017I6кW \n;h:ar\u00044\u0016M:>\u0000;Dp\u0007,<]\u001e:-\n:v+=bY:S:\b~R9\u0017@:\f\u0007K#\\3Ը8U\u0001:EK9hp\u0012{Uz939S\u000fm\nt8H9Rf\u001a\u001c\u000b8{A80oQP [08I=8bbc\u00186\u001b7QS15~\u0003^ӀE='7qE6|䣶MP5Q5IU\u000f9dU\u00064\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000}57t\u0002@5&5\u0001\rҿ}gZ6IL\u00057Q;{\u0006p\b-6\u001775\u000f)\u000e&\u0001)A8;7NvFF-\u001288\u001e^C(9۔849\faos7\u001e9VH.8+t\u0007>9\u00029z\u001fѹҟ9\u0002\u0018:БM:м9̓:$`Y#ꢶca:9\u001aкt\u001a2::#ߺֺt:6\u000e;&3?3GM}:eU;ٹs-A;`:\u001b\n\u0012`;O;\b\u001dFXb;-;}/̻_:;hX煖\u0000<T6;Q\u0001;IV;KԻd/\u001a;\u0015<p7':z3<Mƒ9}8AV#25<AϚ;\u0007+!\u0018<R;\u0010<U\u001f*;M?<l2\fL:*P<:oLdm\b@<ۿ;B+V\u0011<\u0019<\u001c㻡,\u0001;p\u00018<%\u001c,;\r96<o\u000f:*\u0011uW\u0018<'ӯ;\u0001SٻUX;3;\n\u0003;;\u001d\u0004<+9\u0000X;Vn:sԻ+6H;{k;\u0013)X;K;S\u0011\u0013Pȝ:q;.K?0s幍a;:U=.\u0017;^:{\u0000\b?\u000b:\u0006e:<>.,ຆ9:˯ŭasK\u0003:sD9C`F&:H-\u0007:fh\u000499\u0007F\u0016tҹffB8R99t#7\u0014~\bL9G8\u0010;㱾8ȧ8xfNF7De8wI*K5#7iV6L<\n.79-6PMb\u00136`55GB'ZJ4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000E.$\u0018\u0003R5̀5&?\u0014\n.]{6\u0012\u00077ҮrsA6\u001e7{oj\u00185g[86K[sT8/8&Z1\u00199X8}2\u001f;hF9\u0007l9\u0006PxUAL9A927\u0019E8>:c\u0014Xf򐸸D:9\n\u0007\r|߫:C:{pVώ:x:Zºw\u000e:s\u0018;yK\u00138\u001e[:7X;0w\nZ9[;*\u00059\u0010\u0015٠;ec:\u0015[4;\u0017s;tϚ;;^];QOݻ'o;m;79\fz:-\u000f\u0018<\u0016>\u001f! H&<\u0010;(>\"t[&< ;f 4޻\u0015<l\u0006<9\u0007xr\u001c=;g/<04>ux;%J<M*\u0006Qf:\u0006dT<\u0007f:o9Ruy+aK<);\u001b@;0<fU;\\\u0002\u001e9\ba\b<L\u0017<rTỶ\"eL;)<x\u0001',\"\u0013;us*<2L\u001c$z\u001aH\u001b<ζ:8$\u0010q?=\u0005\u0002<\u0012w;\b2\u0012;\r%;쫻\u00116};˯;(\"<T\u0004M:J=;aHeT9u;z9f9 Y:*d;29:I\"CX\u0016\";:\u0002UϺ:i:âlbǺ9R:Us:\u0006/t9\u0010:\u0011ɸ\u000ew{oW\"NJQ:J\t9\u0005s))EqA\u0005:\u0006b9\u000f˹\u0019i\u0018T9j^9\u0007RI]\r9JX.9}\u0010[J8%8v!÷\u0001Ө6O8\u00145Lj7Ѷ\u00137\f6߼217޶6TW1\u0015 6*59he\foQ4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000*#i5?5J'ɀ\u00136\u001c\u00037\u000fpl!67\u00197\u0019rڹ\u0017\u001aٕ7pa8\r\u0012֏7t8w$)\u0017πM7iH9Pw5K59k8P\f̹\u0005ٸ9q19G\u0015B\u001f/:i90K˻\u0004Oth:P1:$5}Mg!N:^:e̚[!gߣ:\u0006:\b\u0003#:Iq\";\u001ce>Em:\\;2H\u001cw|(f:\u0003;,\u0019\"DB9\u001dԯ;8W\u001e3;ߘ:\u00104ݻ:;c$;Vv;i;\u0003*\u0000\nע\u0001\u0001<\tD;!\u0000[6޻;c(;e\f; \u001a<6PԻ3($3;_4<}̨*?r;XH<\u001fc\u000eOeB%;\u0017U<Ⱥ~_X\u0006:zyY<\u0006:~_XȺ\u0017U<eB%;\u000eO\u001fcXH<r;*?}̨_4<$3;3(6PԻ \u001a<;e\fc(;;[6޻!\u0000\tD;\u0001\u0001<\nע\u0003*\u0000i;v;Vc$;;:\u00104ݻߘ:3;\u001eW8\u001dԯ;B9D,\u0019\"\u0003;(f:\u001cw|2H\\;Em:>\u001ceIq\";\u0003#:\b\u0006:gߣ:[!e̚^:!N:}Mg$5P1:Oth:˻\u00040Ki9/:B\u001fG\u0015q199\u0005ٸP\f̹k859KPw5iH9πM7)\u0017w$t8֏7\r\u0012pa8\u001aٕ7ڹ\u0017\u0019r\u00197!67\u000fpl\u001c\u00037\u00136ɀJ'?5i5#*\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000s-9\"'g5\t|5̢ClH6]86\u000f.vGy7#7UԷKwr\u00198\u000bH58aNVPU8m8<\u0000\u0003m8Z#9 GWT+J9h9vz\u0010\u0019TS9լ9=\u0011\f\t39,:\u0002\u001bR\u0018:~:0UvJ:q:Feպi::l{\u0010ԟ:y&;6n>\u0000:vX;NMκHt\u0010:3N;\u0004/\u0012:Y;\u0001溻\u0006;;G\n\u0017߻\u001bb\r;W;\u0006\u000fH\u0002\\\u000f;,\u000b<N\u000e\u0004\u0015\u000b;`(\u001e<g\u0007Q\u0005'?P\u0002;/<֦\u00197:=\u0000?<2\u001eҺEH߻:ZK<;Df3Q!:XU<\u001aAX\u0001\u001fY\u0017\u001c:\r[<;/]A8]<A8;/]\r[<\u0017\u001c:\u0001\u001fY\u001aAXXU<!:f3Q;DZK<H߻:E2\u001eҺ=\u0000?<:\u00197֦/<?P\u0002;Q\u0005'g\u0007`(\u001e<\u000b;\u0004\u0015N\u000e,\u000b<\\\u000f;H\u0002\u0006\u000fW;\u001bb\r;\u0017߻G\n;\u0006;溻\u0001Y;:/\u0012\u00043N;\u0010:HtNMκvX;\u0000:>6ny&;ԟ:{\u0010l:i:պFeq:vJ:U0~:\u0018:\u001bR\u0002,:\t39\u0011\f=լ9TS9\u0010\u0019vzh9T+J9GW Z#9m8\u0000\u0003<m8U8PaNV\u000bH58r\u00198KwUԷ#7y7vG\u000f.]86H6l̢C\t|5'g59\"s-\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000<k8I\u0013\u00115N5MhQ6Q/6\u0014\u00166yan\u0011X7\\07|\u0013\u00163kр\\8L7\u0005P87Y@\u0018yʷ<K9h70m?t9\u000096ڹ?c7\u0005\t:a/$)185\"N:\u000f/x\u001e#\\9@:,<୺9@:d\u0014͍\u0019B:V\u0005;y\u0016,@:(;ºt;$:sgN;$\u000fM\u0016aNJ*;Ks;KH8T\u0019i;d;`J󤑻E;;\u0000_ꜻ!l;֐;;ػB;Q\u0012;ś\u0002&\r<^;\u001e\u0019\u0002 \u001b\u0004$<M;%x.\u001eǈPS8<x{;KoAWaI<0E;P%V<He\u0003;Ƚ[-?_<\u0011g:_aL՚^\u0016b<L՚_a\u0011g:-?_<Ƚ[He\u0003;V<%P0E;I<WaKoAx{;PS8<\u001eǈ%x.M;\u001b\u0004$<\u0002 \u001e\u0019^;\r<&ś\u0002Q\u0012;;B;ػ֐;!l;ꜻ\u0000_;E;󤑻`Jd;\u0019i;8TKHKs;NJ*;M\u0016a$\u000fsgN;$:t;º(;,@:\u0016yV\u0005;\u0019B:͍d\u0014@:9<୺,@:\u001e#\\9/x\u000f5\"N:18$)a/\u0005\t:?c7ڹ\u000096t9m?0h7<K9yʷY@\u001878P\u0005L7р\\8\u00163k|\u0013\\07\u0011X7nya\u0014\u00166Q/6Q6MhN5\u00115I\u0013<k8\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000jHg/E45\\5l?\n\u0007\u000e75^\u00137\"]Au\"kz&7j8j\b\f&88\th\\\t\\b8~)9z\u0012'IZp9ng9r~^9\u00159\u0014\u001b\r\t?:\u001cdf9tyo\u0012):28\u001a⇟8\u001b\u0001:fEOU'\t:6!\b;\\2\u0017F:$;ܺz+/\u0010;&6;7s8xb;O\u00125;#\u0014+(;K\u0019;a)\u0000u0;8L:N,M0;&\u000b6'\tQm:G\u0011<Dkr`\u0017mG;x\u0017\u001b<͊\u0007\u001f\u001c;:\u001a<FܻC\u0015 \u0011\u0003<%)\r<\u0016\u0001)<ݔ;\u000bs:Ż\u001e\u0011I<?;kTi:]<\\\u000e;ljc?lve<z-@\u0015c\"\u001c\u000f;o^<j=zVU;bJ<ǻ/<I;+<[\u0003l\u0019\u000f<Ŋ\u0005<C\u0018ề\u001d<\u0007ӷ;\t qv`\u001f<2M;\u001bp0\u0002t\r\u0016<nu:s\u0007\u000eI\u00106\fE\u0004<U^rM:hb;\u0005hdr\u0019!;';/3\\o>;J7o;v\"CdBQA;\u001e\u001a;:L\u001c/;_M:!\"cl1\u0012;\u0013:\u0001=5:>q8J]O8.Ƞ:}9( \u0004~9\u0007,S:5%\u001d?9,R9\u0001U9v9eK>\"IB9\u0002\u00009)\u001e\u00178C8\u001b\u0016\u0000ַΌ8dI7lFm\u000489ħJc/K5WA7\u001cĶ\u0005t5`h&623Cx4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\\ f8X5\t3ܑL\"e5\u0000\"\u00157v\u0004h!77ƠM\u0004\u001b8$8N8|g8\u001bC18)F\u0013xL9%(6k+A8\u0010o9\tJ+sϹwp9e9ù\u0002\u0011:X\u0006:K>Ly&:Z\n9\u001b\"n:l*%9\u000b;8oU\u0018O:F\u001f;c\u0002'\u001fʃ1;k\u0014;@c;ƺ:N8+;&bʻ\u0007:];2\u0003*\fڻč;Y;Sǻ?;ݮ;\u0007G\u001c<c;;;-9<\u00157@3;@<m\u000fW\u0019:8;dt,<\u0012d\u0012\f\u0018v/<\u0000;OGLdsZ<Og;\u000bfN؜\t+j<\bf̀h;[<\nnI\u0018;jC1<0\u0019+\u0014.<\n\u0016;\u000e=ɡWKD<\u001c7;D(;\u001a>><؟\u0019\u00172#a@;\u000e!<{H\f;E\u0002;λM;\"Ƈ;㻝O1~);:yԻ8\u0005n.;\u001c]BO\u001be&:\u001f;H\u0006\u000bq7\u001e;\u001a<;u)\u0018\u000b*;\":&\u0004$e9\u0016;<9\u0005ȷ\u0005:[\u0003m9hI:\u0013\n`\u0014:!!:3\u0011jڹs\u0005:9\u001e/\u0010DY9Ds\\8`@63k9}B\u0012Y+\u0004YO8q8l3Z\n\u001eF8Oc<88\"ѷ+7M7Q\frK7R5c׶)\"496n_\u001d4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Pjbv3\u00035\bt=#nn6\n6I\u000f\u001cd8vU7GQ7H\b\u0011\u001e\\g8\u001c$\u00067\u000e8냸i\b68Q\u0015\u00169Qq\u0003\u000fy9H8׹[4\u0006\n:\u001c\u0016i&\u0006M9\u001d9:2\u0012\u0011O>9jc:,:v:}_:j;9\u0011I\u00129&y\u000e;#\ba^\u0017k\u0017:\u0015;q\u001bx\u0004R;\u000fj:^E=;\u0003\bOtZ:\u001e;$jL\u0018/OH;M;D˻L^;D:C\rυ8c\u0017<\u0015\u0018Uݘ;\u001aG\u0010<}\u0007P\u0017<;*E5c:J<6:\u0019T~7\u0019;R<ͱcC\r\b<U'<F2\u001f\u0000\u0016S<;&g9Bݺ\u0015\u0012o<Iݺ&]h0;&T<y\u0001-3}\u0013)<X8\n<E\u0014\u000fU<\u001b;#MX9:\u001edN<\u0017lhF<9\u001al;\b\u001b<A\u0000`\u000eFk\u0014<[w;\u001d\u001a\u0002\u001c<\u00118x\u0012Y:s\u0000<(=hC\u0014Ի9;[h;dEdV;:\u0017#Iۢ;\u001bHa\f:zh`;&\r}&Y ;>:F#r\u0007\u0019;9\u0007K9:@\nI=:P*z:Q\u001b\"\u000bN:G993\u0005<\u001b:P$8/9F#p\u0018-9'\u00129\u001e(|4\u000397TȸFQX8BI3Q7\u00007\u000elo\u0010TO\u0004.7o\u00026%жU\u0000A6D\u0014\u001e4܁[\u000b4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001e\u0002fpo\u00015P5{g\u000bN@O6e6ZfXa൛7%5ٶC\u001aE7F8o[|TI8\u001d#8>\u0017}\u001cP9)/99\u000b\f\u0005zϮ9Y\u00189\r*x\t8̐Q:Sh\u001b..:sb:뢎<~4:y9RwB5u9U\u000f;kM.z\u0013:a\u0001\u0004;6Hm.n;h9$T:7#;\u001d\u001an\u001a;^n;Ĥ\u0015_;bV9\ts:;·%;í;=\u0014\u0011<\u0003-<B,\u001fx6Qi;)q.<Q\t\u0014Qd$<;&gJ<j_<z\u0016`\u000e;SCK<\u0014\u0006;\";G<M;hC\u0010.t<\u0010!iO ;bH<K#\u0015\u00164#M<};b\u0015b<q?M&;'<6\u0017\nP2<o;(j;-1/42<Be\u0019ؿ;c.;<__q<\u0002<Ϊ\u0004;.\u0002Bb9;\u0002\u001c\u0005¿z;{);\u0005Y\"\u0007;Da:\u001baw\u0005:~~;WȺwC\r;\u0002;)\u001ekB\u001b;u90\t\fʺ9\f:͎EX\u001fy: @:]|\u0019\"i:Af\u00198Z>\u0019+9\u001e\f:(`ζ\u00189NmH9\u0015gq9\u0006P1\u0004A8\u001e78})q8,E7h?}\b:\u00028\u0011Q\u0012Ҳ6\u00147\\陶[w,6!T5[\u0010\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'Ip\\5\u00125/\u00042\u0001571Pxsk77\u001e\f|N38\u0002(6$S\u00018\u001b8ĸ\u0001=98Biae9(\u001aaܹs9*l9!\u0017yTc:\u00194f=jF9K\u001a:L5l):9g]\u0007$97)\u0018;l\u0011?\u0017;J:Y%\u0004q;o\\\u0007*;_y;>N!#)\u0019;\u0003$:Oܻ:I;K9;\\;\u0012e\u0011\u001f<\\\u001d\u0015m;;M%u\u0004\u0011E<@\t4LK;K4<J\u001a@\u0002\u001aeO<\u0017g;Bbj,:ee<\u001ba޻@\u00157<XN\u0000<Bg3`4x<3BgXN\u0000<\u00157<@\u001ba޻ee<,:Bbj\u0017g;\u001aeO<@\u0002J\u001aK4<;4LK@\t\u0004\u0011E<uM%;m;\u001d\u0015\\\u001f<e\u0011\u0012\\;;9KI;:Oܻ\u0003$:\u0019;!#)>N_y;\u0007*;o\\\u0004q;%YJ:?\u0017;l\u00117)\u0018;$9g]\u00079):5lLK\u001a:F9=j\u00194fTc:\u0017y!*l9s9aܹ(\u001ae9iaB8=9\u0001ĸ\u001b8S\u00018$\u0002(6N38|\u001e\f7k7xs1P\u000157\u00042/\u00125\\5p'I\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\rJL\u0015\u0000DT\u00046\u001b\u0007\to6\u00177W\u001aO\u001c8 x75n87j8S Sy8\u000e1W70\u0017!8{ZO9AG|39=\u0007{8fn\u001f99Q\u000b:ӻ칬yN:hI9NS\u001d9YG:#[jc\u0019j):49l\b9\u0015;0Ⱥ!\u00000;\u0003:\u0010\u0000lԓ9b;`\u0018q^q(;9:.\u001f\u000b9*;_O\u001dj};:P;\b6\u0001݅8`\f<q\u0019;\u0015P;'m\n@}6<^\u0000!\u0012<d;\u001eHJa[<+C\u001d <e$\u0004<^R\u001at<\u0017\u0016\\\u0002\"<@j\u0018<-eYb}<Y-e@j\u0018<\u0002\"<\u0016\\\u0017t<R\u001a^e$\u0004<\u001d <C+a[<J\u001eHd;\u0012<\u0000!^@}6<m\n'\u0015P;q\u0019;`\f<݅8\b6\u0001:P;};\u001dj_O*;\u001f\u000b9.9:q(;q^`\u0018b;ԓ9\u0010\u0000l\u0003:0;!\u00000Ⱥ\u0015;9l\b49j):c\u0019#[jYG:\u001d9NShI9yN:ӻ9Q\u000b:n\u001f9f=\u0007{89|3AG{ZO9\u0017!80\u000e1W7y8 SSj87n85x7\u001c8 W\u001aO\u00177\u0007\to6\u001bDT\u00046L\u0015\u0000\rJ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001f| 94m\r\u00016\u000e6rm\u000173\f67\u001267\u001f\u0017\u0017\u0007lOq8\"E\u000e^88<%\tLb_9@.Q\u000bc9j9T`ٹ\u0010r\u0012\u0015:u\u001a͢(:K95t8:2IcD:ֹ9\u001c\u0007\\\u0017:\u0004\f;kǺ\u0018B;\u0005A9\bhD\\:P;Nm4 Ẳ;3:j^j;f;XȻR쨺;\u000f-!N\rh;;\u000f-\u0014\u0016:84\u001f<y=޼\u0000\u0011\u0017\u001b<\u001cg;B\u0018;\u0000\b:<\\\u0014\u0007E>sM<:\u000e:4dK;]K@<cZ:ϻKs<oa\b<.<\u001eaG\b<*8aj/<\\.\t<qu<5һw<#C<\u001c\u001f;SFhZ:h\u0013R<v\u0001R\ne><\u001c;\u000f\u001aHO\"n;\r <\u0011\u00058\u001c%<IA8)\u001a;};`,(\u0010;\u001cһ8;63x;mE\u000f\u0007;@}Jl_;s#:\u0014y6O9\u0016R;\"׺B\u0002\u0012\u0013\u0018;~J%::x\u00135\u0001:ڇ:V|^C̯:\b8ܪ\u000b9<:\u0018.\u0010l):\u000f$L9G9nAsr؂9\u000f\u000bo?\"F88ٸ]ɣɦ83\u0010鷼*\u0013[\u00038\u001e7ܠ:B697igc2[6®4V\r\u000b4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000N\u00125O5j\u0004¶7\u00185I7[{0*o$7\u001dF6N7z;f8\u001fʷ\u001e\u00109\u000bRs\"t\nA9V8b%_\\8k9>ɲr\t\u00158\u001f:\u0006yHAB\u000e:y\u0019:≺+SƯ:Fyu:&9\u0010Gl:\u0007\u0007;Q\u0019\u0014t[;\r!e)[VG;\u0003;\u001d\u0018\r:I;@VmIcE@;c9I仑;:U;6MPX\u0014<t!\u000b<sS;\u00065cD;r$<w!\u0014濰O<AxۺFJb\u0011<y;'`%\"y\u001cj<\u0003\u001f5%Xe<@\u0017;\u001bğ;E<\u0011[!D\u000f<<!D\u0011[E<ğ;\u001b@\u0017;Xe<\u001f5%\u0003y\u001cj<%\"'`y;b\u0011<FJAxۺO<濰w!\u0014r$<cD;\u00065sS;\u000b<!tX\u0014<P6M:U;;I们c9E@;Ic@VmI;\r:\u001d\u0018\u0003;VG;)[\r!e[;\u0014tQ\u0019\u0007\u0007;Gl:\u0010&9u:yFSƯ:+≺y\u0019:B\u000e:HA\u0006y\u00158\u001f:r\t>ɲk9_\\8b%V8t\nA9\"\u000bRs\u001e\u00109\u001fʷz;f87N\u001dF6$7*o[{0I77\u00185j\u0004¶O55\u0012N\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00005Ej`\b\u001e\u00176~jI6Q6167`w\u0011=y8ރ巷h\u000b84*8|<̢8JJ9yt19\u0000As̹߭\t:\\\u00069Iz9~7:W;\u001av::?m:\\9Z\u000f;[:P\u000f:m1\u0010H0\u001bY;\r\u00065\u0010!(;_8wpJ;ʯU;ú#9Wx;#*ȅ\u001dk;̮\u0011e\u0003 {;;%u\u001e\u0007:UI\u001f<2Nn\u0005\u001c@<@]Q[8\u000e\u0018<;s^\u0003\u001a2;>\u0013L<t2N>w<\u001fmQXpG<Y;葃\u0015;[<U=R<=U[<\u0015;葃Y;pG<QX\u001fmN>w<t2>\u0013L<\u0003\u001a2;s^;\u000e\u0018<Q[8@]\u0005\u001c@<Nn2UI\u001f<\u0007:%u\u001e; {;e\u0003̮\u0011\u001dk;*ȅ#Wx;#9úʯU;wpJ;_8(;5\u0010!\r\u00060\u001bY;\u0010Hm1P\u000f:;[:Z\u000f\\9m::?\u001av:;W~7:z9I\\\u00069߭\t:s̹\u0000A91ytJJ9̢8|<4*8\u000b8hރ=y8`w\u0011716Q6jI6򲶭~\u001e\u00176j`\b5E\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000|i2\u00005UV5s!]j$7ik\bcC`7Wr:~,28\u00007\u001cG\u00158ۑ8G\u0012A\u0004k9/x\u0015J_]9Vaᷴ칰9!9zABz9E:pl|:U@O\u0019:DHGf\u0006U:W:<L:/7;.G.{\u0001\u000e;\u0016\u000bPYϩ;98Nṻz;ucX;<\b]:\";\u0015ܻ[ \u001d\u0019\u0017<\\/\u001d<ԝ\u001c:\u000ez1\b;j;[BJ=\u0011;\u001a0<<[.\u0018ɐ[\u001ck<Wx\u00162M`<':Px\u0018<v\u001a\u0012<&\u000e;wn<6L\r\u001a<^rgMo<v\u000f;5\u000b9\u0013<Ø\u001a<{:IEd<P[5[_<p<12\bHA<rn\u0015;OuPj&;T;7\":\u0016$<>\u0002\u001e<zE(\u000f绬;:d;0;Ż'.8G;wh2\u001a\u0015{;BW'F;g]:j[Mٚ:}:\u0013+[FI:c\\\byU;:1\u000f^:ļ9'c[9Z\u00049S\u0007v\u000b\u0002(9ˋlE</\u001c9S\u001c~/\u00029,58-\u00108\u001e_8Zmy\u001085x+=\u0001m7XnIŶWM6IRc5\u0013l\u00144\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000~=崼+y\u001a6/p;Ӷy\u00057ť6F\u001d\u000eY7i7qQC684X\u000f.\u00169׮,\u0007\u0001x9ʵ\u0013Ū9,83\nH9{9K\u00139{d:\fvwɖ:Jch\u0005:\u001cع\u0002c\u000f;\n\u000e:\u0002I:_\u0002;'\u0014{:kw;%!\u0014iX[;\u001bm\u0011yXJ;Xi\u0012Ȼ{;\n:\r۳;*;j'~K;8\r<y(чQGB<\u0005\t6û\u0006_<$90\"Y<K:Pl4,<a;ăq;0C<΍yxT<\bB*׻<<*׻\bBxT<΍y0C<q;ăa;4,<PlK:\"Y<90$\u0006_<6û\u0005\tQGB<чy(8\r<~K;j'*;۳;\r\n:{;i\u0012ȻXJ;\u0011yX\u001bm[;\u0014iX%!kw;{:'\u0014_\u0002;:\u0002I\n\u000e:c\u000f;\u0002\u001cع:h\u0005Jc:wɖ\fv{d:\u00139K{9H93\n,89Ūʵ\u0013\u0001x9,\u0007׮.\u00169X\u000f486qQCi7\u001d\u000eY7Fť6y\u00057;Ӷ/p\u001a6+y~=\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00124\u0015\f6|_(8u17\fG?-\u0005ŭ7\u0016^8g\u0019b8|\b96L2e09#8jҢkV9vMk9\u0019V\u0002=@9\u001a9]c9`Q8&c:Ei\b,:\u0013}BP\u000f:Y\"Wк\";2cƹB+;;m.9\u001az\\>;&3:D> ;&\u0015h;;Ļp\u001b:;sջ,湦;\u001fϻߤ=b\u001c<eM߾1<= RMf\u00128<A\f,<V^;0\u0016gC\u001e\r<o;Ϗ{X#;\u0000d7<PzD:k<f\u0014c<uh<\t5̍<(ﻜo6 </>|\u0018eJn<:qg~\u0004X:<b;D;%o\u0010<ld;(1<\nG'΄\u001a?<E\u0017TZ29<S\u001cǻ\u0018>#<S\bGa[ڻM\u0004<\u000b\";lZ:ifѻw;H,;t@2\u0017:M;4\t:K;r;9ع}D2;~\f\bTph\f;\u0002#g0錺>8:2pK8Y:\u0018m8\r>S\u0010:v\n]9\u0016:9\u000e|z9W6\u00018DQ9QVQ_6\u00119θZԷ8ʉ\"3cַ(83:%{7\u001ft%Dն=zx6\u001e4\u001e#f35\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000,؂1%6\u0003ִNܶ\u0011+7g65\u001e鸷-7\u00177a$H8\u00038M\u000e8\u00028R8\u000679\u0014s8y\u00029j\u000698;\u0019:F#@\u0014@Jfy:N<\u0000Vj:4?\u0012\u0007;n|6|\\8;<º7{bo;\u001cJ9\u0013@ؓ;\u0019Ɔ6E6;Ry~;D2:6t;Z\t;\u0014؃;l6~;p/\u0001;U;F(7;2\b\u0007<_Xo;a-<\fb3}:\u000fR<U_b\u001c:Lr<؎XuCt<D ō<S'\u00030<\u0003S' ō<Dt<uC؎X:Lr<\u001cU_b\u000fR<3}:\fba-<o;_X2\b\u0007<(7;FU;\u0001;p/l6~;؃;\u0014Z\t;6t;D2:;y~RE6;6\u0019Ɔؓ;9\u0013@\u001cJ{bo;7<º\\8;6|n|\u0007;?\u00124j:\u0000VN<fy:\u0014@JF#@;\u0019:98j\u0006y\u00029s8\u0014\u0006798R\u00028\u000e8M縷\u00038$H8a\u00177-7\u001e鸷g65\u0011+7Nܶ\u0003ִ1%6,؂\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000BH44X\f6\"-5\"79-{671\u00046c8/\t278\u0016)\\7He99D7\u001a9<B5>\u001a:j\u000f0;\u000el:i>WDΗ:Ʊ`\u0007!X:*B(;g\u001f;r_;\u0006\u0000KXq?Ґ;ȝ{Uƌ;O\u0006ź}\u001b;&UG\u0005\u0007<λ/.\u001f<\u001a黚]f8<\u000f\u0000\u000bP<\u0004\u0005\u000b\u0000!|g<2\u0013D\u0017\u0004|<g\u0018\u0016\u0007ܻ<T\u001bH7lE<\u001a<\u0006z<G\u0017\u0010OI<\f\u0010O\u0017\fc<b\u0007R\u001c\u0014<,O\u001d)<^J\u001b\"<\"'Ż<\u0017\u0007Qn<O\u000f\u0018X<⍻\u00053@<g\u0002'<7ٻ\u0007)\u000f<\rH\fl;\u0001Ӻ{\f;8Lnd;LO/m\\/s;'\u0006R.\u000e8;i\u001a:u\u0006\u0011I\b;\u000bN3Ⱥ:v\u0014,\\:;ڷFIF^2:7\u00126\u0015t\u0006Ɖ9g7\u0004a9\u00047ܒLy\u001a9:\\7\u001a\n丐/8|\u001672f;\u00178\u0014I69ȷ%l7\bn\u00136\u0001m{6;R\u00175,T5\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0017gy\u0011?6j^7nM\u000e$t.<\u001b80շ\u001fz󷂳84~G#9n\u0007A\\9)JoQ-9S(\rF.:K<Sy:͓X8R:T&ܺT9O:\u001cPA:!\u0007\u0007;'VU:\u0004\u001e;ǋp\u0015\b;[1;;\u000bJ;\u0000h;;U\u0004޻v;59;v\u0004m;y';2D\u0019;\"\u0003;\u000b,&U\u0019<=#:rf;\u000f@8<l\u00148a\tFÑV<\u001a3\u0000Jޒr<\u0003\u000bBOI0F<dM\nARx<Yӻ\\2;A<P\u0005\r\u001e:<\r\u001eP\u0005;A<\\2YӻRx<M\nAd0F<OI\u0003\u000bBޒr<\u0000J\u001a3ÑV<a\tFl\u00148\u000f@8<rf;=#:&U\u0019<\u000b,\"\u0003;;2D\u0019y';m;v\u000459;v;U\u0004޻\u0000h;;\u000bJ;;[1;p\u0015\b;ǋ\u0004\u001e;U:'V!\u0007\u0007;PA:\u001cO:T9T&ܺR:X8͓Sy:K<\rF.:(SQ-9o)J\\9An\u0007#9~G48\u001fz0շ.<\u001b8$tnM\u000e^7j\u0011?6gy`\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00011G5}:5Hp6֨6\u0010p7k\u00186Z=~78i\u0017\u001f\r9\u0004f/B9\u001e53B\u000e&9\u001d\u000bθ[%:4EI8O^:#9:v亿\u000fq:Ƈ:'\u001f\u0001>:VT:M)p=; i9,\u0013tU;VA\t;!)\u001b\u0019}wN;B'gKx\r<\u0004\u0018߻`Ӻ\u001bc\u001b<5\u00193 :r \u001d<B\u001bd;fG\u0010<ieiM;\u0012;3|\u001c(<3H;<1^<W3x:w(#<?mYɓ<ScT+6<+Q⻋<[Ab̆<+{{\u0010Y|:4ab<7Pϙ;E,<\u0015;is;Fm\u0014\u0015<}m;\t\u0007Kf#<':9t!L#<k\u0013ߺ\u000fE\u0016<W^Բ\u0000<ƶb&j;Gwh0;~9\u001eTO;ai:x~:>1$&:\u0015:f\u0000:\b9=}:Լf8CGP\u0000@:\u0000︛\"\u0002:G)\u0004VuU9g5\u0016tD/9~Ӹn˓8\u0018v\u0004J6Q\u00038S\u0014\u001b6?(\u00197\u000b\u0019.6K5rԵC5\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000h g$N6w˴ݧP7R\u0015\u001c7d\u00137]lZ:8\u001a7\tXg\u00039Ta369\u0003\u0007MSx9ЁŹC\u0000%\\3:BL#9\u001fV:=P1<:<:\tD:\u0012h9u\u001b\u0016_4;U*Q\u0015{;H\u001f\u0000κL\u0012;@\u0005\u00057:8;Fڻ&;*[;\u0014\u000b;=\u0016;\u0018+M\u0016<c\u000e2KF<B~/<λba<'\rc^<\u0015kqR;\t8<ċҴ\u0013<;䏼Fh<;k:%\u0010ޑ<k\u0000\t\u001a:\"g<\t\u001a:k\u0000\u0010ޑ<%;k:Fh<䏼;Ҵ\u0013<ċ\t8<qR;\u0015kc^<\r'ba</<λB~2KF<\u000ec+M\u0016<\u0018=\u0016;;\u0014\u000b*[;&;Fڻ:8;\u0005\u00057@L\u0012;\u0000κH\u001f{;*Q\u0015U_4;u\u001b\u0016\u0012h9D:\t<:1<:=P\u001fV:#9BL%\\3:C\u0000ЁŹx9MS\u0003\u000796Ta3Xg\u00039\t\u001a7Z:8]ld\u00137R\u0015\u001c7ݧP7˴wN6g$h \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00001\u000f5\u0000w=,7?\u001a2ٶQ\u00008!()\u0015D7*vU8\u001d$ָwϧ8[?\u00178D=ij9t8cX9K鱹m׸\":LJ\u000e19Ug!:J:::*H9DκW\u0002;WЯ4>;5\t\u001d!2h#\u0002S; :s1\u001c;\u0019\"t;jO8\u0003̴jg;mTi\u0011<\u0000:P9\u0005<x9\u000b\u0000;O;c(N<<ȫ,#dz<\u001c\f6\u0010<s1;E<Rݪ2<;NI<\u001cÊH<H+';<\b\u0013_;\u00165<\u0013\u0015I<+5;yo׃<!\u0011@<h2wú\u00128D<V\u0011;mS; C˛\f<u-\u0005:m\b\u000f\u001a<x}0\u0001<\u0005»_8k;\u000e\u000bû);\n\u0007;pg;r-6R;\u0005ú\tq?\u0012;w躭ib9`:½(9:.9hj=:\u001e0ѹ;\u0006:\u001e}EaҎ9<hm;84@8\u0007Q8?7\u000b`%x/83\u0019C\u001cc\u0018;7t;춞\\f\u0006\n@6ֵL4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0016eN4\u000e\u000266ضe\"\f7̥Yԛ#\u00148at8ٸѝY88ֽ]jIj959\tD\u00169ƹԔ\u0016&:|mhf\u0003:f9q\\:ρ+\u001f\u0005\r\u0016;}L\u0000]\u000385[\u001c;\r>h+\u0014;7u:L\u0005e;@\u0006x7e;;':'p;16\u0010^l;ؔ:\ru1<,\u0002vAF<;E\u000fb;x\u000f\b<6xB<\u0011wMR<x%󏌻\n؅<Z\u001eE;d\u0012<ud1<C\u001dW\u0018\u001b<WC\u001d1<udd\u0012<E;Z\u001e\n؅<󏌻x%R<M\u0011wB<6xx\u000f\b<\u000fb;;EvAF<\u0002,u1<\rؔ:^l;16\u0010'p;':;e;x7@\u0006e;L\u00057u:+\u0014;\r>h5[\u001c;]\u00038}L\u0000\u0005\r\u0016;+\u001fρ\\:qf9f\u0003:|mh\u0016&:ԔƹD\u00169\t59jIj9ֽ]8ѝY8ٸ8at#\u00148Yԛ̥e\"\f76ض\u000e\u00026N4\u0016e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000=\u001a53b3]XW\u001fI\u000b5'6k5X7ӿو$\u00007s\u001472>G6hs*N7L7-6\f\r\u0007\f\u0004\u00196alQ8\u00118\u000b'n8t8\u0015>\u0000\u000e*8>59\u001fx8\u000b\u0006#ŁZ\u001bb\u000f7N9Y9\u001d\u0005dT\u001b\u001c9wL9bu7ٹ(>R9):΢9jF64\u0010Q:\nE:Cӑ\u0006\u0002\u0019\u000bAA:ԥ:d9,`i9b:5ԃ:\u0000e:\u0000;Kj\u001fҺm:\u001f;;L^:\t\u000b\u001e?<ߏ9AZ;\u0018\u001d;0׺xAXwI;u;/T_H^ $:U>;1\u000b;\u0012r\u001ac;wL;\u0019\t\u0000\u0015\u001bϻ;Dh;\u0010;J:aʻ\u0000؀:\u0017;i;)Z\u0018;\u0013\u0012;\u0019պe\t|=9;\u0001\u0010<#\r;Κ[\u0002+\u0017:\u0014<\u0015t;\u0011\u0001\u001d??\";\bX\u0010<1&\u0019\b\u0012ܻJȉ;{$<Wm;&tP\u0018\u0000\u0000\u0000\u0000P\u0018<&t;Wm{$Jȉ\b\u0012;\u0019<1&:\bX\u0010\"??;\u001d<\u0011\u0001;\u0015t»\u0014+\u0017[\u0002<Κ;#\r\u0001\u0010=9|;e\t<\u0019:\u0013\u0012㻾\u0018⻽:Z;);i\u0017؀\u0000;a;J\u0010ջh;D;\u0015\u001b;\u0019\t\u0000;wLc9\u001a;\u0012r;1\u000bU> $_H^;T;/8uXwIA:x;0:\u0018\u001dAZߏ?<;\t\u000b\u001e;L^\u001f;m:j\u001f;K9\u0000e麭9\u0000;:5ԃbܺi,`::dԥ\u000bAA\u0002\u0019:\u0006:Cӑ9\nE\u0010Q648F:j9΢)(>R99buwL۹\u001b\u001c9dT9\u001d\u00059YN\u001bb\u000fŁZ9\u000b\u0006#9\u001fx>5*\u000e8\u00009\u0015>7tn7'8\u000b8\u0011alQ\u0004\u0019\r\u0007\f8\f7-̶LӷNs*76h72>G6s\u0014$\u0000و5ӿ6X76k޵'\u000b\u001fI5]XW53b=\u001a\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000pt4\u0005[{~\u0002{ӻ5oW!6c|V~\u0016j\u0011y6\u0016P\u001f7EE6\u0014?+p4u6\\7{7͜H[\u0017T¶2858a?\u0018$\u00148\u000f;8o\n6Q`e͸>8BH495΃8x%U7m9J@9b/\u000bp|79\u001d9\f޸\t+D9.':@`81.\"9\u0017u:H9'jB Ҟ7:\u0006po:r$jƺ\u001dW\u000f:BK:KcU)`\u000b:\u0013;w9\u000b,\f\b?4:m;;S:\u0002\u0003YLWs-R;1;\fg'n̺caJ;*;\u000e\fo\u000fMP\u001a;\u0013ܩ;|:\u0001X{:;-`;/;l\u0019ϻ\u000b\u0000\f;}f;\u0003e.];T;hތ9_e)V;\u000e\n<\tC;\u0015ջ\u0001GD:w\u000e<\u001d\u0004;헻\u0006\u0018&\u0011\u0000<\u0014\u0014\u0005<[\u00004&\u001f{|R;:X\u001f<ٿ:m\u0012+:\u0000R;+\u0002(<;P(\u001d\u0000\u0000\u0000\u0000P(\u001d<;+\u0002(R+:\u0000<m\u0012<ٿ:X\u001fRû{|;4&\u001f<[\u0000;\u0014\u0014\u0005\u0000&\u0011;\u0006\u0018<;\u001d\u0004w\u000eGD\u0001<\u0015;\tC\u000e\ne)V;_;hތTﻋ];e.;\u0003;}f\u0000\f\u000b:\u0019;/;l;-`{X;\u0001;|\u0013ܩ\u001aMP;\u000f;\u000e\fo9*caJn:';\fg:1-RWs9YL;\u0002\u0003;Sm;\b?4,\f;\u000b;w\u0013\u000b`:U):Kc9BK̺\u000f\u001dW9j:r$:\u0006poҞ :'jB:Hչ\u0017u.\":1:@`.'DŹ+9\t:\f8\u001dƹ7p|8\u000b9b/9J@mѷU9x%95΃BH4>e8Q`8o\n\u000f;Ǹ$\u00148\u00188a?752T6H[\u00178͜7{\\·4u+p7\u0014?7EE\u0016P\u001fj\u0011y\u00166V~6c|4oW!{ӻ~\u00025[{5\u00054pt\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000?B4QI\u0019\u001aZ\u00124\u00046$ñ5c\"(..$3%\u00007l6Dζu\u0011y9be\u001f77*\u0019]\u000fx\f8\u0014D84\u0007#`\u001d5R8;8L%7\u0010-̸08&/9̩a84^+G\u001d[8%f9Z%\u00159@ a\u001f4!|s6a9I9Qx\nq鸣e\u000b:*\n:hJwbO*:5^:踓ĉ*9:P:\u001d\u0016\b91Ԓ\u001d-:\r:\f:\rɺ\u001b N:9\u0012;,:T7ֺ|\u0013 yO7A0;0:zȺ#\fSd.4E;8>;\u0007Ad$ӺL;z;\u000b\u0000jV\u000217p?;6};V{\t:)\u0002\u001d\u001a;D;~:O\u0005ڌ:;%5`;o|7y\u0016;3;\u0000&\u0004(ٺ;c;6p-\u0011|h\u0014\u001d;g}\b<n}d\u0001\u0017\u0017o;}\u001b<d:#\u001f\u0013\u0004n;\\\u001e'<\u000bI;\u000513\u0010\t;=)<;\u001bz|!\u0000\u0000\u0000\u0000i!<f;Yצ)\u00021\n\u0010<}\u0006<\t\u0019Jl\u001a(3K\u0003;G\u0014<\u0013ׂ$\u001df<;/\u0018<p:4\n5\u0001ݻ\u0016k;\u0013<\u001f\u00180;4⻁I:h,\u0007<\u0016;g=ʷѩ;%;de\\{\u0004Q;ya;p\u0002̻ \u001eo\u0015;\u001e;C\rR\bFC=;dz;0\u0004: y9T\u000e\u0006:^;\u0001:E1Mʫ5:\u000b\\;:r\u0004D8Cs';[:\u0018\u0019F::\u00142p6X:\u0002Է:2M\u0010~E>5:Œ:f\u001b8\u001cn\n!6M9Y:!y9؎\u0014s\u0018\u00168\u0015:a9&zJ~T90u9\"\u0006њz\u0012q}[9<9&#yNkB7/\u000386\u00009t9\u001cݸ\u0013m!PL8\u0007^86<_\u0013 ,7ځ&827l!·\u001f\u0000u86>7$g6[\u0005w> Gڳx\u00156']60.9`5uO5U\u0007\\^\u0011)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000O\n5\u001c\u000fn\u001d/\u0007#]5ۑ'6XlFKBB\u000b6F\u0001!7S1%[!U/{77jߵ(\u0014A̷%7=\"a8\n6뎸]HJ8\u00128\u0015f7\bŚظ\u001d?8?<94)8#^H+\u001bC\u000b89\u00158\u0006\u0019s\u0003\u00178WP9\u0012=9ֹ\u0002g#\u00069\u0013 0:ƨ9J\u0010F\u00058\u0015w:\u000b:u9'$98kf:\rHZ:6bF\u0013ɺ&L::<8\u0007\u001e\b;5:pq/ٰ!f%;\u001c;\u0000w]|A;mN;eqVUjպv[;Y;\u0001j\u0015~\u0019Ap;%;;]\u00178QP};\u001e;-T`лL\u0012R#;;/1\u0002:UqF{;\u0001<=!:%nʻ[\u0005j;\u000f<0\t;\f+yL;`[\u001b<`bG;\b@'\u0006-$;y#<gm;g\u0013:/(<c;?0\u001el:o)<q';׻v\r&\u0000\u0000\u0000\u0000v\r&<;q'o)l0\u001e<?;c/(\u0013<g;gmy#-$@'\u0006<\b;`bG`[\u001b+yL;\f;0\t\u000f[\u0005j;%n;=!\u0001F{Uq;;/1\u0002R#L\u0012;T`;-8\u001eû}8QP;;;]\u0017:%Ap\u0015~\u0019;;\u0001j:Yv[j:VU;eq:mN|A:\u0000w];:\u001cf%ٰ!:q/;p:5\b\u001e98\u0007;<:塺Lٺ&8F\u0013:6b:\rHZkf$9':u9:\u000b\u0015w\u0005㸑F:J\u0010:ƨ\u0013 0g#\u0006\u0002:9\u0012=WP\u0003\u0017\u0019s9\u00069\u0015\u000bθ+\u001bC9#^H94)?<\u001d?Ś8\b8\u0015f\u0012׸HJ]88\n=\"a%A7(\u00148j5ѷU/{%[!717S5F\u0001!B\u000bжB6FK6Xl5ۑ'#]ٵ/\u00075\u001d5\u001c\u000fn4O\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000I>4M(3W\u001b\u000b\u00155Z\u00126C5Gq(l\"B6M\u0000\u00197U\u001a6\u0011MS|P=\u0014776\u0010\u0006]v֊7.Y8T\u00047\u001aZ_l88Q68>67J¸28639\u000fzG7iT\u001d/\u001a9/9Ƥ\u00067\u0010\r=p&99s8\u0007[`9\u001c(:A\u001b\u000e\u0016I\u0019!\u000b\u001a:=n:ʻ^ڏ\u0015 `:9:1ƺXL\u0000:\u001f%:\u0012\u001e\u0005\u0017I}zs:\n;s/x--W\u000e;w-;:\bM[\n\u00177;[\u0014S;r$c\u0019úf;z;𶺐6TԺa;);amR4O޺\u0000;Gk;\u0014\u001aݻYb\u001a;#;?Clnٺ;Rr;V{gT`\n_Ⱥ\u0013\u0000<;#\u0015ˮ\t\r<;,A\u0012l\u001fE\u0018<;03&C=!<;n\n)Nɹ3~'<\";Tͻ*\u0000\u0000\u0000\u0000n*<=;0ػ\u0011'm\u00049\u0019*<n;v6޻D\"\u0002D:o'<;߻\u0019 s:s=!<v&;ܻ\u000e\tM:@\u0018<J;]\u0003ջK\u0002ʁ:t\f<\u0004l;wɻ!\u00112:w;ZED;K˻0:$;\u001e;<\u0013j:\u0011@;ua:╻G:n;:\u001cほo:yÌ;aߊ:[?\u0001:n\u0011e;r\u001fC:x5q\u00159:5;d\u0002:`\u000e\u0012f⺫~:y\f;9՘&L>Y:*:>\r=9~&o*::48.t/%V\u0001:AX:t\r\u00198V5\u001d۹E9/\u0012:Og6$r\n\u0013\u001e9!]9\u0013Yd?\u000b*-9\u001ddk9\\G\u000eø\tE8&L\t9˝L>JPA}8P\u00048\u0018\u0017\u0019>y̷\u00068\u00128{oT-﷊0Vrz7ny71=>]&v;6\u0011X6nN?6X4g5Og5_Y/\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u00025T[\r\u001e8\u000f6\u00056B/˼}\u00045?\u001f7c618\u0015F6\bU7-7R\u000b7f\tl8l\u001dG7;2lq\u0004O8\u001dW8x{P6\u0005}\tﳸ\u000f8i\t89\u0004\u0014tk希Wd9f9ѸWWȹz8E9\u00009v\u0017\u0018&:9f\u0015W\u0014(8~~:-\f:P\\ꎉ9:\n: ॺ׽-$:{:59p\u0003Q̺L:\u001e;\u00009|*YٺJ\u001c:,@;|P¹\u0007\u001caP1Ѻ8;M];Re3G;o;=9\b1|\r@H;r;\u0001\u000fWBI\u000e9;b;=\u0015ϻW:X;H;;xȻ*Ի1;\u0003o\b<:|taλ;F\u0012<\n)'::\u0011;\u000b\u0017<L\u000fl5#eۙw\u0005;\u001e\u0013\u0014<jT*.`[q\u0012<ع\t<{?2Y亹?$<K\u0007;VSû_/\u0000\u0000\u0000\u0000_/<VS;K\u0007?$Y:?2<{;ع\tq\u0012`[;.<jT*;\u001e\u0013\u0014w\u0005eۙ;5#<L\u000fl:\u000b\u0017»;:\u0011<\n)'F\u0012a;|t;\u0003o\b1*;x;H;XW=\u0015;;bͻI\u000eB;\u0001\u000fW;rH|\r@:1;=9\b;oG:3;Re:M]8P1:\u0007\u001ca;|P9,@J\u001cY:|*;\u0000\u001eL\u0003Q:p:5ֹ{-$׽: :\nꎉ\\:P:-\f~~\u0014(\u0015W:f9&\u00188\u0017:v9\u0000¹8E˹z8WW98fWdk8t9\u0004\u00147i\t8\u000f8\u0005}\t9x{P\u001dWܸ\u0004Olq8;28l\u001dGf\tl\u000b8R7-\bUڷ\u0015F8717cö?\u001f}\u0004˼6B/6\u00058\u000f\u001e4\r5T[4\u0006\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000/05\u001b1\u001cZ_5YD6N!\u0010ж\u0011\u0006\u00177[\u00127S\f\u001857Hw7oJg\u001c<p7\u0018{8V7sLv88S\u0017f\u00133t\u00169,9fzB\u001d+~9wsW9@q`*Ź8\u0010\u001196\u001eH9r\u001e\u0017F9\u0005?:\tщ8@Uc\bC\n,:S|:>_qSY1չI<:g:\rYC%ٺQMce:?:ú\u001e\u00018\u001d:%;\u000b4:\u001f`\u0007:L;Ҟb\rR:;`;\u0006PE%y\u000b;(V;M$;`D9]۷;X$;2Q\u0014;\u0002;\u0016:ӻ(\u00113;H;[\u0002ѣK;\u0002;\u001bd\u0010xJ\r<bG;Ȼ\u0010 :\u0006#<M[;\u0012\u000b.&\u0000=ؙ;?{*<\u0012:\u001d(\u0010\u0001s;\u0001\u001f<D\u001e'\u00137 M\u0003-\u001e<\u0004<v3\u0000\u0000\u0000\u0000v3<;\u0004\u0003-\u001e M;\u00137<D\u001e';\u0001\u001f\u0001s\u0010;\u001d(<\u0012?{*=ؙ.&\u0000<\u0012\u000b<M[\u0006# 溣\u0010<;bGJ\rx:\u0010<\u001bd;\u0002ܻۻѣK;[\u0002<:H軄3(\u0011;;\u0016\u0002ٻQ\u00142;;X$]۷`D׹;M$;;(V\u000b%y:PE;\u0006:`R:\r:b;Ҟ8LϺ`\u0007;\u001f;\u000b4%8\u001d\u001e\u0001;:?eQMc8%:\rYC:gI<Y19S:>_q9S|C\n,c\b:@U:\tщ\u0005?\u0017F9r\u001e96\u001eH\u0010\u0011`*9@q9wsW+~B\u001d8z9f8,3t\u0016f\u00138\u00179S7㸾Lvs88V\u0018{<pJg\u001c8o7Hw᷆艵\u00187S\f7[\u0012\u0006\u0017\u00115!\u00106N5YD_\u001cZ55\u001bб/0\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Z4(q_?5%6H\u00014jΟR:@6\u000e\u00167,⨶ȋ<Tz\u00197Y7jз\u0012t\u00047i8c\u00167E\u000bK:8f80\re\u0014Md*98$\u00138\u0014j{8q9S8bǬL9\u0010u9g\u0018ÆB\u0017\u001c:G\u001c\u0007:g\flWm8\"c:\u0000;9o\u00171::#6ȸ!\"ԺYA3\u0006g:V\u001c:sIz6\r*\n7\u001e;7:\u000b\u001fh\u0017.:N;[\u001899\t_ЬI;;@Z;\\Ǻ\u001c)&uN;,;mqꕻd:;Hf:uL;moTَ;\u0010;+^@+mR;&;!\u0019}t:-$\f<\u000f;d\u0001<Ļ7;x`\u000f<\u0018Cƺ\u001a\u001fsD\r\u001c\u000e<;\u001f[c\"u:E.<g'z;f\u0015i\u0004间;0<K\u001b0b7o\u0016<\u0010<(#C8\u0000\u0000\u0000\u0000h8<jg;\u0019\u0011#\u0016L;@8<7\u001c:K1ᵻd\u0004\u0006<\u0016<L|0*\u0018Ĕ$<P;(\u0010\u0019sG;\"<:N\u0011\r;t\u0005\u0004<\u000b\u0012D:\u000f#꺆;(\u001e;)F+\u001e:};@I:MȻF\u0012w;#u;;qnk»\u0004am;v;v34ϊ9c\u001a;:Ҡdh&D: i;\u0016\u001fU\u001fY1\u0006B\u001f;$l\u0013;Yٞi'ķ\u0013j\u0015;Œ:/\u0013Ѻк\u001e>:/:z8B2==]m:\u0005\u0004:ҹd}h:9VE\u0012_G)US9`\b&:$8+\u0001\u001fgk99\u001f޻jU݁9R$9\u000e*?%\u000e86&9Q\u001f8b\u001bg88%\u0015-8\u0018+897\u0015r뷵\u000e\u000f6jO7R6;\u001dq\b%6x16D2#l&\u000e{5\u0010n5\u0017x\u00136\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000ey\r5\"ߴ\u0007C[4\t{1695J)^6/7$l\"\u001d\u001a-v\u001fc7ۑ7߷\u001b\u001c17\u001az8{A26,K(B8^8D\u0003i\u001al17WJ9Џ8\\=|:9/ݞ9\u0015N2Թ\t\u00189&9\u001dԹ'\u000e\u0015z9C:\u0016Q8e`9S:\u0019b:<S\u0011Y} 8O:\u0012a\u000b:_܏:l:\u0015m߹E\u0016\u0006&\u0019;$:8*\u0019:5Y;\u0018ۙ9\tg|=I;Y;\u001crݑ&f9\u001fV;F:5WR;!¶;Frһ˺K;\u0019;d\b\nֻ\u0017;/\u0000<\u001cb:D\u0001Ce\u0013\u0011;BU;\b{xm\u0014Hc9\u001b<\u0018t;\u0007bP}\u0013; <ȨӺ\u0014 0\u00077T!<z;_\\\t$tP;v;<\u001c:&\u000b4LhŻ\r\u0006\r<\u0016.\u001d<Y=\u0000\u0000\u0000\u0000Y=<;\u0016.\u001d\r\u0006\rLh;&\u000b4<\u001cĺv;tP\\\t$<_;zT!\u00077;\u0014 0<Ȩ: }\u0013bP;\u0007<\u0018t\u001bHcxm\u0014<\b{;BU\u0013\u0011ֻCe;D\u0001<\u001cb/\u0000\u0017\b\n;d;\u0019Kʻ:r;F:!¶WR;5;F\u001fV&frݑ;\u001c:YI|=:\tg;\u0018ۙ5Y\u00198*;:$к&\u0019\u0006:E\u0016;\u0015m9l_܏::\u0012a\u000bO ƸY}:<S\u0011:\u0019b9S9e`:\u0016QC\u0015z'\u000e:\u001d9&\u0018\t829\u0015N8/ݞ|:=9\\9ЏWJl1\u0003i\u001a9D8^BK(8,8{A2\u001az\u001c1\u001b87ۑ\u001fcϷ\u001a-v6\"\u001d7$l6/^)6J69\t{1C[\u00075\"4\u000ey\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001ck3558\u001aA/6\u0013\u00026\u0001\u0010\u0010;6\u0013$B7\"&\"ݟ-|7/7\u0002\u001c\u00047*8q\u0013-\"ŷM8,8ٸ\u0015\r8VS9X+ꪸt9Y`9\\-sFP?9<\b\u0007:\u001bD#\u001e\u0001h+:7\u0007:\u001d\u0016\u0000X_-9/:H\u0007r7Xp\u0003Q:\u00101:pA\u0019Ӻ+\u0017:*\u0006;u`8Aa\u0014\"\u000e\r;S:ݺ\u00116|Z:\u001e^;,9\u001d+meY;gN;\u001e!:;E::?4\u0002;\\r;\u0019T\u000b˻ђ:;;¯:sӂ;!;yV\u0005z-:\u0003\u0013<w\b;0\u001c\r孻um;\u001b2\u0004<u쎻\"`em:?-<=;5 yջ;\f\u001a<\u0013Q7G\u0003:=<Z/o;*\u0000#󻭉\u0000<d(<A\u0000\u0000\u0000\u0000A<;d(\u0000\u0000#;*<Z/o=G\u00037<\u0013Q;\f\u001ay;5 <=?-`em\"<u;\u001b2\u0004um滅;0\u001c\r<w\b\u0003\u0013z-V\u0005<y;!ѻ»ӂ;s;¯;ђ\u000b;\u0019T;\\r\u0002?4;:;E;\u001e!;gNYe:\u001d+m;,\u001e^|Z\u00116;:S\u000e\r\":Aa\u0014;u`*\u0006+\u0017\u0019:pA:\u00101Qp\u0003:X:H\u0007r/_-\u0000X:\u001d\u0016:7\u0007+\u001e\u0001h9D#:\u001b7<\b\u0007FP?s9\\-9Y`t8+9X7VS\u0015\r98,Mظ\"7-8q\u00137*\u0004Է\u0002\u001c87/|۷-6\"ݟ7\"&6\u0013$B;\u0010\u00106\u00016\u0013\u0002/A4\u001a5584\u001ck3\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000dZ3[c5Q5>O[^6m%7aޕNm\u00007ii7=\u001c57Sa^8sp6N&68\r8b\u0005\u001f\f9)%91Ty%8\u00009|t7Tjȹ\u0002)\u00059>L9ʹj&\u000bz9>:׍Ҹαj8%F:\u000b:\u001e{v>Z:J\u000f:)\u0007i⺼\n8$\u0001;\u0000\r\u001e:w\u0006\u0012:]\n;܀'91/5:ĉ\\;]i91m=\u001fĺJf;,5;C\u001c#\b\u0003;{;˱\u001eTu]|;B;\u0014x%z;%t;/\u00153i88\u0002<Ag\u001e;\u0017);QF;\u001c\u0012_\u000f\u0005;oR#<w~:ō$㎆c_\u0015<&;\u001a\u0015\u001b;5<\u0001BW?\u0019_6<\u000eŽ;W\u001cѭ\u000f\u001a.;3<p#F\u0000\u0000\u0000\u0000MF<\f\u001cq;+\r4仑Q\u0010<-\u001d<c)86\u001a;$\u000eA<Iџ:-y7K%\t\u001d<;9\u000f\u0017i;c'<5r&j\u0007z\u0003\u0016<)Q;\t\u0016Kۻ.ĥ;D\u0003\u0001<7\"gx\u0006l\u001e;\u0019;*ػ,ԇ٢;;CI!]:;)%:J\b\u0013;tL;=qU:5y;ᾩ5hG\u0003?brC;O.:\u0012\u0002Hغ:*\u000e;/(MZ\n\u001b\u0014&:ʂ\u0011:侺\u0019j:\u0019:\u0016vӌ6H9~:\u00078O3h&\u0018:I\u00109~\u0017$x;99H\u0000/\t+N9\u000799\u0005\u001et8\u00179n!\u001c\u001e?@\t87\u001e\u0015\u00168o\u00128VK:Y'6U7>\u00106S\u000fdD6[6Ʀ1\u0003*e?5\u001f5<\u0019\u0017E\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Fh4\u0012Z`6T5pj\u001264?aZ6o.7#\u0010\u0000\u001b\t,7u\u001c67.\u0010׷+8?\u001bH8\"12O~\u00118<88|\tg\u001d\tϷC9\u00028\r_\u0005m-Fh9M9fORG\u0002ʹU\u00129]\u0005:\t\u0000Bx#Â\u000b6r::~9oDh\"w\u0012<:mq:f9\u001b19@:_3=溿?::1fyٺ:\u0017;\u00074E?\u000b,:g1a;~t39vM虺B|;j\u0016;m5bH;?;\f龴El:;i$:lԻ\u0019\u0015U;=ȇ;S;\u0015j;؂@v>\fkn:\n@\u0017<Q\u0016:%\u0018z7\u000f<=;\u001b\bҥ;$<X\u00007J\u0018:\b><C\u0018;8\"Ns&<7\u0000<\b#&;v=<IJ\u0000\u0000\u0000\u0000.K<\u0004J;\u0014>»@$<k\t<\u0007\f\u0001\"';B:<\u0019c'@\"\u001aZd9<[;D&'\n<\u001a;\u0012ϻN\u000f\u0012\u0018\u0006;\u001b<OD\u000f\u001a\u0001pt\u000f<\rE;058\\;K(;k'+D׻\u0013'\u001f;[;n*һcuuc;Z\u0012;\u000f\fQ\u0019l;x;\"\u001d@c:;<YNmψ5J;: >o\b:\n\u0002;]\u00033\u0001:Dj:\u00116ֺɹ0:':\u0017BK\r60:lU:ȹ{K$\u00189(3:I\r8r\u0012V!t99i9e{(A99z9Ÿ\u0003\\m7/@39ă7߱\u0006y'Id8GN8izII77P,8Z\u0003'6\u00167Ew56m\u0019`\u001e<I6H{6S%!t\f5g5*yF\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00004\u001c7O_Y5\u001f\"6x\u001b6~'\u000ft657f\u001a\u001ck5\u00167S67'̊:\\8Z\u00128gՁ88 c\u0018F\u000f8& S9\u000b!| \u000f9+88a͹^Ay9\"}9qW(9F2:g\fֹvj\"9g:︉\u0016G:Qj9غj+:h:[ں\u0018:0!;嚺\u0006DNN::Ve;릸\u00148G;a:T,C;!s;>uȽQK;ܽ;L\u000fMڻ\u0018\u0001:\u0007;9\u000e_\u0000<om;\u0011\u0011J鮻<;;N\n\";\u001fa\u001f<Y5q.wM:6<Dx:\u00178l]1<{;\"w\u0000K\f<^U\u001e<߻\u0014\b6̭;\u0003F<\u001fWO\u0000\u0000\u0000\u0000CO<\u001f;>G5F\u00066<+;ae\u001fý\r\u0001<\\Q$<`k3o;:<\u0017U9\u0019TQL1<49;\"Y\r<\u0019;PIbl;;t=\u0004;\u0003;G\u0003<Vι;\u000b\u001e;\u000e\u0014;\u0016ŻLS\u0014;;T};W4;\u0010;޺XjA:-;Я8\u0017qD8,P;\u0015\t:*VAкd\u0004;W:r%\u0002;{:#:\u0014}\u0007\u0012պm\"9'S:\u00019aTT~:>*9MBp\u0004\u000b:\u0005\u0007:pc^'V99fi\u001b 7s958Ngn\u0018\tzL-98H츗)8\r8\u001cO+\u0011A7\u001eG8\u001f϶F\u000fe\u0016e76Vi\u0019\u00016}6\u0017\u0000k\u001cx=5j5۴9?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00104uG\u0003Oy-5*6\u0000BF긗6+77P\u001f\"poL6\u001e7a~J89d̺8L7\u001eP83%m8\u000bƸ}C&96\u00199\u000ek=h`z8M9\nȜ9PX{ҹZrB9\f\b:\u0011\u001bb+_8gR:G27\u0005zzUi.\u001d:%h9\u0012P\u001e99:Yil:K\u0015(:Є:i-\t\u0017:y (;\u00161(HE?b:a\u0016h;gCP\u0018;8:Q\nh}x;\u0016;^S[;~*;YɡSi;;\u0010Y5-IU;s\u0005<\u0017s\u0012z:\u001c<L8q$7ga(<\u0018B;e(Id<$<G;\u001b(Co\u0019\u000f<\u0011<*O&\u0000;]7<fLEHa;\u0000N<\bS\u0000\u0000\u0000\u0000S<p:i`Ob'GF<;8lջ'<>I;W\u0013\u0010\u0007y;o\u001d<Ȼy&Е;v+<E++:W#(<*_ 4\\a\u0016<\u001b;\\T\t[͚;Ҝ;ӻ\u001c隻\rı;Lͧ;cx02\\;w;8\u001dЫ':s;rA5V8\u00190;9tl(oS;9:|2\u0002켺p\u0011\u0012;!:D纉к8:A:0~\t*:ٰ:\u001c\u000b̹fvU=9o:Y<0f~O<:+9\u0016>W!9]h9Jٯe[K|9eRU9-<18e\u001f9\u0003\u0007i\u0001)\u00108\\\u001c8\u001boد\u00046T[836\u0016}﶑7J6e]lJcǶm\u00017\tm6\u0004x{\u001fA5t5=\nA5\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00005#Hb,5`,6_j\u0003a627!\u0019-RT7s7-9ġ78H+>67W\u0001\u00039䠈\u0013/H6Bd9b27E\u001b\u001e>y9z8Jk\f˞\b:[9k\"鈡=:94Z\u0015\n\u001av:H<K:舺a䂺\u001eM:\u001c:,o̺9::\u000e.\u0015:D0;?IxM\u0002ϕ:\u0005rl;K`\u001clF:[;{\u0015򹩔\u001e\u001f8;&9ǻve\u0000c;[:^㻵\f7;\u001e=;#kqWF;Zy;\r\u0000t\u0000<4;a\t\u001a8=;z\u0005<\u001cB\u0013;\u000e;!<jʻq.\u001f;Q9<CJ;~DL<wDRX \u0005;\u0000W<R\\2Y\u0000\u0000\u0000\u00002Y<R\\:\u0000WX \u0005R<wD;~DLJC<;Q9\u001f䴻q.<j;!;\u000eݻB\u0013<\u001c;z\u0005=\u001a8;a\t;4ϻ\u0000t;\r\u0000<ZyWFkq;#;\u001e=7\f;^;[\u0000cֻve:;&\u001e\u001f¸;{\u00159[\u001clF`;K:\u0005rl\u0002ϕIxM;?:D0\u000e.\u0015;:9o:,:\u001c\u001eMa::H<Kv\u0015\n\u001a:4Z:=鈡9k\":[˞\bk\f9J9z>y\u001b\u001e8E9b2BdHݶ\u0013/9䠈7W\u0001\u0003>6H+87ġ98-7sRT-7!\u001972aʶ\u00036_j6`,,b5#H5\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00035TR+~w\u001c\u00006\u0005\u001f6F\u0001s\u00057n\u00197ԗ_:\u0018ԭ7e7[A\u0000\u001a\u0016\b68JFY8bz.>+8y8\u0016ܸ\u0017\rn\u000e9E <94ou\u001ea9\u0018ԝ9>يVȹȨ9;9\u000fʹ\u001b9A\u001c?:c\r\u0012+hXj$::>V=\u0001X:E#:)8tR纮ۈ: \u0006;\u0006\u0017c\u001b:2;'<lKֳ:؟f;պ_):\\\u0015; B\u0011:/;\u0018?\u0004(û\b;;\u0014\u001a\fc\\\u000e;%;\u0003]\u000f\u0006h\u0003\u000f;_\u0010<=\r͝\u0019\t;;\"<?\u0005Q++\u0002:t3<fW;\u0010H:\u001fB<ANǺ/H\u0018ٯ:&N<)\u0016S\u001au:}}W<:Z\u00169\\<_}]\u0000\u0000\u0000\u0000]<_}9\\\u0016Z<::}}W\u001au\u0016S<):&N\u0018ٯ/H<AN:\u001fB\u0010HܺW;<f:t3+\u0002Q+<?\u0005;;\"\t͝\u0019<=\r;_\u0010h\u0003\u000f\u0006<\u0003]\u000f;%\\\u000ec;\u0014\u001a\f;ջ\b(;\u0018?\u0004;/\u0011 B;:\\\u0015_);:؟fֳƺlK;'<:2c\u001b;\u0006\u0017: \u0006ۈR:)8t:E#ź\u0001X:>V=:Xj$\u0012+h:c\r:A\u001c?\u001b:\u000f9;ȨV9>ي9\u0018ԝ\u001eaou949E <n\u000e\u0017\r9\u00168yҸ>+.8bz8JFY\b6\u001a\u00168[A\u00008eȷ\u0018ԭ:7ԗ_7n\u0019s\u0005\u00016F6\u0005\u001fw\u001c\u0000+~5TR5\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00144.e^\u00146f\u0004\u00016\u0018)v\u000e)746(j\u0015H70tM7>528\u000e7ؼ\nͺ\u00029Q70\u0018ƷLi9z7`%\u001eBf9xRh7e}\u0018:l|\u0002\u0004;\u001f8ބb:$t3ے|%9Vx:]^绺Ӑ\u0000::*_1\u0019]:\r;hr\u001fwX:<2;v׺]D\n\u0002;aW;[\u001cEj:8;,\u001b|;ZXks_z;%\";A攻31;ҏ;ɷ잻\u0011?;ѡ;\u0018[\u0016U;5;[G\bB~\u0013<#;\t\u001e<ĕN)<V;D{3\u0010<<.o;\u001dEYScM<5;\bT1\u0014P}Y<9 :é]L\\M|`<\u001a:a\u0000\u0000\u0000\u0000a<\u001aM|`L\\:é]<9 P}Y1\u0014;\bT<5cMYS;\u001dE<.o<\u0010;D{3<VN)<ĕ;\t\u001e<#~\u0013B;[G\b<5U\u0016;\u0018[;ѡ\u0011?ͻ;ɷ;ҏ31;A;%\"_zks;ZX;,\u001b|:8Ej;[\u001c;aW\n\u0002]D;v:<2wX\u001f;hr:\r1\u0019]_:*:ٺӐ\u0000:]^9Vx|%ے:$t39ބb\u001f\u0002\u0004;:l|8e}\u0018ܷh9xR6f¹\u001eB7`%9zLi\u0018709Qɷ\u0002\nͺ7ؼ8\u000e27>580tMHj\u00157(74ɶ\u000e))v6\u00186f\u0004\u0001\u0014^5.e5\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0012/4\u0013~\u001d\u0013)65)sǶⴵKB70\\5ٟt5t\u00048\u0011̶ԃDrz7\u000e8MDm}Z8A\u00108$A\u0019\u0011\t999I/Y;9\u000bt9ҥùQ\u0002:Մ9.)x\u001f{V:'L9\u0007;K[s:\u0017{95\u0019\u001b\u0017\u0010.9\u001e:+˹\f5\u00000:\u000f;y\"\u001e;ɽ:=*;+Q.3V#;)7;L\u001a7\u0015\ty;0;\u0005\u000b2X#i;|\r;A\u0004Ż\u000fz&;:)\rFֹs\u0004<Vr\r\u000eη:͚\u0014<=\u001b\"h\u0019\u001cm;e\u001b<\\\u0006g\u001b>;2#\u0018<۫ƚ\u0011\u001f\r<\u0007<dr |vC2<U;\u0011B\r\u0013&dO<o;Yw<1\u0012a<\u0013@:-d\u0000\u0000\u0000\u0000%e<RCaJ=;O\u0018[<wf\"\u0014Q潴;\u001aD<gٻ׎4,;\"<[-\n'\u000fZ\u0014<;ib\u001b_̻jB\u001f<\u0003;\u0011 ϒtW\u001d<k\u0001';bJ\u0019\bؽgH\u0012<P\u000f9OW\t9;ԙ\bX:\b;\u0014p´\u001e+;\u0004;)X:RA;\u0019X;Bx-z>;f\u0007;5ʺuC);2:Ȃ\u001a\b >6A\n;d>9˥t<:\u0006\u0018JM[\u00079w:y`{yl}9;:M`C\u0011\bu9oj9lJ\u001dt\u000ev9v4e9\u0018T'\u001e\u001d\rp09\b8\rSpR8\u00128A\u000fSzm8G56`#C۵h7r>Հ=55\f7Vӵ\\\u00125\u00195&HC\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000V.4km6\rYC\u001e;6k7e\u0017ֶ>w\u00036F7 ]϶w\u001co7{7^k\u0015J8085\u00169]>8D\u001e8.훷زl9O\u00128L89@3f<9:9r9Q\u0005z-:\u0003:>\u0000l.\u0003`\u001f:2q9\u0013^:jM?\t\u0004-\u0017:\u0012;x팺y\u0018\u001d: ;\u0019\u0016Y\u001b\u001eJ;\u000f\u000b;w|\nU;@:'ތe;\u00119D\u0017ѻ}:;VٻH;Je;4iʻ;`;O\u0012Mky%<\u0006;[4Q=<wߺwAx;#L><g3%4Qu\u0002<w\u0011#<9|!w|\u000b\u0002r<<,X;\u0006Rot'a<\u001b;=\u0010i\u0000\u0000\u0000\u0000\rXi<J\u001ca\u0014,;gKS<yݻ\n>\f<\u0002@#<)\r%4\u00046<p;A1}FE<&:-B9u8</\n\u001d*B\u0016r;\u001b\u0010\u0017<_\u0000O+;Ƣ;\u0003!ػ\u0018;B;ͫ_;2'9\u0004I4;M:x/̻\u00009\u0017ȷ;)\u001b:;\"\u00147VU%;1#;z+d(;X:\u0005\u0018\u001e\tk#\u000e;F\u0015O9r9\u00029:ض\u001859ʁ:|\u0011?\u0004l\u0014:i\u0019\u0006:\f\n%9-J9H?ֹ˾[9ǖ7ŇӬ7%J9p8\u0003o\u000fY8\u001b8R!s\r^58(i\u000e8=\rb˕37#b\u00067郷%X3\\\u00177e4~4)E5\u001fV\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00002\u000f\u0015241;6O\u0006\u0001öF\u00006\u001d7<f.K~7yD79P\u0006B89øT-8;8 Y,\u0011g%9\u00159Jr( \u0000o91\u00188\u0017f(83\u0019:TSۊ198Y>:Bf98\u0003:\u0019:޶Mݶ\u0005\u0016:_7㷏\u0006P\u000f:sZ\u0014;~]\u0018.\u0000;H\u000f;\u001e7$캅m;\u001a:Qi\riŧ;*}y\u001a;~9;A\u001c@;A;⻬\u00010Y\u0005<Xw:yg\u0013\u0017:sp\u0019<D\rc\u0015\u000f/;Q\u0007<\u0005+޻8'<w;g!A\u000b\u001eQ<QLU~;RL<⻯6\u001e<d\u0015</Dxӻ]\b_<\u00078[;)m\u0000\u0000\u0000\u0000\u001evm<[_;kE<\u0016\u001a 8<o;6OQ4ݎX<\bnU:T7\u000e;\u0018E<؝\u001a+p;Db\t<(\u000b@Żo\u001a<\u000f5j;T~\u001ey@\u0018<>I\n\u00187;\n;k68\u0002;Å;յ\"\u0016;:֫?w9!\u0004;*r|8\u0019:zC;<\u0019g\b\n#;\u001bh:\u001f\u001a\u0013\u0011;o7\u000e\u0003%89@:u(4>BHK:zL:ǀRe\u001atE:.l9l+E\t=<\n:ҙ\u0013\\ҹ;\u00119I\u00009\t,>q;(948{X\u00122*LdE8]7:6Ac8s[\ny7=y7\u0012Q\u001a\bS\n7?6'Œ\u001bh5\u001coh\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000#Y5|\u001964}yx6 7n_6\u0018#\u0002~5))\u00008\u0013f72Q\u00188*JS8蓕 F\u0016873\bO7\u0013+j9|x\u0013\u001f=t9I9˹OSf\u0013:872?$9\u0010_:?Hi>d:\u001eQ:̫\u000b+:\u00148\rm\b\u0019:\u0013;&Qh\u000e{0\u0018;ӷ:4S\u0019\u0015;\u0006(\u0010d+:T@;O\u0003\u0007ɕ;F;H ͻ忶k;A*\u001dQ;;-˻q\u0004<d\u001d;8\"\u0002y.3<Z񺨾4\u001c;#<\f+?\u0000d=9<;LJWǶoUlb<9R\u0004WXk;\u00189<\u00180E2\u0007MZ<;j*q\u0000\u0000\u0000\u00009{q<u\u0018T][\u0007<+A1<: ﻗZ<&U;ke5s:\u000fZ<<:<\u0002<\u000f<9?'űb9<\u0017:8\u0005\u0011:a'<ҡS\u0001\t\";:;\u0001F)(Z6\u0004<vJ:PIW:\u0016\u001d;\u0005PS˥#>;w[;ѝWCغM\f;J'\u000f9s:(Mb;)ZO#\u001e\u0019;I:(\u001f\u0012\u001a&b\u0013;5I\ri\u0018:%\u000b:\u0016we\u0018{:o\t:p5x\u00047\u001dYU:Ꞹ5%K n9KB95ԙ})u&9\u00049h)E\u001eQ9D\u0011)k8Fɲ8\u0018~Ҫ9;[8w\u00117?\u001c!h71\f[66q+0浍5Y4m\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(|U5Ek\"\u0005l;6954$s7ɛF,7&[7Bc\u00108\\\u0019\u0011֣w8\u0018\u00029cT\r\u0017q9i86ؿ89\u0018\u001eփڹH99C\u001a\u001c_~:̅ǎ#C:5:0!:j:8$\u00121B:aY\u0018;yM\u00039;\u0010:+rt\f&r8;v޺:\u000bUe;CW;1ݺ\u001c;-\u0015\u0015໹OS;|;BOGϖj\u0005<:q\u001bط:޼\u001d<AU3\u001f\b\r<;\u00028He޺K<\u00079C\"r;\u001e<7Ù`<m:t0lk;5W<y\u0015w#R<\u0004;\u000fs\u0000\u0000\u0000\u0000\u000fs<\u0004Rw#<y\u0015<5Wkt0l<mÙ`;7<\u001e\"r񻬞C<\u00079;KHe:\u00028<\r3\u001f\b<AU;޼\u001dطƺq\u001b<j\u0005Gϖ;BO;|ͻOS\u0015;-\u0015:\u001cѻ1:;CW\u000bUe:;v:\f&r+rt;\u00109M\u0003;y:aY\u00181B$\u0012;j!::0:5#Cǎ:̅9_~\u001a\u001c8C:Hփ9\u0018\u001e9ӹؿ69iq\u00178cT\r9\u0018\u0002֣w\u00118\\\u00197\u0010c7B8&[ͷ,F7ɛ6$s69\u0005l;k\"5E5(|U\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000:\u00125Qʟϴ\fc6\t6,R(7A=\u00148\bnW<&8k8~\u000f\u0018H\u00169_紷AE\u00019J9:\u00059l\fX\u00069\u0006:py\"j?\u001bw:3\u001f?;\u0015::@IQ0:e\t8\u000f\u0012\u0019w:-\u0010;'\u000b#ϺQ; e9c|T:\"8w;C*W#5V;ya:\blûӂ:;䕻.\u0013;\f:,\u0002\n:\u0007<Vexϻɸ\u0014<%5;23#:0<\u0014ݻF\tr1<a;\u000eWD_:\b\bU<Vu(C<P;tao[u[:e:n<\u001a껗\b?;H<Y:;w\u0000\u0000\u0000\u0000w<Y:Ի;H\b?<\u001a;e:n[u[tao<PC(<Vu;\b\bUD_ź\u000eW<ar1F\t<\u0014;0#23<%5ɸ\u0014x;Ve;\u0007,\u0002\n<\fۺ.\u0013;;ӂ\bl;yaV#5;C*W;\"8wTc|; eQ#:'\u000b;-\u0010\u0019w\u000f\u0012;e\t0IQ:@:;\u0015?:3\u001f7\u001bwj?9py\":\u0006X\u0006:l\f8ֹ\u00059:9J\u0001AE9_7H\u0016\u000f\u00188~8k<&nW8\b7=\u00146A7,R(\t65\fcʟ4Q5:\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00003iU5d\r>6\u0011\u0016n\u0006k\nI7G\u001dΆ77/ai|8Y÷3ĸλ8C\u001d8\u00046\u000f3_9\u001a\u0005\u0015vR9JE&9\u0003\u00018/N\u001e:A4x\bt\u0001]:L@9#9:\u001cUu:.*\u0016\u000e9+:/:\u0000c \u001f\u0015v[;!\n9\te\u0004/;s);*\u001d\u001d;;\u000b t\u0016;:9;\u0005:rx;\u0003%h>\u0000<\u0004.\u0015;\u0002\u001e\u000f';\u001b\u0015<#-û\u000f4<8:D~;IP\"<I/@\u0000`<v*Y?\f<\u000f\u0019<]Z8y<4kJV:<N;\u0016y\u0000\u0000\u0000\u0000jy<\u0015\b=T;JW<\u0004;u{@:;5`<۰\u001bR\u000e\u001d]<:mVdF\u001b;e93<5&\u00022 J<B>)9)m;;U\u001a=-Q\u001e%<4\u001b_B\u0006k;/Ɨ;\u0007Ho\fW;-tC;6\u0014;O^\u0002':ڜ;\u0004/5߫;u;F:kl㵄:a-;.\b'\u001b;7\u001f.\u0003i:v:٨S칼-:\rVv\u0018:bn\u0001:?2ݺ\t\u0016:=役Qؚ9+\u0003\u001a9bI9jR7\u0004V9k\u0011ȸ߸Y8277g:[8L\u0006ꬷ7\u00075}.6$6̗L⵵I\n6\u0000\u0010GRm\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0015|5X\u001eεڏX6l5\u0015P6n77&8=2gW;f8>>80J^+70!9a\u0019\u000eA9t7ÚBT9\u00079_N3\u0002[s7:OۖD8n/T:9\u001589pz:\u001e8o\b_\u0002;/^Ln\u0013n:\u0007::@GF\u0015we;\t\u0001H@;܂;\u0004`:\u001f\u0019\b;;hC\u0004\u0010;Իy;op;Q\f/:B\u000f<cλ~&<ru9\t4%;\u001b0\u0005<8܇\u0005;V<뱻,)@<͉;roŖ;^P<O;#<ջ$|<ձ\rKl\u001c%*<\r<g{\u0000\u0000\u0000\u0000g{<\r\u001c%*Kl<ձ\r;$|#<;O;<^PŖro<͉)@,<;;V܇\u0005;8<\u001b0\u0005%ʻ\t4<ru&~;c;B\u000f/Q\f<opy;:\u0010߻C\u0004;h;\u0019\b\u001f;\u0004`܂H@;;\t\u0001;weGF\u00159:@;\u0007غnֺLn\u0013;/^9\u0002o\b_:\u001e8:pz8\u0015:¹n/TD8:Oۖ9[s7N3\u00029_9\u0007BTÚ9tA\u000e9a\u001980!^+0J8>>W;fg8=27&777nP\u00157l寵ڏX5X\u001e5\u0015|\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000.5yڠn>SI6c{\u0006ʶ*\u0019X7u65@ͷ:(7V7\b-Z4Ƨ8><iL\u00189=\u0015[P(9h\"9f<L\u00198i49NOEr0:\u0011}ڸDN`5:\u0002:Z4]\u001d~9y:\t=Iz\u0005;Tk\u0000\u0014\u0006\n\u0005;g\u0002:>O\u001ci:\u0012nJ;_)Nw޻Ж;xju;l:Eϻ͂\u0015;:;\u000eͻ>\u0002\u001c#\u0007<\u0003X\u0011Y\u0005<\u0018\b;'&\u0013;\u0004<\u0015&\u001d\u0004F<\u00111\u0014*E<:vaj;A\u001f<\u0002`˨tt<n\u0007x\u0012$s<kR3:~\b9\u0017<\u0012!<:~\u0000\u0000\u0000\u0000:~<\u0012!\b9\u0017~<kR3sx\u0012$<n\u0007<tt˨:\u0002`<A\u001fjva<*E1\u0014<\u0011;F\u001d\u0004;\u0015&<\u0004&\u0013'<\u0018\bY\u0005\u0011;\u0003X;\u001c#\u0007>\u0002;\u000e;:굻͂\u0015E;ljux;:Жw޻:_)N;\u0012nJ\u001ci>O;g\u0002\u0005\u0014\u0006\n;Tk\u0000:z\u0005I:\t=:y]\u001d~Z4:\u0002`5DN:\u0011}8Er0O9N9i4ܹL\u0019f<9h\"([P9=\u00157iL\u0018<8>8Ƨ\b-Z8V׷:(@7u6*\u0019X{\u00066c6SIn>4yڠ5.\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\nq=5\u0010/\u00006/ݶ\u0019=\u001d6`I7:ʉv\u00148\t{&~8,\"<6,۸β8{8|G:8\u0014\rq9˹\u0002]9T@{ӹ\u001a\u001a:HY8R\u0017\u0016:\u0010\u0015:w6Z9\u0016:\u001dP\u001d\u0003;\u0014Y#\u0014Z\u001b;ǳ9\u0012(HX\u0000;K\t;>~#\u0014\u0004:;7\u001cq͋9d;)\u0005\u0000\u0002e;|9:\u0017󻊄;;\n9=:\u000f<Mn2<__\u00178M*<<\u0019;\u0012\fQC;4\f<.Z5\u0013:]<\u001d(ڻ|<RZ\rS\u000f\\<ѿo;\u0005L;Y03<\u0000\u0000\u0000\u0000\u0018<\u00193\u0000,<\u0006q\u000e>^-V<%;\u0014I[;p+<V\u0005btk\u0016Q_<\n\u0010@\u0013W<4\u001e/H\u001c<\u0006sg;\u00059\u0018?;Ǜ;\u0015,F:\u0011<\u0014\u0018ڔO\u0019\u0000<\u0006ͻ\u0019;\u001c\r;kŻ\u0007;c;.Q\u0012\r\u0006;8\u0014\u001e\n)Y;>\u0002o)8K\u0000;F\u0010n:\u001f(\u0011g\u0010.:@˷:H0riv:\u0004 '\t(\u0013n:\u0018v=T09B0t9@u\u0001b|\u000399TMv\\Dm9׌ʸFK׸MH\u00059wfV\u001cʛP8ƙ75?J\u00187m7L\u0000Ѩbw'7ؒOk6n\u00136(92-g|\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000fx5i^R\u00046~KHf#s7\u001dƵ ׷Ow7z7NځQ\u0005\u001888Kkz7\u0016\u001f9P*p쌸91~g9u\n\u0013:H9E\u0011kR \r:*\u00110:Kd'r9(:\u0017ԹY\f;t#ƾ\u00059;.);7?\u0005L;]3:8ӉC?1;Lm+;XzD:\u00030;#w;\b6Ӄh6\u000b< U\r<k:(#d;ʰ;|Dӡy;\u0017\u001e <F\u0017B@qv\tcY<\u0016&\u001c\u0017ѻYu<\u0001jm<\u0011l<m\u0011:yG9<s;zU;\bE<IL\u0000\u0000\u0000\u0000IL<\bE̻zU<sۻG9y<m\u0011\u0011ljm<<\u0001;Yu\u0017;\u0016&\u001c<\tcY@qv:F\u0017B<\u0017\u001e ӡy|D<ʰ#d(<kU\r; ;h6\u000b6Ӄ;\b;#w:;\u00030zDX;Lm+C?18Ӊ;]3?\u0005L;7;.):\u00059ƾ:t#:Y\f9\u0017:('rKd:*\u00110R \rE\u0011k:H\u0013u\n:8g깑~919p8P*9\u0016\u001fkzK8Q\u0005\u0018Nځ8zOw 7\u001d5#sHf6~K6R\u0004i^55fx\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000P4⺵Kl5\u00186ܡ|6qB7\u001eͱ\u001c\u001d6d\u00138 1>P8*و\nXi)\"9*A\u001a)9\u001bHZa96k8\u000f9-\r9\u001ebf\u000b9.:~vB9t:o˺A\u0001;f庺J2\u00119;Aۺ\u0017o;⡜n~Qy;=;JS;0:(:һ);d;\f\u0000\u000buH;\u0006;s\u000ey[:\f<\u000f\u000bغV3<E\u0000\u0013'eP<\u001e\f*^<G10CkW<fC:p:<-;rX%\n<3\u001d<M;\u0003W<\u0003Z\u0000\u0000\u0000\u0000\u000b<LzXœF<\u001eO\u000bk\u0005<\u0018HE=~\u001eu<>F\u0014\\`KH<5;::d5\u0010<g;Wި;\u0005\u0005<:\t{:\u001c\u0015<\u001f\u0013u%\u0015<2\u001cλ\u001aCSp=\u0007<:#rW;\u0011\u0017\u0007;w\u0004Y9a;Y:\u001f灻\u0001;|:,FJz0^:3:\u000e\u000e85:\\ɹp:+D\t:-\u0019\tB%:1\u0010߹9j8/&v791\u001a8YC8\u00188\"cҸ7k\u0011b8Ȩ>O%7Y趶/;7N\u001dy\u0001,D(6\u0017Ŵ\"{U\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000A5}Uɇ\u001eB6s\u0006\"̶RE7\u001c \nݬ@08r\b\\iT8%T)\n~\u00189l6d?n9\u000f}8Oȹ979|\"D99v\u0014\n999:\u000fH9\":)99\u0007:m\u0017\t81;RG7\u000e(u;tP\u0004С;T_XV\u001a`|;z}\\w6;H\u0010CB?\r<z\u000e\r\u001c<v$\u001bA$<@:@A=n\u000b&<\u001b7;\u0016\\R\u001e<\u0000^;zuC\r<;[ă;\n}%<(;J<B膼\u0019);Z\u0002j<t\u0000\u0000\u0000\u0000t<Z\u0002j\u0019)B<J(<\n}%[ă<C\rzu<\u0000^R\u001e\u0016\\<\u001b7n\u000b&@A=<@A$$\u001b<v:\r\u001c;z\u000e;?\rB;H\u0010C;6w;z}\\;`|˻XV\u001a;T_;С\u0004:tP;(u\u000e9RG7;1\tm\u0017;9\u0007):\"H\u000f:99\u0014\nv:ƹD۹|\":7O9\u000f}?nd9l\n~\u0018)8%T7iT\b\\8r7@0\nݬ7\u001c 7RE\"6s\u00066\u001eBUɇ5}5A\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00004ĵ/a55E_\u0007\u00078\u00067Q65Է#7tu7o#x:<8Q%8!C88#c]}\u00149_\u00169ek9얁9 \u001aR9J9Vj9.#:ū\u0007+:mLt:\u001ea::\u0007$:0:ӟ:9Y\u000bp:=%;\u0014\u0010: Y;<zK\f:\u001c\u0001;zֻi\r\u0005;d;'\u0000n\u000f;:\u0014;\u0015\u0015;L;l+^f\u0016;\u0018\u0014<<@R\u0011;r)<j]S\u0005;^><c:oQ<\u0002Eq\u0004/:\u0017b<ԥz\u000b:p<\u0001O\u0005:mz<a\u0002\u0000\u0000\u0000\u0000@<o{\u0006̀<\u0016s<\u0005~<6pf\blu<lV35i<$C\\\t,\nZ<Mb/[\u0016\u001aG<l\t\u001aq\u001c\t\u000f3<[\u0004N\u001c|\u001d<z߻|\u0017\u0007<Ld\rB;\u0005\u000b\u0011\u0000;i˯\u0011;Km3\n+\u0001n;y\u0005U̷5;%Sº\u0013z]\u0006;Ԁ]@Il:)9\u000e:\u0017ʹJ2:b^M982\u001c0\u0004U9SǸoxո\u001991Nmzw8J_S\u000f8\t\u0000\u001a!EC7O76[j660DD\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"5鮗\u0017n6\u0010\bRǒ7%\u00072ʹ\"08vn6ѽ8W\u00057Z\u00179\u0003lκ81o9\u0015͹-9\u0017p9`&\u00119q\u00189\u0002\u0017:r\u0015:c{:\u001e.:/\u0002:36:a\u0011.WG\u0012;%:_ΨO;79!\u0014;S<7lX;J'\u001cf{;oӻ\u0000\u0010<@+⻾,<\u0010K\u001f\u0005G<Gɏ廁`<2ֻ\u0010\u0014v<\u00186<$6w!<MS\u0011\"V<k2ܺ<-\u0000\u0000\u0000\u0000-<2:k<\u0011\"V;MS<!w;$6<6;\u0018<\u0010\u0014v2;;`ɏ;G;\u0005GK\u001f;\u0010;,;@+;\u0000\u0010;o:{f;J'\u001c:X鹻l;S<\u0014!;7޹ΨO_;%WG\u0012a\u0011.;36ĺ/\u0002;\u001e.{c:r\u0015\u0002\u0017:q\u0018\u0011`&:\u0017p-\u001591oκ\u0003l9Z\u0017\u0005跉W8ѽᶮvn8\"024%\u00077ǒ\bR5\u00106n\u00175鮗5\"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00064Z36\u001b\u001b=Dbd7۶3%8m5׵8ʔg\u0006'9l5\u001fiC9\u001789\u001aw`9T9\u001dsZ(:\f9]V:\u0001NK9+亭:X\u0016\b-=;Kω\u00102;C\u0012\u0018q\u0002;p+yw\u0006;\u001f\u00050>;Dq:M;D Y;ù;zH<bf;N΃;NΑ)<\u0011:URY<=\u001eںF\u0013<_\u000f)\u0004<\u0004\u0015<b<\u001ecN6u<\u0018}\u0000\u0000\u0000\u0000}<\u000b\u0005;\u0018P<\u001dŦ;[1\u0017<%d?,<\u0006\t;x`K<t :\b\n`LY<Ϻ>/̔V<~=2D<»̦(<&߻S\u0003\u0006<4<7;YѻC9:U;!!v\r;\u0017\u001f;\f8\u001e;!O:s\u0003QEl\u0016;<9\rf_:)\rd7\u001d2:י蹾\u0017@Z:\u0010v\u000b3: عhBڻ9ɞ'\u001dk5P(\\9^L\u001c86H86\u001b8]\u001382\\7(\u001a7)557Ѐ5gYm46d?(d\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000659͵\u000e#X5\u000b\u0015u6\t#fo\u000e7֬6\u000f8\rva8~{-J\u0016B9N\u0018f釸\nm9؅4jQ8Y9F'99`\u0010%Y:B9ź:ʹcI#\u001d;d\u0004uP;\u00038$5k;NIg::X;\\`Ż\u0004~;j\u0002;U\u000e滬;|:\u0019\bN\u0018<\u0011\u00000βh\u00037<\u0011\u0002]\u001b><\u0006%BfX\b;B$'<]r\u0012t;~;7CK<:Wu<Z̐K>\u0014<*\u000b{л\u0003<s\u0001{\u0000\u0000\u0000\u0000s\u0001{<\u0003\u000b{;*<\u0014K><Z̐;Wu<غK7C<~ݻ\u0012t]r<B$'fX\b\u0006%B<>]\u001b;\u0011\u0002<h\u000370β;\u0011\u0000;\bN\u0018\u0019;|:9ٻU\u000e;j\u0002\u0004~\\`;:XgƺNI;k$59\u00038;uP\u0004:d:I#\u001dc:9ʺź:B\u0010%Y`:ֹF':Yֹ4jQ؅9\nmf8N\u00189\u0016BJ8~{-8av8\r5\u000f7֬fo\u000e\t#7\u000b\u0015u\u000e#X95\u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000ִkU]6HM?O\\7A$PZ7\u001b7yy8\u001e5ո\u0016%9%\u0014(ٸ9DM7(9\u001c9r\u00119\u0006p6r:&lHf\u0019:{,$\t0G\u0010;2\u0014-9\u0017$\u0010;Dj\tg\u0016;:s,;?\u0018|;;|Aպ_u;\u0012\u0001\u0004q\u0018;;2)\r;D{:+9\u0005A<烻vc8ni<q+bٺ[Z<v~\u0018;ׯ\r<92uZ<\u0003ā:v\t\u000e<dfp:\u000fw\u001f<tw\u0000\u0000\u0000\u0000[\u0013x<ћ1\u0010<=;*\nz<҃l^\u0006}<\u0006\u0010)Ȼ<\u0017aq:k1<%r\u0000<~;PIy3<\u001afl2<\u0019Ȼ!+Z\t<Fc3:iȚ;\u0019F绣;!E:a\u001c7;\u001cS$P;4\u001f\u00115|%;\n!\u0011oE::Mhٚ:\r9Sm:|Թ\u00128:\u0004r﹣a9\b\u00049R8\u0017Mb\u00059]\u0003XtW8N@}(\u001e\u00068%㡷5~~6̶5XK\u001c5c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0016{\u000f5䵨>D6WpsFﶊ7\u0017\u0013v&8.J,8!+\u001d8\b$9Mi4}\u001cj9\u00055>6i\u00159I-9\rX9^]s:e-\u0006=H\u000f:\u0001ߺ59I:6=}\r;8@9RE\u0015;$\u0013%\\;:Kx;@V;7@[B\"<tƻ*M.*<[=5Ƙ;@;\u0002`\u0000G<+N*<ZU7\u0006\u0005Nn<\u001e@\r<X;W!L^<&7&<s\u0000\u0000\u0000\u0000s<&&7<;L^W!<Xٻ@\r\u001e<Nn\u0006\u0005;ZU7<N*<+:\u0000G\u0002`<@̻5Ƙ[=<M.**;t;B\"[;7@8@V˻;Kxֺ;\\%:$\u0013;E\u0015R;8@ι}\r6=;I޺5\u0001:H\u000f溰=:e-\u0006:^]s:\rXI-:i\u0015ڹ5>嶸\u00059j4}\u001c9Mi8$\b9!+\u001dJ,.8&v6\u0017\u00137F6Wps5>D5\u0016{\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0001\b\u0001\b\u0001\b!\u0010\u0001B\u001eseptimbre_amt.cqt.filtfilt.firJ\u0001n桰r8%\"!};i\u000b\u0007\u000b\u0003#<^mB\u001b|#DO=/śȽ#\u001eá>A.\u0000?\u001eá>#Ƚ/śDO=|#\u001b^mB<\u000b\u0003#i\u000b\u0007!};8%\"rn*%\u0010\u0001B\u001bseptimbre_amt.note_branch.kJ\u0004\u001f>*%\u0010\u0001B\u001bseptimbre_amt.note_branch.bJ\u0004\\>*d\b\u0010\b\b\b\u0005\b\u0005\u0010\u0001B2septimbre_amt.note_branch.early_conv.0.conv.weightJd6\u0019\u0005=rԽR=w\u000b>w\u0005#>D\u000b\u0015\u0002\u001b=\fȽv =(<I=՜\u0004BfK=\u0016\u001fb:bS\u000fXޢ=B@<~̽?<<\u0019Y<L\n<M̖;f\u0005ɟ\u0005u\nq<2=\u0016\n:0<nOq4P=UQs \u0000<u\b=f(|>[>\u0010F>\u0015>ߓ>\u0012㽩Z5 n(\\per\u000fl\u0014DT/^==0x=jܽ\u0005䉾P>\u001a>>H<T>\u000f\u0011->L#>~=4(>{6<\n\u00139&9=~\u0019\u0012T\u0019 =\u000b>\u0000\u0014>6<<9E >\u0000=\u0006\u0007Ũ컶\u0018\u0015B#\u001d==\u0019r<w=q+\u0000f=(\u000bcL?|<.7=?=\u0012NC;bI61\u000f>M8=\u001e=n_kV\bQr\u001bշ=\u001b>\"jӼXP=~@<Gb<h̽)ĽL=/=g󪽵m6=n<0=F@va\u0011.=>+G{r}\t\\<ܪ\u0001>v\u001f<6WBwBр<sB=\b<t=sݼax\u000fʽ8>\u0019[\r\u001c\u00132%\u0005><EJ\u00183l=r\u0017={=Ϝ<gS2*Y=5m)K5s=u\u0006>?\u001d\u0000\u0013Gv*\u0019\u0010\b$(\u0014>H=\u0019\u0016>\u0001ěV=\u000e\u001b=\u0013g\t#{$E\u000fW=\u000b7>\u0002'-=սK#<\u0002v=9\u0005m\u0015H=V=EPE\u001d\u001c>3u=#,>h<Z\u000e>%OrXLdý6=?E>Y>u:EvCSG\u0015.\u001b>\u001cq)v>3}>sLy>#)AB1z>Oc>D$TG'\u0000#k>mv>$>|(;{?ὥ\r\f?Y*>jh¾\u0017\b=G?\u0012{>\u0000ڇ=bE\u0003?>b>\u0013>>eI\u00062~=\u0003S>Dǧ=\u0017\u0019hо]L>H>O\">8?p\u001e<\u0010=\u001bT>8U>lo\u0001>z̪=<\u000b>'\u001cv\\>?a\u0002>\u0007H<<\bc+\rDeJ>\u000b\u0014rZ?>6=&'\u0006?#*rݽ)=>T*>\u0001\u0016V=rϝ>\u000e`x\t^*=\u0002:p]K>MQY\u000f$$=5!L>\u0000\u0019R 9Ze\u0003X=>(N=GFG>\u000b>YQoȽ&O\u001eF\r?rp\u0017\u0018GRDAݻ\u001b\u0000\u0011>L3񼃔>匔>2>5F̸cf\n\r>o=\u0010]\u0010\\ ѼVy>;c>M%=\rgؼ|\u000bK=KC=ҍb=vQe>\u000fTB>\u000b9&浓Y=K>\u0006$\u0002?\u0014m5кo'>\u0011\u0000?[2>~X\u0015PQs;j3>\u0012\u0013>σ>\"\b\u0010A\u000f1x\u001dj\u0012\u0006==\n=`+>\u0010\u00188;a2\u0015?<v>*>u*\u0002?^\u001dHt\n/\u0005L\u0017=BH!Y\u0017=\u0013\u0006=E>>Bk~Q==C\u0018=ٵ=(\u0002μ=5I]kz\u0006=$=\u0018\u0007=6=S署zW>2*3=\u0019(X%1|<=\fI\t>\u00018\u0014D0>d=z:=\u0018<ʍ\tsR\u001feT>\u001cɽ\u0018uV=:%P)>N\u0012\u001ala!>}=vZ=D5=cֽ3\u0014\u0014<̽2>(8\u0014MeX>qy=P?\u0010<Tc=kY1^D{.>\u001c\u0002\u0000=!J\u0003=W%<\u001bVZ\u0016>꘡\u0019,=Ԉ&B\u000bRj.ZG=\u0010*<=u\u0005B>>\u0017µ(==ra`=Q¡켢pY=g4=J-<g=\n<`[=)=:BmSЩ{=I\u0002>\u0005@,gǌ>OK߽`FY`1Խu\u001clp\u001c?8>bc\u0010\f=#2>j\u0005ou/,l=EMP#>=.=Ⱥ\u0001f\u0006<!*2>ʔQk\btO>N=>=S׿=\u0018EF\\\u000fG!V\u0003>,=@s=\u0016W\u0011I=?>9P4J,0Eh/-h\u0005rn(5ӡ\u001d(e뼑<܁}K;f8=V\u0001?>^>i>>\b9>>Un>->\u000f>a:>'$<dWｽr܎@w<:\u0011=F8>\u000b=ǫst>|>Xl'>O(Scļ.A`5=ԼLQ=\u000e*m\u001dH=բ\f\u001cʽqͽl=L\"L\u0005<OX<D\u0006G7=ڶ/>H\u0007:˽\u000b\u0018lɽn\u0001>᪷{|\u000f>\u0019}\u000e\u000bn<\u0016\f\u0007=\u0017\u0000>{|G\u0000>kV\u0014 >=\u0010_a>\u0002%\u001f\u0013mc½&^=\u001bT>Oȼc\u0012>R=\u0011G=i>\u000e\u0019>|\u0012?6(=n\t>\u001e\u000e>\rmv\n?x=_\"dWɞP\t\u0005M~*\u001dyξ|<c5<K.=%N=\u000f\u001f\u0006b}>w\u0019=D>)b>\u0006?Ό>1=3=N\u0016>I>_# !\u0002Eվd=A\u0003TD=\u0019]u}=AK\u001e%\u0003\u0017\u001a; >q>p/>]\u001e=5=\u001c%\u000e>I>\u001c<>:ˀ\u000b\u0016?|\u000b>\b}ݽztB]\f\t<\u000f5<oȳ=b`<\u0012/\u0006#>7 X>DSQ\u0014[=-\u0017>\u00060=\b/=*>\u000e庽{=\u001e\u0010X.kOd#$=to~0=\u001d*>=Fq<p5\u0015=`(>{<~w=Eؽ[>l\b=\\4\u0013=KMI\u0004m5<[\fK=IzA= ?\u0014\u0000)F.\u0004\u000b>-]'jSD2\u001c>8=V>9^\u0007=r2>\u001cQ\u0000*&<j<8yn=\u0013>Ǽ\u0001\u0012l;:C{E/sN-_==6><hi\u0010>v4ڽ&\\<>[[\u0014>a=\u001a6>i<\u0012>\">V:\u0016=5 =榳r\f%(=\u0018\u000e>\u001d\u0016{\u0010;9Y\u001d=\tŽu|K=_<\u0002>c*Ok>\u001f\u00048*!\u000f><_\u0003&\u0019>\u0017/>\u0000ٽ\b\u0003@>~5I\u0005G\u0014v\\>!>x\u001b-%[>+.>V\tVl4.x>\fl}\b tS\u000e?m8'=\u000f\f\r>\u0004?F>h\u000f>h~>\"\u0002\u001f(\u0010WH>!8r>\u001f˽BHP\u0016\u001clm>N+\u0007L>\r4>`e@{\u001c\u0015=븾w?>'e\u0004\u0006>/ZX>T⽈<{>\r2,LO5b\u0007=\u0001=G=a.;4x@>\u0019>\t*3><\u0014Ծs\u0001>0\n=b\u000ezB>>cXEbt>\u0010J=;=\u001c=i\u0003$㇍\u0015>MH\u0013\r߱>} U=b\u0018\u0000þq=a\u0002l>ǽ7s=T2>\u001f>\u0015\u0000kM>%0\u0013= =m=l/p>y>\u000e\u001e>\">[GB>\u0003c:&>ŽoZ='aN>> +g>ۛq\r^=\u001f\u001e>2c1=\u001c?\u000f>M⬾j-=\bž&=>=\u0012q<ͅL(\t=R\u000f\u001a\u000fs*J=A<[>\u001d>׈>y\u0001>'=ft\u001e==N>?ϺDgE4ܾ'\u000eOHEk>=5\u001c\\>}94b(2P\u0010<\u0002B\u0000B\u0006>u6>\u0017\fS>2 2#>Կ>\\^\u0013n>BՋ\u0003><ľnVP\r>29>)(>\fMn\u0001𽉾%ʫ\u0010\"uӻO#1=-C\u001c}=3|Ԙ=^=\u001d$y\u000e>\u0001;<V<R\u0003`\u0015\u001c=O$>\n; \u0019<3ս?Wh=\u0019ٽ\u001b6|?̋AS>\u0014Ѻ\u0007\u0004>U\f=3}J2>.\u0000>ED\u0013\u001323>\u0002=]\u00020>a轁g=99>\u0007.>K\u0017>\u001a>W1>\u001d\n>w*X\u0010\u001f=*\r>*\u0004Žb\u000b\u001d=p\u0006z\u0019=\u0011\u0001\u0016/>\u0018J=T&}=VC=%>F\u0003=4\u0011\u0000*\u000f>ŐM=\r=b=+66la>j%=>޽\u0010u\u0007>+g;~=\u0005=ʻ\u0000=\u001a3>Ȩ/>\u0002\u0006=\u0004\u001fҽ\u001b=&\u0010<\u001a3.Ozgn\u001e\u001cO\u000f*ͼ=IeFS \\!\u0016^\u001c\u001ey\u00048=Z7[=4O\u0000>el\u0011>:>:_;m3=\u0016<YX4m$nnwXa1k\u0007=W\u000f>-=:2>\u0003C>\nL=~>hH䙾;I;ȍ@C>\u0003n=\u001e#>\u0018\u000b\u0006>%>6=J>&o>>\u0011M=\u000b=S==8\u0018><;W\t?4%\u0010=\u0000=\b=;&L\b=~\u00051}]I\u001dG=贪\u001d\u0001\u0004RF-Ѕ>_>\u0004ys=\\> +\u0019>\u001cR=X;`(8\u001dW6\u000b8n)罡C=c@ݽn+>Oy<T=n\u0013O*>k\u001d>9>\u0003\u000b>\u0014\u001bཔ\u0016=o=ν\u0017B\u0001sy\u0014\u0015^=q:\u0002/6=,5=<+|=WYĽ8qqнՎY=a\n>'=\u0001U\f>#>Bx2<R=B=h\u0006>>iM>pq\u001c\u001d<\u0005N\u0010M=z=L\u0012\u0003>bл\u0014>E<b\u0015\u0010ͼ|,=\u0015b<P<Pz;=)\u001e=>+5=v\u000bw%=$==@\u0004L);?%=\u001f\u000eۼ@X=OQ;U=9~\u0014\u001b9F׼/uZeUJR\t<<Zx\u0005\u0003\u0013Xpo9M<\u001a$MT=µop=Gԥ=\u0016\n<G>+=B0!Y@$l<ht\b^\nN\nWH\u0005\n(;\u0010=\u00007ؖ\u0017\u0004\u0007&s3==ޝ=h=0|hS<bLǽj\u0000 =;=N\u0010\u001e)45w=:=M}0\u0004:\u0005\u0001U(=,=ǫ\u0004=\u0013\n\u001cּZ2<\u0002#\u00131]mv=%Δ=af=-W=vs(=sǽiVl=X\u0017\u0001;\b`ɼ =\u0005=΂\n=\u001bE{y\u0004=%<\u000f+#knfS=bL*=o5d=B'Eam=U=$g\u001f\tJb\u0004=/.\u0014c5*\u001aU=a=cȼ8:<\u0001\u0015Ɇ=x<e=wPϻf\u001e:=\b;_x=~B\u0019\rnPK\u0001U\u001ad\u0005\r;;>\b<O[:H\u0000L=]<\u001eGh\u0018ud\u0018;<r=\u0001<F'\u0018\u001fY׼L; <\u0016z=\u001a*=Jܢ=\u000b=*S<\":ϽЀ\u000f'pf¡\u0015\f\u000e>~\u0005\u0003}#\u0011BR>51۽<ǳ|:j\u0012X5\u0011=\u0006\u00057< s:\u0018\u0016\u0011=Vu3Uk88\u0005<~K;wL>QT=q=+?=[M=\t{\u0000=Y\u000b>Yf\u0004>\u0002J<|=1{?Dx\u0001<[\r<wB=A:\u0011|-0i\u000e=<F\u001d\u0014B&N=B\u0013>T9<ƺ=Є;2<'=\u0014E=8<\u000b,=\u0014V<k4=\u001d=4ڼ\u001cHfy*=\u001ca\u000b<\u0014.g4ļ\u0018\u0010uMŻf3\u0017=\rr}+਼\u0003\u001e\u0000=\u0016W\u0010=\u0003 =y=Jp8=Z!C=\u0003B+#\u0019<\u0010\u001a=\u001c=&:w_\u0007Z\u0014\u0002n<'ǽ\u0018\u0002>\u0018!މ-=h=J\u001f==<}<o]x\u0012=ż6\u0017=\f<ht=Xo\u001c(L\u001a]́2e>he=M<˯==˺=\u0012M3I\u0013?Mq=W\u0017/$a5м\t=47t!=5->U,=s\fg\u0010*=\t=\f8j=#\u0018=J\u0015ý4M(;J#=,\u00144\u0006=-\\t<\u0011н/a;=.[=}=򨎽\u00146ދ<Szd\fk\u0007y8<b5=i=x|T=οнY y\u001adS=l^=\u0005 V=/>=<hͽ\u0014(K<M;=z\u0014<<61h=\u0002XA\u0006;0Y̽Sgq=\u0007&=JrĽBՏ===f=G*(>a=.5=N\u0011X=\u001ak\t\f=SKO<g$>c8\r==e><3\u0007;\fѽ\u0010?>\f>\fi@=m^i\u0013\u0004M<sXn>\t\n(UNZ\u0010<d<(?>ҦX׾⌑k>e)Vd\u0011`V\t?\u001c\u0018Xt\u0012\u0007v\u0006?>\u0015=~3HȺ='S>\u0007=k\u0006=/%_\u000ec><5=\u0002I=\u000eP>Tƽ(>Ŕ`;\u0007w~\u001b>z\u0002>1*TL\u0017=k>qOEKY=\u001d*i\u0011)<\u0002ڼ\u001cCj\u000b>\"Om^s:\u001b\u001e~>׽g=*C#>Y\u0015=\\*\u0005?]\"?Ё<\u001e\u0015>v=k=\u00007>仾\"h$)\u0007Z<\u00025$i= VݽQGý\u0015ϡ=/'<s,>=GлnM>kU>TĲx>\u0005*C\u0005ϊ>>\u0003O(\u0016=-\u0019h'-]L\t=]L>_9焾u<QV= kCD\u0000<[k>Y<B\u0010w>P=\u0003>Bc>~>^1L=!\u0000m1-;>gʥs1vGp(\rb*\u0014==⋾\t7>7)q=oGGx!>\"=󁅽\u001e\u001ev3>ͪę>Pd\u0003>\u0010#;\u0003V=>Nh>X=c⇾=\u0010ͽn\u0006t\u000fk\u0015V\"<P4=\u0004=(D;́\u0015&7>N>?>@;>\u0001>h.>u{\u000b>\\b\u001b?\u001d\u001cqoyF<=Yq/>I\u0007]>=\u0003\u0006.=S>Tץ<8\r?A=\u0010o%$\u0007t\u0007T<\u0003= >CbF>\u0012;=\fX=1\u0007=\u0006\u0004=Q\u0003>c\u0001-ol|\u000bi=%[=;o;>gV\u001d\u000b=g\u0013\u0015=\"=tz\u0007>HK;\u00037Ξ\u000b>\\h\u0000u=5=OL=:f%^>V=<6\u0017<5=8\u001fO=B\u0014=^]7$Ν<\u000bjڽ?=vCB<Q=\u0003*=<\u0015O}=[0\u0007=~94`=:<>l%%\u001a4=hӽҲ=\u0001䆽}=3}<\u0017\u0015\u001a\u0019'M\t>fP<7aYW=(\u0018\u0014>Tý߼9\u000e>ݨ;P9\u001c뼷wPm=W0P>z>,Qd>d>\u0012f\u0010>\u001c\f\u0012>p,>{˽\u0006CorK\u000eWQ\u0015\r:7\u001d/*$=\u0000ȃ<m\b=6\u0014< W9%>!==|\">=j\u001b\f\u00115=½Zu=t< =e.2=\n\u0000>\u0017eN<ѽ!=\u0006=\t=<ʹ<\u0000\u001c*\u0005\t)L1\u0019=С)>C>?\u001amDJ4>\u0018Ƚ\ttҽ\u0000n6\\>;[>'\u0017Y\\=<¨\u0013=\u0010=\u0000.=\u0014\u001f\n>󡽵ǼK|C`\u0006l=r%=H<Om;i*r>l8\u0011I޽y\u0004>Q>-d=\u0016̣\u000fD>i<\u001e$ɼ=\u001f\u0003y\u0004;>j:;b:3Kǟ'>D >\u0010\u0015r\u001f\u001bt\u0011<\u001e= <3F<h<\u0016:<9P\u0006<\nQ;ժ<zSU<mU,wǚ;\u000feA\"=2q\u001a}/=\u0011>\u0011<?=g=Ԯ\u0011=dTGo鵽w\u001f@Plc\u001eQ<׎Z\u001bc\u0012ڽٶx=ӎ2=\u0012=g\u000f=\u0014U=Y\u000e'c<t<_2&<='<'s\u0001=:l:|j\u0005Շ?,\u0003h\u001c~|[LQD<_}=O-=\u001c\u0018\u001e=\u0000&==\u00190v=gqj/=jI<{P>Ҽ\u0000\r=\u001c\")fd<\u000257ZS\u000e=7'<9f<=p<$\u0007I;@D=\u0017;ҩ==ǻb=<\b\t\u000eXԼv~=@$=nk\u0018=6\u0003\u0018<L=\u0000=ئj7\u0002ӛ4/\u0011\t}9\u0001=0<\\\u001d=|hQ0 -%<y\u0003=:*\u0014=/\u0017\u000f_R(V<\u00132G=I<o4==y=@=8O!;s;G(G\u000e\u0019jta&輡ܽkh;\u001ef<[B='==\u000f<@%?$J=s0=\u0011|=\u000f*\u0003<[sм\r|/=f׽h\u0012\u0002\u000e\u001c<(\u001dn;==Ct\u0003=o=2b\n:2=lvK=<s\u0007=4%8=\u000b=ϟ\r=/\u0006\"t<4;G=Ѝ=毼!<\u001b=v=]\u0014=G;=3=};==N=J=u==\u0011=dQ=}\\f=\u000f\u001e>\u0002=\u0007/\u0004\u0013=d\tk\u0010Xw;7m:X\u001eM\u0015=[\u0013>ȣ=剖\u0015%!<eN=k=\t\u0018>\u0016\u0011uν6 =\b\n<@<\t=F=ٝp}(;\u0018=\t=f,\r=\u000bfrǽ'=j+ķR\u0014>09i{VO=R\u0010=\u001b$ս)=\b\u0005<1mZY~=p4=\u0006u\u001b=ԃ;z\u0002Kі=|Ga\tj;#]:ϫ\u0013(R\u0006>j>>[\bЏ\u001e==4xg==\u001c\u0012tc'LSp\tL=S\u0002ý(\u0003B\u0000\t\\=\u0010`$>\u001f>li\u001f=>C=y=Y w#dL.\f=:\"=6\u0010\u0007>;\u001cNK=N\u0002Xݥlxc;j;s/=.fa<0;z=ӼF}!>=\u0005A\u001crԼ߀\u000f\n>\u000e\u0004v7>~\t=3NμQ<oD/>;Oٽ\r'½Խ=G=\u001f\u000f=/\u0014>}\u0004=\u001f\u0011>=\u0016g=\u000f2\u0019<\rz=ӭ\u0002N\u0000j\u0000>ٽͽF;=$pV=C\u0004\u0010=ｺA\u001fO==X\u0003\u001a=K\f\u0018)j=`\u0004=\"\u0012>\u001f\u0014=O\u0000׻->\u0018S>Mɽ<p=t\nK=9Tc&\u0001>l\u0000\u001d\n0|d==٢UEƂ.>^=V[=h\u0016>d\u0015;\u0002\u000f>∽,di;n,qV\u0007¾:\u0001t\u0013ȵ~$R\u0000a彝h\u0012>\u0001\u000e=م>\n(>T<bE>\u00193>02>#=\u0011#\u0003d=|p=!\u001eNJ=<ؽ\u0007/>K3kÎ<³=A(=SI:)=X\u0011\u0012P>\u0014\u0016<\u0017\u0016[Q*>\u0001k޽\u001d\u001dj>\u00154=:N>qZ>Z\u000b>ܧ\n?\u0002Ծq\u0017<yNRkQ.ľ2Lž0\bSQ;]\f=潃\u0016=mf>y>\u000b>o>Z\u0004v(X/'>F\u0019=XrVW{\">V)>'Ϛ=\t\u001f=\u001cѽ;=Y=#=-a[\u0001>>^(*p=S36ɸ=E\u0018>#KzQ=\u0013>\u0015C\u0012>4<$\u000f2*q\u000e^m=!\u0017\f㬽_=Z\u0017\u001f\u0006׽\u0000=\u001a\b<\u0000;S\u0002>O=svv<&l?=j=l\u0018!Qxd\u001e>t8H\u001bA=Y\u0018\u0013\r#<}\u001b=\fHˋ<jbRQ≽jf\b\u001f;2D\u0016\f>-=M\t>X\u001c?}8>#\u0012&\u0001;\tU?=A?h\\\t==w=.=OK>)ʽDy\u0005==:q\u0002oV4=\u000f\u0011\u00047={z\u000f>u\u0007j\u0012꼄[\u0001=c\u000f3=0%)[\u0017\t>m}\nb\u0018jꭻgB<y<UV=ڲ3>\r\u0000=Q罆6=_=\u0012R8=AAWC<\u0000>Η^=Ts<\u001fK\u000e!Є=\u000b\u0019wT`$\t˺=il\b>u=EB=o\u000f6\u000b~Z;\u001a>=h>М7:̽{\u0003\n z^L&=^4&V=ϟ`;JY>w\u0002}onim<=f=uU&>9=6>b\u001dΑ\",>/٦\n\n\u000e=\u0018<c<B\\\"\ng/>5\u000b\u0018>\u0004\u001e;B\u0001>L\u0010>ܮ->2m\u001fn7=Q+$\n=\n\u0018>=;DA=GMC>1e:M</\u001d\u000b4=_\u0013>=\u001f>T_\u00052X2DVnf=\u001d+]*D'=b\u0017~=3SAt\u0015>~Y>\biT=X=(>m=UP=\u000b[ܽB泽և=H={n\u0013\u0006>ïG:\u0013eu<=@A\u001b\n>b<9>ˉ\u001e=Y\u0010nzf̕<o <\u000e\b\u0016Oc\u0013=μ<=\u0012\u0017=c0>+t>p6\u0013aJH=5|=]5=!=N=\u0017P#\u0018\u0019辶}c>\u001dG!>m\u0004\t>\u0002\u0018?m>\u0010\u0001?\u0014\u000f?e\r?\u0018>`[8>=;m\r%=\u000e/Ԥ-^\u0006=\u0012;mlŽ&.\u000e=[8\u001br]\u0001;l\u001c\u0017>!=n)᥎\u0005b->.J\r:v%=<=\u0002ݻ#\u0013>=10MFm.ݽ@G>{\b̟=\u0006)B=͉7=-\r:`=>F\u0006,'=n\u001bE\\C:>\u001f\\ֽ>\u00141?;\u0013=v\u0018\u0001D\u0003޽ق\u000e\u0014>=\u001bHνzd=ʽ֦\u00125=\u0016\u0013\u0010>\u0004>\u001e;,#\u0013UI0\u0016Mǆ>El\u0011\u001e\u0014>u\u0019=j<cX=\u0000B\u0016>|9\u000fKM=\u0001\u0016==?W\u000e^ؽ\u0005=\u0006Ƀ>;zp=\u0012\b\u000ei\u0004%Y<I\\۽V2\r?\\=\u0016=;=BG=ibf\fʼ5]\fc(=6ؽӮZ<]׻<U>RM'4=E;7dm=T;6:\u001aH=IR\"\u00117x)\u0019`==(t\\j>\nl8=q\u0002@D=MO\u000e>\t/><Ez>m.^>T<q)<șE?\u0011>\b>Br\u001c>|i> >Nmfs{=~Z0ɾuZ\u001cG#ϾrkC=ga>10=[o=UR\u0003\u0018z[=\u0017=?ż\u000f\u0013ʘ#[Ž)=Q`ކvW1<e=jB>`!E\u000f=ڽX>\\XE=Pc\u001dE>!JVD\u000b!>F;=n >Lj1>`\t7>=G<i=\u0013>i=,\\*\u0005c\n\u000fnHrj_{cw,n<\u000eV<\u0015\u0001)c0H;?6>_s=<\u000e6'ӼHQ<wܽ)=֨ >=\u0010\u000b*>߇lx=Z\u001f>|@\u001fQ=x\u000e=\u0016<R\"\ni\u0017?>a)}5\u0015=y\u0019\u001fe=>v==;>q=_P&~=\n\u001f{\u001c=\u0018<7)\u0015[#-=i%>\u0004J?\u001f\u0002.(\u0000>?\u0017&<\u0015=C=%X+d>bY׽?\u0011kq=\u001fd\u000f\u0017<e\u001d\u000b%\u001a#=J=\u0017\u0001\\'=ع=e^mzd=\u000e=N-\u0002\u0012;='q=VҼ\u0018.v+]轮ҽn0\u0002n\n=\u0011<3>U=5ּ<>:>k\u0010>#-jX<\"\u0000=i=\u001b/=gd\t>yE#\u0000F=\u001aBͽ(=j\u0007G<C\u000b>HM{Mž\u0004V:M\"=tؐ=k\"kC>n=Q>\u0017 >2\f>0&=Jiv\n+y=\u0014\u0014=mW=\u0013=|gEAv>z>5\u0000{=vTNH΅\u001d`,trgb\b:>\u0010Qt\u0012>9\\\u0019P>\u001bX>\u000fƼ\u001c+%>\u0017\bW6\u0016\u000bh=+{<+~;i=@;lj?mB=%/SF=>2=\b=냽{K\u0016>hsqѼh<Ю=xH8=u]O{\u000b>:>\u0006C\u001d\u0001,Z7>\u0013˖w5r*\u000bnuJ羲Rߘ\u0001\u0017=^=h9,h>f>u>>н#O>A>\u0018x>\b#>\u001b>T\">5?>C\u000fm&\\=\u0014>Y\u0000%>\r\u0005Yίnֽ>>\f=\u0018\u0005>\"\b>XI>̮ޡx`V<\u0014m.<nh\u001a>\u0005<%;F<ǽh\u0016<<2>\rW-<0ߑw\u001aŽ&%\u001f>U\u001b=x˅>xH=Ikֽ^=#>\u0003f~+\u000b\u0016)>ɹ*\u000b1o=P>$ >\u0018\u001aɽ%L4\u0016%>\u0016\u0016[Q\u0013缼\nB9>^<[=\u001e\u0003\u0019f>N.=NH3<Q<\u0002\u0001<\u001ez*\u0002\b\b\b\u0010\b\u0019\b\u0003\u0010\u0001B-septimbre_amt.note_branch.early_conv.1.weightJ\u0002Oмټ&kJD\u0017o\u0007N\u0011@T\u001f,pPDιF,@=n=*v\u0016\tJ#<SsE=\u0010Ϝ\u0001W<j<3<*P<;<;;\u0018\u0016<7&<-CK<U;KO<,<%B<_=?L=3\u0012='Ϗ<Rp<?\u0000=, =/<v`a{;H߼]傼\u0005nˊ\u0000\u0006b<ͻ9B?ҳ<\"{\u0017=\u0016\u001a=ZKV=@3(\tDl?M\u001fҼdi\tB<\u0014<y\u0018Ǽ<\u0010F`'.L\u0019\u0019\u0001^\\T\u0016qnoYD\u0004\u000fRq9g\u0015ꧼ˧a(=ɚ4;M*#;ӖҼ\u0010N\u000b<\u0007I;Qy\u0000\bpB;\u00158~[<}l;^x*HҺ?i{DY˛9<8ҼuM]\u0019VAw{y;]<834t\u0014=<\u0004c\t2=.CHߕi܉:2\u0005;h\u001e<L\u0005<<Pr<=J=\b<^t;\u0010l<&?E\u0004ӌĉ=E=W=\u0016{\u0000\u0002͹nԖ\bf\b\u001b-\b[\f\u0012o\b9sܼ9<\bE\"%<\\\u0018:)?< k3=_?oĻ+Fռ\\Qic\u0007jO;Eޛ<m(=5%G<Hէ<aoP\b<=\t;7jP/<w:,(\rS__*\u001f\u0018\u0018;\u001eӻ\"l:#\u0006;\u001d;9[\n~=4㌹\u0006߼y)FY1;\u0010BG<g<@\r=!\t<\n\u0005\u0003$2G=m<QhA~\u0007\u000b8`ȱ;>-To]Q4<ɇ<d`<\tWP rཕ#s0\u0010B*%\u0012\u0012/N.=>a\u0015=*2n=\u0019AnH\u0019;&;1t\b\u001e=\u00052:h+mx\"6ߌp\u0013Lֻ`|Rll.\u0003d\u001aS'ڼv1OM;\u0016\u0005i\u0010rP<\"\u001b\u000e<Cf8;!B\u001e<EjYП\u0005;~Xr%\u000eCa޺\rNn<5;;\u0004\rzu&\u001czB\u000f=,kKTL\u0007=~\u001cRN\u001a:.I2\u0013;ڰ\"\u001d\u0016)?1\u0005d\r\u0006)ĺ3\u0001ƼB6;y!Ҽ}5Bxμ%5h\u000b=:QWyeץ;ͼ\u0006+\u0013=nc;,j<\u0001\u000fƃ_F<5[}J\u0016{<Lt\u000bN<\u0019J\u001c<])1=P'<\t1<<>⼔s9u6kEʼ̄<e8=<<ݼ[>\u001d<ņh{;5>=A<\u0013\u0012=\n\u0002;\u00161:\u0010\u0012\u0005\u0005=a=݂漍\u0010i\u000bpٽ\u001fYc\u000b)\"!\u0003='+ļC˺}\t\u000b|\u0002\u001e\u0013==\u0010>=i<=)U<ظ\u001b\u0016/:b:'\u0015,Q;\u0005%<ܕ\u0015;QI(Wu\u0012<\u0001\u0001;ZBՋ=<\u000bnE=ɞ\u0001=ݜ<\u0014\u0001<5<80(=k\u0011=s\u0016ƺp@aǻEy<@\u001d=\u0003<Y#=s=\u000e4d}o׼H;o<ezH\u0004\f\u000b4Z\r<\u0005_A-c<Z\u0001绝\fspИ<\u001a\u0015=q=,l\u0010޼nq{_}<\u0005<\n<={M;;\u000f\u000f۬a{F=v=lx<\u0015L\u0013<佅>zٽ}Y;;:G\u0017X<{ېY-ɼ#q;\u0015\u0016;3Z=(=u\u0017<e`mc{[;}<X5\u001e!\u0005;[&h<K$hǈ<Ϟ<1<\u00069мYZ;\u0019FV+<^H\u0015/\u001e=a!{<6Q=\u001e\u0006<(o<=,<gaW<zZ<z(\u001d<<S<v<9;>w+;IAռ\u0011<,<)y=[\f<aF=\u0003=4ۧ?tgPڼlȼ\u0000Z.&<8@; \u001b\u000b<S\u0012<+tz<w\u0012?Q<6=SHx,\u0012<v;B\f=\u001c1x!=B<\r\u000f ؼ\u0011ټY:4i\u0019=\u0014kJ;U;O:JDy\u001f\u0015I\"=<<|<^c=!;pM=]ʼ۩;;T\u00022?/;;=\u0007=){=[=İP=\u0018e=щ\u000bb-\u001ask-BFl^q\rh;%, =P#':#;\u001aM;$E\u001el<Ijb^EJ\u0003:\nh:\u0019Bw@\u0001O\t\u0012(F&\u0019K=\u0010=:=\".w=\u0015P0=k=\u0004~C\u0000F\u0016;\u000b$\b;\u001ak<j0;\u001f<\u0015<(\u001e\u001e\\\u0003;;u|<VS\u000fX\u0011\\7GQ<G<\u0012\f;.Rf\b\u000b=[Y<9J<@2;2\u0015\u0011-=\u0000\u0019YͼZ<`R߽^|\u0005\t6Skԟ}t9=$<GЧk3=)\r/1.\r;K=<\u001e<_5=Rw<\"P=\u0018\u001eMSj<%\u001dO<z<YݻcSC\nμA\u0016<$P'=`\u0013F}u+;US]ueG陥;\u001dVC*;by\u0005=<|7eY\u0003hc\n==1;\u0012(<oλ\rC\u00038\u0005;`ݼ.἟J<G\u0004h\u0016<,$R<\f<B=n\u001a<\u00137X\":8|5<z4KrY;.QB=PX=Ů=(7hg<X`?=%T=iXk-F\u001b\u001eW\u000b\u001bP=\u0007AO=\u0006{=\u0017\u0005[v<vӼ%rP\b:2<\u001f\u001a\n<9\u0007<\u0014\b*<W41w};D9e켌\r4='P=+=#*\u0002=\u000b~\u0000=a\u0006H绣̮<\"K\u0015׏H=<=<c?O\u0014/u:N;/\u001e\u0003<k<\u0015Ѓ=Q\u0007<=\u0004%<\n\u001e<n\u0017ca9=!+=%坹09\u0014\\<\u0012\u0001=AS+<ef=]\u0005켇Z\fє<Оȼ?7<9:5<<\\L<\u001aw\u0002=ę<<\u0003?=\u0013G9\u000e<\u0014\u0000\u0006uһ+{{-ؼq\u0018sb=:u[=A=_<J\u0018y<gB5E<\u0007\u0000=<u\u0016:WJ<\u0005ʹPۺ;=j==,<\u0019[;I}15Hg_'\u0005\u0011\u0019LW#\u0014:ݫt\u001cA<<Iؼ]<\u0014#\t<˼L8\u0002\u0000\u0001=4\n|=t<!=F;\u001e;\rj:);Ko0}<\u0001=`G=+<F\nU=\u0006=\u000fq#Ἱ'<I\u0015(=\u0011o;;@?=:\u000e!;\u0017\u0016n<0<2%=\u0004\u001a(ƞ\u0007b\u0017\u001b%<ؼa\u00108\u0011\n=\u0013\u0019[\t=u!휴<RD<=<,9{<\u0010<̭;z(=\u0019<t.=7<&)=R<z\b=C<=|\u000f=g0P=<O<<\u0011?<5<\u001d;m~<66亟\n\u001b:\t3z;.\u0005<\u00041\u0015<5^\u001d<ɼABs$8<_W\n<6-r\\6c\u0010pA8y?C\"<&\u0018<%:R;\u0005޼3\u0000<Zq\u0013<u0t:M\"n<Fu?Im%<<TD<\u0010=-\u0007:\u001d;Va<>&<<n$;{D;;~q\f:<!:Ob\b{¼\u00186bt;Yq6(:\u0017ּ.\u001e<uf<\u0007B;;\u001c\u0002B\u0001ev\u0013T\u0007amIe<7@SUN8kу=ռ\u001f\t*WyVO\f# ~\u001f\u0004^^\u0011=v^ܶ\bSg\u000e<l<ˁG\u0011p>}\u0016cYc5Hr3&'&E#tϱD\u0015T>\u0011B\u00121~<L=(<Kkļ,9N7E\u0018<DJ~\u000e=!9<n+=*J=B=r&\u0001TM~,\u001a],b\u0019=\u0018;<T1<<JH\u000f=Yп@<ˑXy_=/=pk=H\u00025Kx庺%57晻\u000e~y=<i;\u0018<<\u00146:::\u0010M\u0003v\u00070Ӡj<,9s|=%=X|= %R<Y \u0006*\u0005<\u0001<'=xS=9Z=\u001d<9u\u0002=0\u00153<a-=g#=0=\u00126=W=='\u000e=ޢ=S=r߉=su~=\u0013?mJH&<4\br\rǻHa<2<Ŝ{=\bUtX\u0005<b;<T\b=<Ĳȼr\u001b<|<(c<)S<om:_\u0002=2<<A<\u00057e=FƏd\u001f\u0016\u0006\";><َ<`ʽήOE\t^\u00162^C\t18Ļih:\u0000\u0007\u001a:!=J\f=\u001f;el<\u0003\u0010<Yb6==\n/4=D?{wu<\u0000\u001a=\u0005Gl<{F\u000b\u0012\u0015<dG:;,֭<!\u001a<bb˯<\f^}<t<\u001e\\;R)<\u001c>=\u000e\u001f=+4:^@мJż\u0016RN<;<A86a;~P<^\u0010=p<\u0010뻗p<{$<<\rw<;a:y<v=ZO<x\b\u0006<\u001cZ\u0005\u0014<\f=ko<\u0015Ȗ; J=\u0013<\bw\u001dWƽލ?9K \u000f<*\u0014=<V\u0018.<Ac=<~\u001f1\u0013Nb$e˽*`ټO;\u0006Q<\u0000\u0000p<\u0010?$O<\u0011<\u0015=ڃc<6\u0018=\u0000=I]\u00000ռ\u001fn8)\u0014=Bkjy[D;\u001b\u0018\u0004\u0017j\u0019e|I<+<v(\u0002=rI\u0013C\u0015_+<2Ǽc廒O<\u001b\u0011=WT<.\u000f=l\u00189\u00107}\u0000\u000bzy\u0016t;S*wμp;Kx=<'h67b%8$<`=.=ch+K˽u =ķ\u001e\u0006WFF=z\u001dAh\u000b;ɺ<%.\"-F=>9<F5\n `\u00149;j.<-̼Ǆ\b\u0013ܼ)ʼ<.μ\u0006@\r\u0007<ټ:\u0010\u001c@>|/o%=>W{\u0014^>==@eq=@G̽\u0004B\u0015p齊%Q;U\u0000<\nXԽ4}\u0001\u000f\t뗼D\u0010%㼛E@\b\u001f?)vkہC<:K\t%`:R\u001a\u0002}\u001dۼwc\u0017=śy\u0004y4\u0012Խ@\u000e'=\u0015<m6=8;f\u0006j\u0016U=ۖ\u001d=xSۻ\u0018<f4\u0016=ݏ\u0007=I\u001ca=\u0012<\t\u0011!\u0014.9\u000f&<t\u0005\u000fĻr=i,,=>ݼޯ=6E;{2 rȽ\u00079\u001f#K-NXs\u001aW;LsX=\u001b=\"Rk<\u0014ؽ/i<IL<e#\u001b<6=,==\u0010nk\u0001e.=\u00141=I=.<b<P6\u0013=8ü\u000b⬼o5\u000e:O<\u0013\u0007s\u0019I\u0006ıĺ9<U;;\r[:>:vQg\t@l8=j=}2=*\u001e=\u0003'ͽ<F={O=1mڻ\u0014=oW\u0002=g\r̠<,E=;\t<\u001b<̋=5V<w=x_=Ox»@~\u0015\"<6=A<ٝ;\"k<\u0005=\"Ewi<D8~<ւ=_n==%:v\\;}\u000e?IR=S_\u001a\u0004\u001aV=\u0017>=T>(<\\i3݆h_<<հ=\u001d\u0011<<\u000b=7y9<:\u0015=<N0\r<P~`܈D<.==I\\:?6<\u000f=\\dqCk<\u00132<k<\u0002\u0014d;+=\u0006=\u000bu;q-л\u0018<\u0013_b<&\u0000\b<זc\u0017\"9zwS@a)=\u0013\u0015Dӽdfʽ\u0012;\tȼbm\u0013=ٍt; _=Qoe~\u000bf<ro輙\u0000Ccl\u0018uLRP<\u001f3~\f;u˲L-\u0015ɧ\u0005(\u0017>A=s\u0005>J;{9\u0004=\u0005<\u000e^\fM\u0005Z4<`\u000e;\u0012\u0000:\u0013ܼxQ\rtI3\\e+N\fj<\t,Unb,4W\u001faۼ!6R z\u001c;5<H\u000f\u000e:\b:\\\u001d\u001a<\u0014&=λZ=q^=v\u0004>CXrl=\u0015SU==0Tn<\u001bޱ.<Q,<uo)\u0002R=x<jT=B\r<6\u001c\u0002}\u0001８<bM1\u0016ȼT;\u00042};-ܼ7~=7< \u0006=W=}\u001eɨ;E=@)\u000f=0-<1\u000e\u001c\u0019=ͽg<\u00147=G=P<d\u001dλ=\u0015[T<!½=:<9Q8kb=\u000f<;+;S\u001c<kO=GC=S?==n8U={+)\u000f[8}$Vs=y\u000b=\u0006t=Ao)=\u0007\u000b=\\\u0002<E\\6\bdM{=Sؽ\u0013l\u000f\u0001K\u0016;\u0007d\u0011K_<(M\u00057pX^o\u001e\u000fB6R\u001f=qh=ν|\u0003?4G=uPH=2=<ư<oW=\u0010Nu_\u0010 \u001f\u001e-?<<\u001a<Bڮ%ꀼ;\u0002񉴼\u0003L\\#`:\u0012|o\u0011qr=d;I}<3=n\u001f=7;\u0010\u0006~V۵{jqZ<Fơ=8\u0013<\u00044*<O\u0001=19<m4\u0019csl\u001b!=\u001fyŽyc<Szj<K\r;8\u0019#<5=ڼ2t҂PP<¤= 3Ƽk{=½\u0014м\u000bL6~$7S{<\u00161=/X=;j<:\u0001\u0010<z޴\u0000\b߻`5ȼ\u0014<=;༔h\n7ڍ\u0019\u0015#<-<;\"0\b;#<\u001eZ+&=f\\=6\u0014=\u001e4h><@Mv7<\u0019hoa23;\u000b7\u001eK޽\u00138\u0015;`<I\u0014Z<X᰽^,]6\u0013=\u0002\u001csZһ2;ۀI\u0001ȼS3ռe\u001dȼg\u0014=~<m\\=j=.l\u0018<S<M(<\u0010n<5Tv\u001fM#۞;\u0014u\u001f<=T~<˼?\u0001<=\u001fۀ\t\u0017<hs=O|\t<=<\u0005\"}|=\t\u0004=a=i׼i\u0012\u0015{ټS<\u000fGVR|S3sݼX<<L*弢B_\u0012>>\u001cq{MQR\u000b=-x밼\u00017^<ߺdf+iq-;Y\u0004K=̱]0\u0005e\u0011\t=\u0013\u0005=ۅi=\u0012Y%/`Fư\u000f^\u0007=7T=T\u001e\u0012<\bG\u0007\u000f:K;ݗ,=\u0014d<.;ceUx\u0007\u0002==j=/WLx׽\u001c<k\u0015B\u001eu<\u001c<Ӱ=o<G<M(>!\u000e=)<=N<,?\u001b=͓=ig%=V<\rQ=u\u000bz۽xo/Y<\u0002<\u001f<o޸$<\u001a=Q<T==\u0010s\u0018=մo=6=r\u0017\u001d\u0015V;[em<g\u0013c<T\u0002>w;<*;\u0000>0KjM\u0002Fm<J=C6f<د=\u0012;p\u0001=\u000b+\u001bA!2=&=̼V=\u0015\t=3t.=\u001eݽOŽ\u001b=\u0014E/>5n<Z8m$9|\u0001\u0019<\u0016\u0001\u001ft\u0018 (We\r5Ċٽs/9\u0012<0<t\u0017u}b\u0000Q>\u0013j5]14P\u0014<9A\u0006B}\u001c:W=g5<Լ\n3;teIp $<w\u001d);\u000b<\u0013\u0016Eҽ\u000b;tS\u0019A!EN3J\u0006Vxc=EG=F=\u0016<Lsd\r\u0019G\u0019^CV6\u001d)L~f;^G<T:\":\n\u0003Q|Ә\u000b<yG[=\u0003-=6>D{===H<WLϼp{ɵ*I@nＪ\f;S0=5\u001e=\u0019=\u001b=Tp=R<cҼ\u001c#Iݹ\u0004a\u0018ɼh<\r;=u=׎=\bI5\u0006Z \r½۠Lp=\u0018=M\u0001a<V>\u001bԭ<a,\u000385\u0015<=\u0004\u001f=lͼ4'I#=m8=©=L\u0019t#EvECY=<[&=3;f<G<q9\u0003K\u0018\u0007\u0012\u0016\n=Y\u0010d;\u0017\u001bּ\u0014O\u0003#n<i5C\bɺz&\u0006=k\u000eD=\u0004\u0007=Q<\u0003\u001c1\u0005Ļp\ns⻞;)<E/<hNb<+<=I=;=)\u0018=\b\u0000<4\u0012<E<\u001d<\u0013ռY07y3=+<%:Z<Yc=,\u0014\u0001=t<==7B;\u0016,;AO; 4\u000e=[ӭ==um31罖0=c?<my=?m=\u000eE<o<{V=v==7=\n=Ⱦ\u001a<J=\u0003\u001b=\tC=pY=w<S=΅=̅=1=m=TE===\u0015\u0017= =-=y=\u00019\u000f[9\u0012<Ѣ=3u\u0000(X^|tD~\n*M\f>\\:=\u000b=iy=~e=e=\u0012\u0017==\u0005Б=\u0003<4\u0010\t=\u00037c=j/=\u001e+]S<@=o%=\u0016\u0000=!\u000e?\u001d\u0007)=A\u001a==\u0007S=TF<{w=ps~=6\bA;X=\rV=3!=d0*=B\tZ$v\ttt=Hb=\u0012q!e4^\u00109<,VZ<<<~T<p\u001e=B=AΫ=C=R<\"d7=\u000eYN\u0006\fNZh\u0007=A4=6p=\u001dP\b=\fzV\u0018<n8?&ýu\"=>tD\u0006<ٽ<\u001a<\u000f\u0010k ٍ\u000f\np>@<\u0018\u0018<Vt&\u0013,{n=\t]^μFj;T`<X＆\u000bw\u0019Dy;mf<ۻa3(\u0012)\u000f\u001a]7T\bB<y6=:ռ\u0002\u001c<\u0014?&*\u0014\u0015$;Z\u0014Ψ^4u4ʼCC#`r;퀽\t\u0001\u001f<\u0003\u000fT]g\u0011=\u000b1\f=<J%=E&<\u0011ֽ]tIf\u0015\u0007]ϷZ\u001b=]Z\u0010u0=\fT͖ռee;nq=38lh?\u001a\u0005cd\u0011U\u0002C<rag~$<}\t;\"vqӰk⽡Y0#;kZ%A^wP;zA\b9ﲷf,⫼a;.._\u0003\"\u0016\u0015'½vI7\u001fWm\u0015ʹft1=n\u001c]1&-fP7s\u0013IP\u0002zWdwwg+\u0007P\u0012giOz\u0011!<w\u0007t\u0004{\u0003i^\fm#E\u0007;\u0003H&߽%Y&<\f\u0003\t4%#.jV\u00198\\!=ܰvt\u001e\u0002a\u0015F\u0012M\u001d.{<fv<\f\t=/;U<2D<PXY;&\u0017\u001fܼvߺVܺ+IP^遽zǽ\u0001ּkoy뼼CC<zfi=t\u0010=ZE=\u0010F=N\\3:\fJ\u0014L=YTs?׽\u0014Խ\u0000\b\u001e5=l'=_\u0004\u0019=\u0004ļZ3<l7M\u001b=\u0018P=~cǼѯ;\u0011\u0013\no17t<.aM\u0005=\u0015\u000f=t@\"<񚌼p˽\u0018\u000eR;q\u0006Sg\u0001=\u0002\u0011ĽǑ{Y`9[)}]>O=N3>\u001fW\u0004\u0017o\u0001J$7\u000b\u0005<\f\u001f=%yJ\u001bP\no\u0001;<֜<\u001cɼiZ\u0006\f<\u0006O#=O\u000f@\u0012=);Y\u0000=߻a5#<+,|Tͽ\u001f.C=ߜ<\u0016\u001d\u000e/\u0011\u000fؕ0!6Ľ>dfՃ3ۈ;k9\u0013\b1\u001a\u0006H<ld<֞:&S\u00126;Wyc=<U\u0011<1&:@4Ƒ<2<\u0016\\<nA!;>\u0014N;\u0013{G\u0017\u001e\r=w;1<̿<\u00193;\u001bvaݼWkU;w\u001f<\u001cY=^`=r\u0010=$=)º\u0002J=9<\u0002==u=f\u0003I@\u001d=\u001fU=<,><?o'=-\"=u:=\u001e\u0017\u000f=[\u0014\u0000?\b5ソN+dh\u0000S<6{[*'\u0019\u001a\u0019\u000fw\u000e1j=\u00139=<\u0014=ۗ=<\u001d=KAlit}\u0018?;\\:#'!'u5Ľ\u001f;H6\u0006QQ:H\u000b\u0007<*\u001dބY\u0001n^QN<u=m=Lܼ,$:A;=wd|<gm\u0013=G\u001a<=\u0010X<P9*cY2;?<]%?s\u0018!\rE>41\u0018><E>/5>\u0001e=K=}$=BBR=d<9\u0004}=\n:<<?6ܾ\u0015Ym\u0003=Ƽ\rJ'I=\\:'/\u0019\u0000Z=`=׳=;6İ6\u0000;Cμ'Tc.O<\u0013=m\t<s=\u0014=l=\u001a=^GD<L\"(\u001fg<2E=%</{\r\"<<Sм/P={<\u0005ĻW\u0016m\u001d==\u000bOM}x\u0005J:7\u0005;0\u0017uጼ<v\u001e\u0002\\\u0002)\u0000<E\f=~<*=\u0014\u001dX<^cһٻ}t$%{\tS1;OsMNCL9XL\u0018<u;T8\u0003):\u001a:^\u0019<+P=@_\u0007\u000bü\n\u0012(t*<ս7\u00155\u0006o<4᯼Ǜ<kB<`r𼤛Hy\u001e\"r0'\fw\u0004;\u0004 Ƽ}+<yL_,\u001fO;xU=\u001a\u0019:YM2\u0010=\u0002׫zK/<²#='15=\u0018\b<\rFn*Q<_<<_\u0010=/G;6\u00167ԣVg.u]@&=IĻ#<-\u001fx+݅ ~\u001c\"\u0010,K\u000bR4\u000b<1(=u_\rR:DƮ,bU$R\u00148ыP<nb=w1:<i==h*=\u0001x<Nм'<\ty\u0018o<j=\u0002<E\u0015\"=\u001a*=W=,|CB߿<\u0005Fz<\u0010<&\u0006.99:ɧqӮ\\f;l\fܭ<(nMS\u0007ȾG.|<K:\u0000\u0005<\u0019<X}66c򁉽R##'<q<;\u001e=\u0005<A\u001eǼ?܅+\u0004XŽ\tq:;o==kh\u0000<\u00018\u0005<IiRcM0;~@z==}poH<U@O=kDMü=<p=AнGg]=ʸ<w;W47<\u0000<!X`9~=i<\u0007ǀp\n>\u0015-<1=<o\u0014=Dl\u001e!ƽ.Je\u0005>9<\u001d}\u0005<Q\u001cz=\u000e\u0014\u001c=e\u0014&%=:ق!<[RNM\u0012^<\u0017\n7V=]$=w&=\u0019XaS;{BZCv1a=\u0011~<g<q=J==\u00175=󺻙$\u001f\\P0==\u0002c=HM\tdŨ:;w\u0003o@OmU/׃Kl=p<N%R<]T\b\u000fN=50/@p\\=\fy=>0<?=HH=5O<ə\f\u001cg;\u000f=T.=b\u0003ω3=<<*\rBC<+\u0004<295;&[ػb:6UcuE=0;1[#=_b=b\u001c=8\u000f\u0014<t\u0012<^*=</{e#;zӻ\u000e\u0019=\u001b;۽\u001e\\\rVZ;.t<\".ށf;Q\u001c=9=f=E=5=\u001b==6=e<\u0013^<\u0011=-=T\n>\u0017Q =\u0001C<X~D<ټ?;\u001e;\u001c[(P;h(ļdƼ\u001c\u0000<&9=#/%r5/&\u0016\u0000=\u0016Gp@m;\u001cnhl<\u00178| =\frμZ\u0013ك;\u0010\t/N\u0011`~\u0013\u001aZk\u000bc\u0015/k\"\u001e\f\u001b::zWk\u0018\td;<±<gݼ~=BZ\u0006=&\r\r=\u0005\u001ev\u0003;*<xb\u000e==\u001eȼ<\r\u0013bdh4ݻp\u001f<q@<~9\bz1麒\\<EsA\u0011==@V=\r)=s=\n\u0010<^\u0004\u001a=\fq=-\u0014=<Wk:<G<7\u000f!$\u0011=\u0011I=*3޽F-\u0005\u0006k,<<-5ؼ㶷<ENi=6=_<$([=C%=<*\u0018=`*<|;x #ܽU@\u0012%\u0004=\u0007=B=Iu==\u000e>H\u0013\u0016@<u;'\u0012+ZQ\u001f\u000b<kBX-$=\u0016X=i=\u0015<\u0018<<8\u0019\u0004b̽p=-[<=6gҟ\b<G=)Kq5\u0000Yy==1e=\u0017\u0010򹝽 ўBw!H\u0012=>H<7;\u0018\u001c=\u0014z+(Z\u001d\rB2y#[XS<F,\u001b=F<A<c4E\u0013\u0014<5uH=<]5Y*<N&f<_\u00076<<lfoEi*Z<$\u0000=0R\\<@<5 /\u001bDY=]=Z=f=Ŀ='su=\u0011Ѽz;)yɼL< \u0010=|=6={= =b;{<\u0005=;Mb=\u0018<zf=:D֋}S=\u001f<fq<PpI\u0017Y\u000374=Ehj=>='x<r{[=\u0016=K^d< \u001e<9=Y\u0002E޺\u0013aV(\t=zњ=Q<\u0010=/<5\u000e=r=߽L<je=\u001a;\u000edA=˨\u0017vˇ<I=?=\u0018>ң\u000b>љ<xa#\u0003M\u001dSu9E0\"=ft\n>ܚ=fQ5㺽q\u0006\u0000W=*=fy=3=;uK=\u001a:$Ġ<C=ե=ުo\u0006HŽZ=\b}=;\n>\u001d\u000f\u0001!ѼӣIL'2;S;\u0003<\u0014S*<o<\u0016(3\r\u0010༵/;).=\u001a䍺sʝ;e׼\u0016g<\u000fd\u0019;.\rd\"\\\u00023ŽAނɫ&Wg\u0005\u000f*#Ѱ\u0006\u001f6<\u000b;O!ȭ8\u0000\b'=\n\b\u0019==B8,<f;v0;/\u0011p=\u0015č<b=\"=>\u001d;<\u0015'<1=\bR\b=ۖ=\u001f>w\u000f,Ub:\u001e}޽m=T\u0015=R=;=tt==\u0016a<=\tf;\u001cH<\u0018\u000b=&+;n=׊=_U==\u0000(ν0Uo%\u000f];k2;sH:`<A<<[<<Ί=\u000e=&E堽ͽߊv<;ԸR\u0015=5yS<[:\u0003\nb[6H<\\Eֽ=Y<![A=\u001a^=f=+\"=3ǯeJ!\u0004=G̟<aX\u000f\u0016\u000f\n<\u00056<[&4\u0005x\u00010z#=%\t=XL=\"Q\u001c<\u0010vTJ﮼\bT<\u001fԼ>\u0014<\u0000=\u0012=<S<_<=B= b\u0005#YZ~j}㼞b\u0011?=\u0007ǀ=C=VϾvn1M\u0000=Ѫ_=i^8<Bcw=a\u0006=\u001fېK#\u0004KL:V=\u0018mȾx`S$Yq\"\u00011;ùFW\u0018\u0018c^<\u000e\t=;̄<zo`kz;\u0014iݼ\"X\u0015F\b6U\u001d\u0016\u0005-`<͢:,kj#<}W<\f==Ȝy=\u0019{=OK<i<Ǯn<<<%.=<v7\u0011QI=<c;6;==<KK=#ǚB\u001e\u000fZQ;<iVӼ\u0004<3=\u0018\b;j*='۴;e\u001b<5U`:r\u0019˼\u0013=\tkdHCj=\b\u00044=A|=X<QpyMc'\u001fEt\u0017\u001e\u0005aC=<\n\u001f=\u001bP߼IMV=7)=R(=\f\u0003\u00177<rw=f=خ;\u001e\u0003\u0005DI'޻y;zݼ\u0014=q\u000ez\u001bw=\u0017cO<V<|O]4i!HF7˽*䎁[; \u0016]<ݿ\u0015cź\u001f9k\u0005A\u0003=G=#!_0<\u0017=6<<=ғC=ӻ\u0001\u0017\u0015t\u0004y#;+\u0007н\u001aҴ+-4<q\r=\u0001qz<<b;Ҽ~H\u0015=ed<\u0015^@+o\u0013#00\u0004vp=\u0001\u0005>C=\u000e9&>Oi^==< [:<p8\b=z%#'/=a֥=ٛcK%I㶻#1<R/=\u000b\u001eO&X==<\u000e<֯c:kBPԅ1kQ<f\u001c<EKQ<r:6*%i\u00010`Kِ==\u0014M<e\f\u000e/=\u000fGt\u0007ڡ;l0-\u0004Iϛ=7\u001f48)\u001f0f\u0016W:\u0019D\u0006\bPW<^O=\u001f=j<`=Y\"*K;ya<{뼫Ƽ%_4:ظ<_4\u0013\u0010\u001f<-=IA|/Q=!=L62\u001ef\u0019Լݺ=TΦ:]U=;-\"x;}\u0010<,\u0013=q\u000e=D\u0006\u001b<4H:#<-m)\u0011<<`мOY\u000f\u0006ҕĈ<'3\u000bg;\u0003׻E&=;IBk=\r-<`y;8\u000eiν\u000b_xŽ\u000bXSɼY\n=|v[(N8c8\u0006\u0001=Ɲ=\u001d\u000e<Ų<׷&%e(ӻ9<=Y;\u0017\u001d={=Ƞn<\u0011J$\u001a3V;\u0017߽iV>\u0011\u001e=U\u000b=Jb ļ\"=1|Z$=\u0018l\t;\u001etB\u001azϻևEjpC=\u0007FU=tt=$=og=`<\tCn=\u0003\\do#A=d\u000b><;l\u0014\u0012=a%I=<AD9>~\u0016q}w\u0019*8c1\u0017}=.\u0000\u001bl=\u0015\u00191j\\GxM\u0012\u000f-\u0000hxeR\u0012=\"SB\u0010n\u0019;g \\\u0010\u0012\bȉQ'\u0017\u00123<<\u0011\u0004==\u0011=^/a=b\t4y;0<fC̽KSu]r\t<~<׵f\u0001=^a\u0011<FnH?\u0010=_=8\u0006;<yF<SL\u001a=o#e*<\u0010˜=?͕=\u0003Q;TG=_LU<M\u001f=p`=3\bЂFBߺ߻Az\u001bQ<</<\u0014\u0011-bѺ͉\u0007,q;3\f=v\u000f=ýfS\u0014;-O<\u000fռb;A\r9c\u001c<aƺ\u001ed=\u0007D5E\u001f/r;O\u0006=h<\u0018\u000f;/3<{O)\u0014I);<\u001c<\u0006Ub=(=!UH;Ww=Ǻ=#ּw\u0001>j={r=\t!=\nmy\u001b /a<~\u0007=ߝC=\n&\u0000q̻=\u0003C=\u0002\u001e=\u0015C=[I=a=l::=mH1\n\\,dEݽ)W)N,<\bjh<|<DE^+p|r\u0002=Y\tv;MN'yŏX[1Yjnt\"ν\u0015\u001e߽[07=uѼiV\u0005:mU/3<\u001f7;PZ<\u0014<;\u0001u.=;8<\r\u001d\u0004\t<;I\u0013<\n=\u0003<<\n%9=z6׼T-e\u00108ȼҋk}2<:Խ9v(=o=A=<<mj;:\u0007<\u0013|}V쩼65\u0014׺Hn|%p'o [i\u0000\u0019<\u0002WͻhJ\u001aŦ;X<\fhμ،Pk<\u000er\"=R2Rfe<\u0003\u0007:T49:=Qx*>\rY\u0018>$v<*~=G=0'Mu<IĽDX=u]=xc=.=\n>ۼ=\fT<6=)<\"=\fZ\u0002=\u0010{&=47=\u00141\n*UF=d%=x-G ͼ_߼\u0005\b<$y/=̋$\u0010=z\u0017=^q=3\u000e\u0013\u0005'ּ=\u0011%Mn{\u0015<Ac߼\u0013\u000b=\u0017\f\\<M'\u000b\u001a\r<\u001e#P{\u0003=$1g5\u0000;\u0003=*=p}=lu:tIԼW>D;=j<$}\u001emt=\u0005\r\u0010\t=C\u00066=?=<_k4Iм脱V,==K\u000e=p\u001b=L7Yu\u001d=\u0013eJ\b4'ٽ- ،m==b=Fl2KP?\u0001:Jw=Gً=\u0004=<;̔Kz\u0018\b\u0004[T<\u0007}\u0001~b= )Naz;aʽ\u0004R=\\=ql=\u0012/佺\u0013VTq\u0018C\u001b\t ;90\u001fa&='Pkza\u0013hK\u001d3<Ѽ~<v;;k?<\u0017=󎥼߆)\u0015\u0012x\u0007Ok.8\nҌ=.S=\u0017\u0002=QvYБ<#cZJD\u0003>:'<\bq)=C+%ڼ*Tʤ<e1\f<l;?<q\u001e<Кx<K9轕pbr-r\u0004o/\u0007^P;\u0015=Pcn-<,\u001cG\u001f\u0014QQ N]Ǚ\">\r>>jͳLڼ ȽiʼeZD\u0019Ҽ<7\u001b=}9=ɍ\u001a<\u0013<\u0014ן=t\u0004=e*\u000e=v==h=Aثe=A\u0018vQ>=V=Sa\t\u000f\u0007<*üjLa\u0015\u001fr<9Ɩ<\u0003ǽ#zh= \\L`4Q\u001dk#+\fF\u000bl:&\u0014=}>\u0013>ezؤ8<N\u00052=@\r=\bM;=;=_x<=ݯ<5fJ=}<unV=a=<ep\f=[4|=\u0013Q=p<u=HR\bϼڠ:\u0014g=R=mh=]v<^8<\f=~\u0003=\u0006ԩ?sl=km%mj(ּ)<D==\f<T}=Gд=\n\b=@>:e=\n>j=Oc@>@^^=ِ:`\u001b:׍;l\u000fT:0u<\feaM>;=\u0018<WY\u001al6X=\nH=l;3;=\u0016=\u0012Vo!\u0000\u0014=k=\"`>'F\nP=Ϫ=\u00147=\b<b\u0014=+\t4\u0001\u0017<%8+B\t=:\u0013J9\u0001S=S\t\u0013>>JJ=4\u001d=\u0000x=Ȓ>9<-<0a\u0001d<%\u0012=F\f=\u0007=\u0015\u0001O-\u0003&.i\u000bS]$,-O׼̼[<\u001a=!6\u0017\fӽxd\u0002;fG\u00126 \u001eV.pg;AKݽLm;;\u0007o\b\u0001<=+\u0018Ľ<|<\u0005$\u0001Z\u0019ncT9<,ItI=֪\u0005Sκ*.=1Ժ!2-='P;\n4D<\u0007=)t\u000f\u0018<F<[e`KDْI_@;Y8=b+=)\u0016\\ٷ%|<Q\u0011!=\u000b=y,\u000f֘pbt*O\u001d\u0018<7kB\\\u001dZw,=>\f\u0000;\u0010kͅw\u0004=.0f\tr=,=\u000ek\u000f9U\">цmcʄ<\u0010=|+2\u0017d*<R'\u0015iX=\bC/Qzt\u0017<)t=p=65>͌iq\u0014<B>M/dؽ!\rsOu/C;\n)\u0018=Q\u0007=\u001b\u0001\u0002\u0010;~\u0000>1-;!\u001d;\\͆L<p;+==\u0004\b>)=i\u0014>GՂ\u000b+<\u0014<8=7YV\rNφ=:a=_i=E.<e==<\u001a\u000fҼ_&M<0\u0016=\u001ao^Ic=oD=#TǤw.ɽWRJG\r\tr@<A\u001c=i!H<\u000f=*<c$;\n'f\u001d=5\u0013k=X\u001c\u0005*;&=\u0019=\u0018<zD<K<\u0004k>1\u0007>\f\f4>\"t:,='+==_;;\r* _:\u0004=\u0016\u0004=\u0014O=aPA'\n(\u000f\u001f^\u0018;=\u0007wb?/K<i^=(ǻc\u0013V=\u0017Jl<Zhl9J=u=>D==5<UL=2\u001b<\t<o<mۻP\u0014<Ƽ\u0018=g\u0001زN\u0000w&;Tn8\u0014_=.e)<\u001e:`=\r/7<w:u;\u0006]\"9A%`\u001c<Y\u001a<$fؼ\u0019<\u001eD!Zjaa;\u0011)M\u001by\u0018r\u0019G]z<48=psn\u0017J*<J)=\t9>\u0014Fr7?)<\u0005r=l=9>\u001d<\u001e\u0004ٽ\u0013<ۉ'\u0018Yĺ?\u001b\\ʼ\u0006=\u0019r5\u0011qO$l:=\u0019=>\u001e=\u001a\b>Zg6>K<h7Oו\u0005\t<3\u0014Zi\f\u001f6^=J\u001c\t^Җl.\u0012exo䡼=)>:H4<ă;a$<#\u0007=|<O<\u001f\u0016=O\u0013<ߖ<S(=s2C<\u0018R<\u001e'.m;\u0000=|;\u000e\u0011\rR=0\u0004=Kv=ĚkeS=+f\u0016=}=!<\n<$\u0003l\u0002\u0019y;}\u001f>\n\u0003b\u0010__\u0003=װk;)<q<<ߦ=\u0002]\fu0=׬p:=\u001aɼ\u000e\u0003<U4\u0006଼ܼq=V=\\Dٽ޽>. :ra\u0016-Cɉ߇ \u0018;\u0017i<;9J=.B.S\ftgj;=\u0000<6L~<\u001c>J\u0003=ƒz\u00169ADJ=<<\u001f=9i<\u0006(\u0015=>Y\u00112;EU⏭f)\u000e̹`f\r\n.Ix%ݽ6|ٽf\u0016T\u0015$vܽ\u001c\u001c-\u000fS\\<hNy\u0006=Bȯ\u0000ýo<\u0015{\u0013\u001b\u0013lfν\u0006\t?<\u0003C5=\u000fͼWpP\u000f=0\u0018=H?k=mH<X<<S9\u0012^}<r;\u0006خ;za:2i<w!=bH=6<;<>5<H/</d\"l%^;};1p<,\u001cF<\u000b=\u00106;9(\u0007@Cb\b9w\r\u000f:\u0005\u0003k=8=B\u000e\f;\u000bqz\u001a:1\u0017<R\u000b\u0012y%\u001b\u001cM;`\u0013qûC\u0019<<߼+=VE*p\u0019{\u0003;\n<7<(\u001f\u000eP<K;LK<>\t+M<W<\u000fֺ<\"\t#޴;\bÖbp;00<ZYz<ސ/:\u0019{Tu\u0018<1<r;'G<?~<J\u0014<Z;|{<;s=$=\tϻN<?\u000f\u0019<Jp<TE;\u0018<<\u0006<U<\u0012g<u[<9+YQ8;\f >[A<,\\<z:#u<t(\u001fv\u001a<\u0018L\u001b;\u000bV<l<N{!<.<X\u0006t\u0018<t<\u0013Ӻ'B:,.;Z<4պ|\u0017<\u001b< 9.3U;\u0001;e;fYe<L\t\u001aA鑺?<;T&<*:e\u0004ܹ\u001a;\u0005\u0015\u001bi>\u0006\u001b&/<= {\u001dI<FU\u0018bFe\u0004V\u0011#\u001e\t\u001cZ<c\f=.0;1\u0007;x3;<G7<1\u0016<cVj>\u001fl3=\u0010\u001b/=F&wf\u0002\u0003V%ʼ\f\u0007XjO=\u0010e=\u001e<ü\\ \u000f<B\u0003<coռS\u000b\u0007\u001c6ۼ풼;{WY<Z<\u00141;֛;i᰻*9gu\b0p<K<Q@<Z< <u7<ɼZǻ \u001c\t4\u001b伺;2\u001ao\u001abY;J;\n<{6\u0006=\u0019\u0018\u001dR\tp<|<\r\u0011=;`\n=t<k<\u000e\u0001=?%=\rî;1\t;)<94=mE=\u0007F<g˺ǐ\u000fw;~<\u001dnks:<~U;s<<}<\u001bT;ΥbN{$\u001d! P<[#$ T]e\u000e8-05;gʻ\u000f\u0012yX*w:Tr*fR?<M)T<PS<H\u0003;\u00039˼\u001c0#\u0011^oOHaYnbM\u00010\t2.ֿO}߽\t^e;\u0001\u000f</\u000bZ/\u0013\u0018A4:7غs<iмk1\u0012<\u0015=\u000f<\u0010;hE<Dм\u000fI\u0003:\u0017(HH<ú\u000e\u001fx74)<\u001dкУj~/rƌ:\u0013靻X\u0019:;@J1;\u0005;p\fNм.C\u0005Yo;s\u001eF\u0006*;\u001a<J*;:5\u0017<B<|4<td\n:?P<7<F^v950<hmR\u0017\u001fR\\<Y<m<(\u001a3<\u000b$\u001f<\u001dSF;\u0015;U\u0016_3'<oebY3-m\u000fk;<fG4L\u001en<O)\t=~B<_[<4r\u0012<z&<w\u0001<RIc<\u0007<i\u0016<)4:<m<5\u0010\u000b<HZ\u001cm:\r}\u000b!PӼhtŻH\u0018ƼO\u001dEQ;rt׺M3\u000bq\u000b݉\u000b\u001f<fĤ(Ub^<\u0013\u0014WB\u000f\u0002;\\h;Ќ<P\\uTҼ\u0002\b\u0004%<\u0018\t:\u000f\u001cL;]<X\u001b<.<(Y}\u001b\n\u001cC;2T:\u001ar;2<|\u001d}}'; \u001cy+2; \u0007ټgHJk\u000e\u0003\u0011P;<}p켱YX<Ή\u0001=L;r<\u0007\"\u0010=\u000eG\u0002=.NIs5j1zaGҼVn\b=}Tp<V\u0001=HWG;\u000ecX\n\u0000<\u0002=<ZV\u0006G=u=Y\u0013\u0003 H%=\u0005T\u0018=j'=\u0001k\u0016;D4Uw*n3D<ay<>D<Rȼn\u0004<8;<K\u0005G<\b\u0010B:dwm\u0017;DC\u000b<s;֢\u0017;;`<\t\u0007)<i^OoU!=<\u0004\u001c'=ט=&M='0=̾<\u0006==\u0000=|/oNú\u000f'˻ü\u0006\u0005fcv]\u001dJE;1\u0012;Ś;+v;&V\u0005M&(:Z8\n<M\u0004=D<\u0007W<<<1\u0005F\u0014\n]< \u001c;!$h<\b٤P<\faD<}he<:<\u001eb/<\u0001<i㥻\u000e:݂HR<Gň:|\u0000<\u000b:J7zʍ<%#=\u0006/=!Ys,CIF勍<Rk<gX\u0014`<S<3h^8<Њ<U<\nގ\u0004@<\u001fܼl\u00000\u001d;);FdA7u\u000e=`#<Y;\u00153/%;)`;;\fYB\u00032Ͳ<k\u001b;l<=<\u000b<<H!7K\u0017<\\\fNXd\n;8 =;+E)R;MLC897<M\u0007?5<x'=G~<SXKc\u0014<`˼ļ!a\u0006;]:\u0019:C\r.\u0000;D\u000b?;o95;\u0005r<Z(<|l\u001e5\r ;\u00197z\u0000:@I<v탻9,;<ԆT\u0018M8&\u0001f໺\tJ\u0012Y)\"#t<iT<a[\u0003:F;C\u0003=|J;8yw\f今s{/31:\u0014\u001f<\u0017ʉ\u0018>Ng٨<FFi<\u0007y; =\u001e\u0006=w\u001a=g\u0013\u000e@}\"O=.f1\u000bI\n*c^\u0001(CI5L\u001a\n\u000f\u0006\u000e&߼\u0004g\u0014tWi\r㾼ּޜP(䣼==shüݼ8\u0016x}]dPLĻ\u0010\u0001qb+Ø\u00191\\Ƽl\u001b0OQݼ\u000eMW^#ڻυ3X\u000b\u0017ă\u0014Ȼ9\u0002&%1\u0000L<[\u0011=<\u001a;}<>\u0017;\u000b;!\n<r<or\u001f<\u0011㣏<F<\f92=a\"=d=W<\u001d<\u0006=TA;|<ez<i1\u001e=\u0004d=>[=U\t<\u0016亠h\u0005<\u0017;\u0019:aZ\u001b\nx<)<<LҼ;b9|=\n=.%=r<\u0011++=\rq&=\n'SZ<ޛI<\u0001;\u000fC@KVN:ϗ|%9#M\b;\"ͼAg*\u0010_m޼*\u0019<i;\u00059y;߼\u0002̆<)n4<Xl\\\"jr<ןʻ,;)Zм7\b8<P-;;'\u0014F3<2%<sa;ր<<\f<:'\u001e<`핻ø<@<͆g;SE;`a\u0013j$<\u0000;\f\u0002\\<ދ<o\u0019<j_\u001c<@+Ҭ\tz\u001b\nf3~<p<Ju\u0006=yzO;Ӻx<\u0019=Y\u001f<aG<+\u0005<<`@\u001a;y;\u000b\u0012=\n/<:\";>;5\\&<B<(\u001b<)rz8\u000f\u0003\u001c$;34r\u000eFWs<\u0016L<W7\u001c;R벼4T3&@w;\u000bռP=<(=\u0017=\u0010j'=\u0015k=K\f<\"]<<6߸<\u0015H<+=\\;*%;\u0016C<o;_C\u0007>!\u0016<HJ<%}l<WW<E\u0013<<0<\"<͇<s\u0017<OP{<<7<\u0014=m\f;&<P\u0016;<<<p;<\u0005\u0003=v, <\u000b<m3:;\u0004<ݍRzz\u0007Xͼ,m@\u0013$?4\"F\u001d\u0006\u0000o9e\\R>9\u0007=|;_)\u0000vK\u001a;\u0003X,Ļ;\u0014;t<Ϩ<+<=<W:?;Pļۭ<\u0002P)<\u0007\u0002\u0004<\f4\u0007#(}\u001d\fo:R<\r\u0002Y6\u00168<\u0007.;o\u000f9Qּ\u0010><\u0007<.Ky;\u0017\u000e}:XbI/;<@<|S:\u0000\r)<ۊ:ǃ;p<nT\u0003;BM<\u0015=C\u000e;\\ \u0018;'j<V&߼-/mﹻX޼,@}\u0001z3h/(}8~*y<cm<le><\u0006<C:T%;Y<<z<e\u0017v<\u001b9;v5(ڥ?:aV:\u0016[0X\"<l(;P\u0007)\u0006޼\u0013\b;*<a<\\\fw~\u001fRм=\u000e/\bd;*8Xȫ\"5<\u0000\u001e.ߟ\tWKǲkaX+\u000f\u0019N\u001a;d4;0ہ\u0006Mbju<n\u001c)R]شd*GY\u0006H<*<\u0018:S߲\u0015<\b'<2<3J%;C<Lh\n;-\u001cyI\u000f\u0005ҼLƼQ\u0011Bt\u0006:>Q'^詼5\u001f\u001b<;\u0018f\u00197k<4\b<T^<T:T6<k<\u0004txc;Ck&~\r9\u0005`*7P %\u0000$P\n$,\r>ej_[\\\u001e \u0010\u00038\"`l-h<r<\u0018<P񼗶\u0019;\u0014|;@<v\u000e\u0000q\r<Ǌ<GX<b<\u0001ռg{J;:;;\u0012;ǝt<q;$D8;;酼u\u000e<h;?l<LgH<<\u001aaPsLc<{<\b=qԺ;\tk];Ő\u0010,<<_\"N<E2;3;d\u0011<5;*j\u0001=\u0007<gġ<g\u001c_\n\r\u001e<;:A\f:i28Q\u001b;>\u001fǻr8fǼ訡\t\u0010QWL(=DƉ=>=dG{ȼ%\bG3*L\u0000Ѽ\u0011ɼ^u:\\\u0007y4s+mcƽ\tŊ\u0012\fz-x\u000bH;c\\^a<Y\u001d=d]\\\\ջ?;41D\u0003tS\u00030ǽ:nv<e?\u0004\u0017\u0002\u000f\u0000׼Ybg<Ǘ;#9%C :\\]<*\u001aAXtC*;\u0001<\u0011\u0003<<G\u000fď;\u0000\u001bf=\u0019\u0015;\bO<nj\u0015<0<W\ro=4X+;Zڠ;ޤ\u0003\\<\u0015;U<8<G>=c=\fe<ɸ=hDR\u0016L\f\t;p=l <\u0000<\u001a<1\u0007=7!=,,</ҕV 栦<\u001a}<;<c<B<Q;\rWۻz <<q\u001cۼ\f-'<Ѝ5\bb0g\n<}==\u001aQ=>3=\u0016=\u0012Z\u000fk[/U=kF\u0004d4Ħ<z6\u001e\u0002=\r3=\u0014m\"S\b\u000b;q̽\u000f7;=aN:6\u001bf;\u00040ٽ_\u0001X\u0016=\u0019oNt=ޓ<THE2T\u001eϽȾ=~\u0017;x'.0⬼[=($=t\\<`<\u0005<\u0010G\u001bKnc;\u001fR]=f<r<*H<ݷ\t:\u0006u߻<AM\u0001\f\u001e<o<ڠp.+\\ ğ\n%_\u0011\ts\u0007J<\u0002X<\u001aK<\u001b\u000f<\b<,j\u001eMEy\u001aD=\u001d[xfzn\u001cF=2k\u0007㼒+\"*><i<X?<I<f=o+<m1=ҁr=7@=Ic3\r\u00160g\u000e=<\u0000\u000f-͸y\u0001\t#6;<\u001a\u001c<\u001eIv\u0017P>g :d4V/\rV|K/ڼ\u0016$=-{<bge\u0007Y:\"\u000bq\u0000\u001a[';мt\u0013{0=\u0019{<c<~\u000f>Jh<NJ/<g{\u0012jQ\u000e笼<3C0o\u000bb.;\u0011lt\u001e\u001c*=7l\u0001|\u0017c\u001c\u0012<h\u0010\u0003<@A|<9\u001dɝ;R&,5\u001d\u001e\u0012nm<~3<\\E<\u000f=\b';FX=c@&HF\u000e\"\u0003=\"\u0011U@\u001a\u0013\ru;<x6{\u001f<ľ:v&</r=\u0011\u0016m\u0001=D2=B<c\n:X<\u001d޼e\u001eٽtm9@;\u0016\u0006<<2\u0002=AAB<G\u001a=EM;\u0006&,d<D<o]\u0002<A,b\u0017=\rQ<QY<0\u0016=&b=<zϼ\u0001L8|Y<޻ֽs\f=,<C(:qV<vO{N\u000f<ΚNV-\u0018ᾰ62D<F;\u0003D\u001eC˻\u000fp<e<\u0004\rټ㿬<: `߻Y\u000e<;]ᖼ<X\u0012=\u001b)3\u000e<\u0001K5<Jog\"(=\u0010<uΤ^]<R\u001d\"U\u0001<$&!=\u0003;\u000flKC<+A=fl=VC;\n)<l\u001c<=9\\\u0012W\u001dl\u0010?\\<\u000ec;<%O=:;1<\u001d<\u0014䧽\u0005\u0001?dS]j&<\u001eM=<p/ټ\u00109)<<\u001fiM_E<5L۽\u0014\u0005\u0001u+iڼ*\u0007<<A7A\u0019\u0012<\u0013R\u0002Lc9\u001a\"P^ᖼȾ\">&{-=@=*pZ\u001f<\t\u0003A\t\u0014=ϱ༱&|<T_=h<,=GP>=R\\U\u001dlSK\u001d=\u0016S=_==<r=\u0015=T>\n=\t\u001d<`\u001c=4\u0007<ʇy86\u0019\u0012Nn<%\bQ\\z=ĭ!=j=Sx<~c9ᆽZů2Roo;|\\N8<\u001d)IkͼN>\u0010=-<<DS=72;i&\u0010;CJEq꾎nQ\rnhwż?ݻJ\u001b\u0006pF|\f=ع3t,=]\u0017=#<\"<؃=(\u001f;`D\u0013>\b,I\u001d=x{Z\r@==h=c=\u000f7FXy*$(мa\u0015\u0016\u000b=\u0012~=\u000b1<,<q/B}\u0006\u000b =\u0000Jw<L\u0004=\u0016Y=DB\u0006%C\n=CFf#\u001d\u0006<\u0017v\\<9˂g-؄KLղ\u001b?<e~<ڛм;N\u0001Ҫ/;\u000e&88.<^:ǚ<:p\u00027C\t\u0010\u001b<Xk7<\u0001|\u0005; ;Rrһb\u0013d;4ʷCռ\u0001GU4\u0011;\u0015!3/\u0007:\t5=<T<\n\u0014Q\u0018^\\%m\u0006ѥ\u001blH=-ư<O)\u0010=\u0014NB\u0006b½\b\u0001GͧSb<u\u000e=\u000e=S\u000e7O=ui<j1X;\u001a<Oax(V0\u0014kL\u0000ı\f(\u0014*\u0001<Zjx\u0017_;p\\\u001a=\u001d<je\u0002=\u0005=(<2\u00031Rмr$\u0007<\u000bMl<3-<Ɏ\u0012:y\u0005B;,V%&\u0004]=s\b3\f=\f*\n\u001c(<F\u0012s;Y\u001dhH\";C\u0019e<\n}!0<c-;lLV=ԮܼsR=\u0014p\u000f\u000f_\b0<\u0000\u0003*B\"½Q>=\u0003<\u000bl<#<؟_1-:><JcUl\u0003;\u0013L=Y\u0006<O\u0011;-~<\u00100\r=$<\u0010\u0005<>bT[\t=<|\"E<\u0006\u0016=\u000f[;\u0012\u0015F\u0004w;\u0016i \"9px\u001f=<a?e2C\fn\u0005<\u0019[^<^\u0017<g+*<`;\tk\n \tzJD\u0004=Io=|ʆ<\u000b!Ƽn\u000117\u0016\u001c<\u0019:vK<b*\"ٳ=(=ԃ=[<\u0006]<\u0014\u0017⻙!^\u0015J˘W%;\u0004;\u0010<MP\u0007(\u0015x̽\f\u0019\u0000\u0016=\u0003>nu<\"\t=K\u001fZ:\u001f\\<پ>=N\u0001=ԓ\u0004\r^\u0011\u0003<\u0010==u<S<D<\t\u0010I\u001ev<7.<\u001byƁ!\u001c7:\u00070=D]9ʼaa-%$\u0016KU$zc<Lj9Jl\u001b\u001d;\u0000{OJ7\u001c4ɜ\u0002~<<\u0007<\u0000<IqM\u0015=(w<%\r򷼼k\u0019Ht;\u001b޾\u0018\u0011X\bgYg\u0017rי}Vј(<]\u0002#<Qռ\u001fLF>da.Z\u000b34F-\u000f\u0003qڻu>=\u0018\u0000=\u001f׬<ф@a\u0016<e;Y_U<m+\u001d;0<IZ<O_;- =\u0019\u0010F=wl<Χ\f<\u0012h,sS\u0006-;)R<-H=o7<\n='\u001e=V=aջp;\u0012<QӬ<\t|=}ǣ;:\b=\u0016-I=j̊;FY\t\u0015=+6<\u0010\u001d;\u0002&=>\u000e=3<W\tL<m\b=+<#=z'=\u00038=b<]\"(V;\f]\u0011\u0004;< \t<*9\"=XW\b>Ɏ<\u0014=#<\u0006\u0007=\u0004lY\tK]\rk<5q\u0015<O֧;d\u00058><+\u0013\rCt4\u0017=K<#Ry<b`g\b\u0017\u000e=Кn\u0000l;?<\u0000i'tR<1\\A?<ӭ;n\u0017<\u0004\u0010\f<0\n<#RI]\u000f&\u0001G7;<P\t<K)<\u0005?\u000b7<uԼoLսr\u0018\u0014=H*&\u000e\u0000ɼm{3.ڼzo\\\u000fJ}\u0015`;\u0012~c<\u0012Ey6=ݢtc;oS<\b\u0007<\u0001<<\u0016l\u0012z<ELC8<@> \u0006;%t<{z8\u0014!y=>>\u001dk\nh7qs=;A<0Q;1T\u0007=n)u<~<|\f$qT\u0005=/<O<<=,LC/\u0004;ęgf>;Kv<V;\u0017\u0005~Eo\rj<J\u0003<f\u00010=+\u0002;wI\tH\u001b\u0004\f+Ѽ\u0018f@߽\u001bD<\tY$ Be;\u000fλ\u00173<hvA߻ƺ\u0007=i\n=tmze5\u0005R\bf\u001e\u001a%o\u001d_j\u001d\u0015ٽv\u0013=b/=&D\u001d\bFm<+UI;Y۷;\u0000㼇Xo=\u001bP=\\A=Q<=\u0005:u\u000fCΥ<%{aڮ/߻;m\u001e\u0012=ĻԼX[ܴ<3\u0014̻`<E:<A;\u0019\u000b=\u000e<ԇ'<\u0012{\u000f۠<\u0010=\u0001N\u000e=1ۿ<\rW;Z =Q4=S*;:\u001cι9=י-䈻\n!<K\u000b=\f<A\u001d=HX=f.A5 \u0006<:F=U\u0002>b\u001c=.<+;=/<9J:=XM&\u0004<\nv<\u0002<\u0004;;ɮ<|=jP='<8M<q,\u0015=M;OG;e:k\u0001=\u0002]=k*<Dǲ;\ty;\b=\u0006<:^E=4]\u0002GJI<Ak@=f;-JJ\u0004\u0012=/c =.\u001a\u001b.a<G:j̑;<λ6;P<NG;Y]<Ǔ<6n\u0014c93=?<\u0002D%=;\rмK½+a<\u0016;{ᬼ>l%I{<S\u0007ʼ\u0017,~<^y2\u0001\u0013\u0017\u000f<ϻQH<<\u0013\u000e7\u0003\u0007\u0017]*\u0004=3<gƼ\u0006U\\BTN\rV=Џu=I\u0011=F=\u000ff=d`r:|#sVk(8K<\b\u0011='Bg7Xu\u0002H=8m=R7=b_\"o<,IZ=N<d<<\u0012;!t<=\u0011E<Y<D\u0018@\u0018:<\u0003#<'Խ;ػ\u001b<-/;m\u0003;x\u0010<f<,=-ic;u\u0001Ż%;\u0012V.7=|`\\8ݼo\b\u0011\tt<\u0010\u000e=PX<v =};ܻ$뭺mU<\u000e<`ڸ\u0016}1o^={\u0000vYEd/<H\u0015);U<\u001b<\u001f\r\u0011<Ԓ0nS<Ht<+\r$M:\u001a.?.<;B;<@\u001eX\u0006;Vy<\\Ȳ<\u0012#y=<wh,u8\u0003;\u00073\r=<.F\u001c<{\"h׼F-<۳!<<XL\u0013S;\":?|\u0005;ɋ.ٻB\u0000?<\u0017\u000b><(6`\u0002\nrǡ{\u0003ߵӿYw4e\"M<]\tߨI\u0011h\r[\n\u001cm\"f̼k\u0016~6-=\bpT<T:(<#u\u0012պr\u000eW\u0006\u0002=\u0000s::aqH;ͧQ;r<'o<\u0010l\u000em<;jR;1\u0017/<;B;`!G;ٗ*\":*I\u0000&)ݟ(R,,D=dZ?8P\b/u8p;\r=~SX@׼6\u0000S\f:gлϗ5)<.Y<\u0006Q\u0005V84I<)<Cm<Qw<[s&:;I\u0018ܪ;,Yu<\u0011󯻋t\b<8Rm\u001a<<c<X<\u0001/J\u0006\u0006ͼz~W)׼qFz(<꺼\u0012$)\u0011<Nt<i\u001e<(\f]oL&C\u000b[<7<\u0014H<\u0018\"=\u0001<$>Y<2Q<\u0017~\"\u0006Nhg;ki;K_\u0005=\u001c=wb=Fr=\\4\"\u0005\"x<\u00183<\u0016g<H\"Z\f8˼L\"\u001e;<\u0010\u000f<!0\u001d<\u001e\u0011=8<\u00018<\u0004,\u001e<Z\u001e7\u0000=\u0003]<}<Zm<K\b=?8=0u<;2<Eb;W<,:=hM/};>7};\u001b;\u0003缍kۼHe\u0017\u0006\u0014+=l\u001cμ^\u0002;_M{w\u001f%\rDRЈ/7!{>;\u0014=<_8=ΰ6\u0001\u0005O<kv<>>=G=\u001d*<= N޷<<`w<\u0011;<e:C\u0015=xK\u001d=K\"<8\u0017=\u0017=:Y7<2<yl\u0014\u0000X@9x?\u001b=;5!˼VZ\r\u0011\u001f<\u000f;\u0003rƼD\u0005b3g\u0002F<\u000bϻh\u000fSޅ-呓3\u00016;FJ<\u0019<ر;\u0004ͻ<DQ\u0013\u000f<z\u001c<Bea\u00118&ҁmFbqK\u000bIHu\u000b;0v4j\u0016ܹJe,\u0003!\u0000+;A;:\u0013;zPvL:<뀼xa<)\u001d%;O\u001eo%%ϝ<Cx\b=\u001d;a\u0007=dTJ={_:\tM<+a-<a\u0014=H;h<\\<s<x$&0\u0002;h<$\u0003Iהƺ\u00050\u0014;\f\u0003<gCpS\u0012\u001cH@%3ڽd<\u001b\u0000ɮ)'P<e@k+;\t<PF?M\u0004i\u001b\n\u0005sҼH<\u000b</j:\u0015Ԃ<W\r=\u0018\u0010=\u000e\f=f ;W%!<\u001f_TvgV<N;\u001c\b@\f<\t5\u000e2?5\u0018\u000f<\u001d= <\u0003g;v<F|B<\u0003\u001d<mj:\u001b|<$O;q>\u000e=8<\f<͙\\<P.ʻ+:7\r\u0005ֻw<Rƻ)Z<;k;RQ=?={<`5\b%䤼SQ=Ѝ=h>=\u0019һ?\u000fi<<b=\u0007s<#<Ӥ=\u00182<B=.e';F-<?R!9<\u0004\u0019W<\u0000=3=\b=Ox\u0001=&=2:<z\u001c87\u0013\u001a\u0018\"\"F=q=v<RD\u0013=\u001b<&\u0016<\u0015<l`;H\u000fC=X;{}\b<1<M}<$\u0014\fA|:M%&yt`\f<PE;V$<e\u0018\r<`U+t߼k|\u0012M;\u001e#<\u0014(<\u001cO<\u000b='2m=C\f\u0019W\u0002E&=y.I=h<\u0013X΂'\u001e<c!滳׽:\u0001LqԤ*﮽[J,¼iIb\u0012||=\rv0 t<?`<\u0017s;-\u0011wM\u0012+ɉaf9/k\u001ejf:C:ϼLX>J\u001etTAҼ\bU\tn\u001d１\u0001l|<!^i=%A=\u001c|<(r;\u001fP\u0016{S\u0006<w(\u0000\u0006wʼ\u0014-;<͛<\u001f0\u000f;X\n<\u0013<ga<X7H\f<oLC#\u0017;\u001fú X[P%\u000f<L0W<\u0001F;[=;(<NÛo<j\tȣ2x*<<iZ&<T\u0018f<$<2<*><<q<'<6\u000b=uUq\u001f\u00167[yGA;#$}\rpѼW仌8yٮ\\N~\u001b=V!k<N;*\u0000'uԼٻX\bqO<O\u0019<-DR2$/<iw%<o\t}&|뼸.!-}K\flөԲ;c<,$8;^22<Ә<_;<T&<SU<L!;\u0004\u0012jA<MEW2:԰\u0005<\u0002=:0h<)\u0003<Z9U<2h<,<f\u0004:\u0004Xs<qڼ\u000e'\u0019TH<\u001fźNyŧV;*0<Y6]q;bY;]¼지W&Ϙi<\u0015=kO:<<?\u000b;<v*;%<<;(=9c<Ś<(Mcm<3\u0014<I\u0011\u0004\"I\u0002;u*k˼!(<E\u000f<+v;̕<\u0004\u00125;:KQ⯒D»LV\nD<Q<\b<\f\u0004\b;\u0018<\bX<n<\u0013\f=\u0013=ۗ=wӽ=#\u000b=\u001cD<ɬ;_B</>\u0013=P\b <z0N\b:8N\u0010g2@\u0005YqM1.<bWt;Δ<RN+5\u0007N<;<^<\u000b\u000b;\u000b%\f\u001e\u0014<\u001df;\u00175<ST;UyCf}Z;;\tzX<:\f<A=(<\r<\u0014\u0006\u000f-5E=`\u0003=\u0011C<K-M\u0003];%j>ہ;=Z=W=H<\r_f<=@<[\u001du<E6=\u0001=\"<\r\u0003\u001a=s\u0010j<L\u0014\u0004zZ\u0006ټ;\u0015Z3\u001b<\u0011,=$<|xw\u000bm\u0000\u001f\u0001X\n缙S:iN\f\u0001klRķ<\u0018<\\\u000f7#;\u0005L'm<?<\u0005K<Z8Ⱦ\u0010\n_\u0016Լ[%Q\u001d\u0003xL <q\u000e-=\u001c<%ҹO<%\\]Ըl<o\u000ef\b\bG\r=oж:6mvo;[@;b'\u0014ļ!I;/k<ZƼ\u001d\u0003<n<\n<L\fD :s\u000b;Ń<j#<:<A=<4w<4<>\u0015#J\tJ@c7ڳP\u0004Gi<_(<Kw\u0016:Zk*<N\u0007\u001dAx\u001bh$\u00049\b|\u0018\b`|6!lѼ>\u000bkF\"Uqμ`T<wO\u0010\u0017\bDioǼ\n\u00046pI<i0@:\u001f;\u001f<\u001e<]<Grniʼ5<:\u0000\u0000<ۑ<̌\u0000<\u0019=h\u00123<e\u0013<\u0010޷<<\n\\<\u001e\bL<xA<L!=\u0015==\u001b=A;u<\t8<<ps<\u0003\nK:#ϛ7+<>m:v\f:\u0012z\\\u0002\u001cD<LY;SL8<W~g\u000eC;<\u00062<<(\u0004<a,<p22:f<Sd\u0014<o=<k\u001b=\u001a= #<UIѼ<>=\u001e\\:\u0011W`?<\u0003;f7\u001a<%:*1=|5=k\u0014<\u0018V7=O\u000b\u0013=\u0012=4=\u0014\u0000=\u0004{<#<%<Ю\u001f<;Ȼ(KbD<\u001e\u001cӼ.H¼\u0016p:;\u001f\u0001;\u0010>4;<Fྼ%n<\u0003wl<eB([;ɂ9b뼠\u0005p\\\u0007d;DH\u001b,2U[\\<p3;\u001f<\u0001j)\u001d-;;<<\u001cd\u0018<\u0001^;[g};H\n<r<\u0012\u0007<OE:6\u0014\u0001]5}պYB\u0015=\\)D!l\u0018;o<::]\"#-S\u0001͜-Iy83\u001d_\u00076'u_3+Լ\u001b<BÒ&==;G:x\u0019y{$c\b@\r{\u00001Q\u0004b]\u0005bݼDWԪ\r&_'_\u0000\u0014+0\r8:\r-<1IK <Ƃ<Bco?;~pؼ\u0003\u00070R¹퓃#r<?;1Ax?\u001c\u0005k\u0014/2#<l .;VT<\u0019ן4\u0010w\u0000˻B ~.¼t4~1'м)4<닻G<y\u0000;\u001dX<|\u0016<+\u0007OUѺ2ֲ<wd;\f=(<# ;o\u0013=\r=d_M0^\u0017C\u0015<6jn<;\u000b\u0016hCa\u001e5p<*\f~&5<^D̼zcӯ\r,<v\u000e<K<J;\u0000'2<U刼#;RŻt\u0001p\u0004Gz(W<<[<5<<fN;ۻ\u000b7<{x\u0005k\u001cdC17ꚼ#u\u001e\u001a=ֲq\f}<X􌻲F3f;,<ŏ\u0010vἄ9Fp)Kn}\u000bq{\u0004Jםۼ2+t<L@\u000e׼7;ۼEp,넻3\u000b<<G^4\u0004S\u000bCwF:q\u0006w2,}:\u0011\u0013 py<=k=%@=G_\u0017nۧ\u0010\t\":>QF=u<|sdc<\u000eS<Ț\b0ػ<ؤG\u000fn;\u001a\u001fak]Dp-0<e\u0015<;<;N<͐<$%w/f\u0012IV</E=2P<؇<E1d`p\u0006<i=<Ͻ\"5=K\b\u0019>R:<nc\u001a\u001eҫ;\u0015//BCg~Aq'Q\u001cw\np<\u001f\u0017kbD$\u0013\u0018;5\u001a3;un:`\fjL\u0011˼_<:.W:\":2Y\u0004>W=[3>\u0000}s=V+\u001d_=b_=<*͡#=g7|\r=Eͼ<?\u0004dTҼxҧ52;{J\u001cpz\n\u001c.2=׼eq`;a\ra.!RLe;\fmμb\u001d<5k\u0014=\bu=q~=\u001c|;_:\u0001=)<\"іm\r=\u0012\fCg<p*G=VI\u0015<eE\u0011E\u001c$\u0019:M~=釻ȹz:)P<Ul\u000e<C=v=3݃p<'WCk)]<^EƼ\u0014\u0017=Fl뻪&<?;4b=0F<D?5=X4~#2ÝCod)!\u0013ӻe;]\u001by;/\u0006<c\u0001\u000b(^5\"厽\u0010\u0018<9\t=\u0003a;/c;\b-;??<HX$=5#=;\u0002&<:c<>\u000b<AV=\b]y<D,\f%0=F=\u0016y\bͥ\u001b\u0000;\u0019ʽUx\f\u001c[hF<TSv@r<\u000b<#D;g\u0001=o<\u0019=\u0012\f=IB<8/\t= e\u001a;\"\u001b=\u001d= 1=\u0016n<\bz\u0018<UEP<<<Sg<\n=)-=~BK=8<<~;jʏ<\\a/o-ƽݯ\t̽\u001a\u0016o<\u0002`<0\u0010<.S5D]<Q<h弯1>%0;w\u0007\u0012dV;#\fwA\baۼ\u0017\u0013S<E<Q\u0006.=u tȹA\u001f\u0007]96T\f<2\n\u0014\u0005:˼\u00146n\u0012\u001b\u0006=;\u0010]!'<<\u0013<s\u0003u:\u000b<4<\u0007<sZ<]<+\f<\u0006<=)<\u0003<*<v8=p}<˦\u0000\u0013qTY\u0011G\r'\"䮉A`76妽y\u0012ow\u0006p\u0002O߂<ctseD=-!=G<\u0010P<ae5<gG=0\u000f=cR=\u0006=\f<<U(\u0017\\<\t;댜<:?3\rA<\u00009<\f<|<ъ<gʋ;<(\u0004<<E3\u0014\u0011;\u000bq<b.<@\u001e=;\b=a%!=?=\u0014w~<<ɏ?4\"G\n8:ۃ\u0015+\u000fOߺF$=\u0001\u0014G\u0012߻&߼\u00154GTsDi31R\r=\u0004\u0007<\b=;-4<\u00182\n+=б;<_=2<\r=;~<[L\u0006\"5n9<6OǛ<[-=(C=X)-\u0015%v.<C<lSU;&z#|\u000bS?tp\t\u0017\u0006C=\u0005Ήk;#;3\u0003I \"YN\u0011=\nD\u0001ꃐ#\u0018ar+V\u000b:qI\u001a<6跼\u001c\u0006\u0011ټҤhv8\u0005\njսL\u0002o<;<1\u0013\u001c=a&j\u0006\u0004ûroV0XZ2c\nf<a\u0006=?:<\u0002\u001b<\\\u0007ǹ\fc⽎tL`\u0005ˤ:\u0018J&<\u001eE;Z'P\u001e_R-뼗3v\u0017<g\u001c~\u0001ǒ4<iB=3= =_]=Z\u0002?=#`_<%YL=z<^U;$<déGp&:!\u0010|/ȼ6<k<<\u0010û߈\u0019=2\u0006\\\u0016B\u0000)d!5A\u0011\u0001=@p#μ!!L\u001c<$>=5[JrZ3u4<\u0005TU}0Ӽt\u0000Sּ\t<\f\u0004M.\u0019S\u0015\n|k1c\r-\b_m\buQ$K<)\u0006=dG<<\u0011\u000e<@2a#I&'\u0001U<q\rnѻM:7ͼv\n\r޿p=7\u001c\u0012tFIg.:6@H[۹\u00056\u0012r\u0012Fּ+ˈ\u000e\u0005v+99\u001c˪\u0014<<k.<1<'\u0010=\u001a<+Ľٍ\tmnU^:):=׏\u0016\u0016G\u0014;F\u001e<\r=2V8=\u0015=A0hp;L<\u0000|<\u0011Ҽ\u0007P\n<\\wZ<sH=\u0010A\u000f=<\u0006K<F\u0001O+\u000el=9\u0015}=b<L<i>v( =\n<̤;\u0018=OIֻ2T/0\u001cļ;\u0015%7En\u0017 =HL&\u0019+'\u0013%c<<p.LX\u0000\u0007;go<\\;D<\u001c\u0006=̮B=q\u0018<\n\u0012U=R\f=Ț=\n>\u001d\u0010!;]+wfH\t'\u0012\u0016\u001fGۻ;*)=GJ\u0005<\u001e<_<Ļ*<\t<#)я;U\u0002Q\u001fyN<ACC\r>HRZ;\u000b@%\u0001T\t=Q<hW<\u00076\u000e;.\u000e\nJ#m\u0015<\u001f=k=;\u000b׻C<\u0016.=\",8k'\u0010C\u0006s[А;)~;\u001a7sj+\u0014\u001a<;\u001e%O=\u0017=<3;\u001f\u0002HBG\u0015]rh\u0011<,:\u0013D;:\t<`!=L\u001aj<lǐa\u00118v4=\u001f0$<L=y<Bd\u0012=E:\u0012x<ayt==sa=pP==H=\u0015=7=\u000b\u001bj7<<ǡR<16\u0004\u0016<y=o=\u001d=Nb=_缻ӯ<*\u000e\u000f<\u0017'%j\u0006\u001b\u0007@ۼo\"/2\u000e<#=\u0010<\u0003\u001c*+\u0012}\u000e=1<X\u0010<h\u0000(}vί;Mh\u0001\u001d=j;XKZ\u0005,=\u0006<\u0002<\u0001$!=Oм\";\tm\u0012\u0013K<z<9v;\"c=dS)=\u0015)=2V<S=\u0019$<>\u0012<.<w;<A\u0004=T`<Uc̻,Z<<MJ<Lc=1=5p=|w=bD<r\"=;\tg\u0014K3\n}4\u00170<RIy:\t|B;<\u001fEiWż\bo\u001f@)O+<Ƽhs<$/=Zf\u001ej\u0015]\u0013M$-;\u000f.=k\n\u0002=\u0002%<!<;<:矽G׉:;\u001d=s=)L=g=?\u0005(\u0016MS:#@?镽lGA̽yV\"'\n\u0002;\u0001)ʻ\u001a\u001e\"M;cx<h_<?y<N\u0017=;0;bje}}>:oh=U\u001c=D=G=,=\u0010\u0003=xX<:9\u0002ĺ`\u000b=:\u0005=\u0007<UɎ=f=<B\u0011\u0012=U+=\"9<#\u001a;\u001c. =\u0006<\u0010\t</C<D<޺<D\u0015=Q=iw=\u0003BK=/<d=/.=MQ='7=I=\u0015̻)=y<\b\bfjXA_LG*/7,7\u0005\u0004\u0019:Br\u0005D_<_TOr<'Y<nռẖ%ؼFCbϼt;v\u0000A!\u0001<&Ѥ<\u000f\u0016m\u0001Iw;:\u0017;\f\u0014;\u0010\u00051=g-\u0005=\u0007_3;\n]\f=\u0006X2<D-<%g\t=\tܐ\u0005g<\u0005=<<)<t>\b\u0013\u0003{=\u001d\"%=p];3\u000e=g%;450\u0005y\u0018_<uۼQU]՛\u00175Vec};iJ\u000f<ڻ^߼P\u0003;\u001b\u001a\nkn\u0013<sD\u0016\u0005\u0015Ʌ\u001di8»\u001f=Ȟ@\u00075tƽt\u001a\u0012<V)(v<\u000e\u0006sI+'ύ9zX\b\u001f\u0011\u00009\r\u0018g|[ļ]\u0017#\u0015]Q\u001el\u0006\u00174q;p\r\u001fa,*@Y$A@;/;;f)\u0014\f\u00050ȹ<!J\tٙy\u0006x\u0011=%=z\u0002<Bm%SMIyJW]XGdZ;\u001b\b)e\u0011g\u0013<\u0002|\u0004w<Ҽ\u0015ڀX\b\u001e'\u0000$z\u001c;\u001c1\u0000Kzg79a^ɼ\u0000\f:̿<0m\u001f;J4<<[=]C<\u001aZZ<&{M<H؋\u001cԃ\"P|=iUR+sOд\u0017%Ҽ;\try])<mrO\u0000:2:;(T\r\u0007=2\u0010=0~bTPһU;\u001aa=<\u0013\u0001n<\u0019k\bL#Mn<!<\\&;~\u000e\u0007\u001cT~c9Mf\u0004<;!ü\u0006\n:@X:\rpl=ّ<b)\u0012e\nߞ\u0011\u0003]\u0005\u0005lsF<~RЛ\u0007^\u0011^a<~\n#<D;X\u001eͼ]<j;D<d=u\u001c==<\u0000<t\f^伻m8;\u0004@<g7=B<-ͻh=\t<\b\u001c=&-\f<Ƽһx\"\u0019W<=\u0019<\u0004\u001e<\u0014'F\r=T=E=FR\u0000=:!=8f=~#c=\u0013*S\b\b\u0010\u0001B+septimbre_amt.note_branch.early_conv.1.biasJ ZF!?2?\tO?&KK?ߘ>\u0003@wã?*d\b\u0010\b\b\b\u0005\b\u0005\u0010\u0001B*septimbre_amt.note_branch.neck.conv.weightJdO\u000b\u0011>3\u0003C=ܼ=nl<b\t>\u0019\u001e=\u001d>{G>\f\u0005\u001a=\u0003>)o>Z\u001f>\u0013b=<>c<D>b3=mﱽ\u0010^ԽN=7\t\u0005\f\u001b=n\t\r=\u0011a}=(\u000e=\u000eӵ=өܺ\u0001sp<k<s8<c=㛽XopҼ<;-=>ĳ==D\"<\u000e<V*=E!غ`4\u0012;(=\n>8=H<\u001b{\u0003'=\u0013\t=gַ=\u0002\u0018pU;<'=>\u0011>NJ,Z=`A\b=A\u0004<d\n~=>\n=n\u001a/*=ͨDS\u0004 9WYR\u0019\u0000<vF\u0000spW\t=>=\u0004P<̊j<F*|4=Nj=Ⱥ|E\u0005iĽ[\u0019=a\u0012ѐ/<6Ju4Ž<\u000f\u001dzϹ\u0017<|z=,;`<G^L=J&Z`=d=S=<\u0004=\u001b>oV5>z$>*=s6l<<)T20j\u000e}\u0016ŽPD<<xe`'\u001a=*z\u0005Ck<x=\u0004\u0019\u0003>糼\u001bq=\u0010q<$\b==\u001daObA<;\u0002)=-U\u0004>=V˽ <\u001d<)8\\k?=E=p,#<\u0012&=Iǃ\u0011= \t\u0014sʽt:ݦ׽\u0013Y={==_u;}=\f>G;JKL`=1\u0015\f=Rq0<Id:,=CO\u0000s/=5=\\kнP&;0&z=A\u001eA-=R;<\f<\"3>J\u0017\u000f2<Jbfuཻ4\u001d&\u0007=\r\n>\u0000>(e<\u0012*:zn:Vc\u001azi=r=\u0005քB\u001eF6>륮\u0002ȝ=0\nG>\u001c)>';<3\u000bNʻ(+svR9䇦m\u0015=>\u001d?NR1<_<=\u0005\u0017l 6'=N6<b(\u0010.<g::&>Wp0\u0004>i-=k*<^=\u001ek=\"(Qս=\u001b\u0002=\b\u0018>IZ&9J9&<\u0019ҽGV\n\nl <!H\u001d\u0004t\u0012-@<=\u0002##>\u001a=}{*X<\u0010<@\u0011\u0019;g=\u001b=y_\u0000\u0001>ؔC===R>=\u0001\\=i=A52\u0015<6Ӽ|猽k\u001b=\"J\u0010\u0018 =~<սӽ_&)`=J[=ϋ\b;\u001b8-<ߪS\u0010!=\u000e\r=P=\u0016=\u001a=}f<רYս-=H:>s==M\u0007r<9=\f>?=k2/K`L\u0000|#\\w\u000fS=\u0013:=\bq=\u0011\u0019zP=\u0003\"&9ކ;¢\u0007> >2<\u0011<\u0002k<Q4\u000b]S+\f<\u0014\u000eHїr}<s3-Vr=E9=E;Km3=a;P\nlmZ\u0000\u001aN>c/>'SJ=\"]=\u0006ՁR\u0006^B! SXIf;⾍!g=<Z;=,=%E\u0007=}\t3\u0011)=}>v=>=\u0006^=_}=\u0005S<@=ߔ7$\u0017Z=mm=!ʎ=\u001f=~<FO{=U\u000b=\u0001<WJ=X=Ps=\u0013޹ʽ Uj\u0016a<\u0000;=p\u0001'\u0012<x=\u0019\n\\Ò=Tu\u0004T\u000eF=2\u000b=,b۽\u0005臾:=&z{O棾\u0017\u0007<%Vg;N1\u001dx\u000b|k<I=e'<źNG= |ӽ2'Wl=׃\n=<vD/:\u0006X\u0000\u0006 R=\n=*o<)S6=ŕ<ĭ<<\u0003=Ra<fR=h>s'\u001e=\u0001*5=;<\u0001N\u001c>\u001cs5>=^;\u001fF۽O\u001c>\u0010-HG\"ǓѼA\u0017@>\u0018,H]v\t\u001a<O\u000f=\u0015AMR+=\u0011\u0013n<\u00160\u0002=\u0014'=\u001b\u0018\u0019<qԻ?v'-2<ә=i\u0010<\r\u0018\u0019r(;q0\u0000Q=$\n='d\u0000<\u0013i=>}gb<\u0007B=Z<K=e<\t_\u000e>HY[oһr=wp=l?=R*~C<8=\u0001\\=˼Ҽ܊\t<xBBӨ\u0013\u001f<\u0016<\u0004=/==}\t\u0018\u000b툺=\u0002,EҼ\bɽTB=v;F\u0003\u0016J@Z=\u0014Z\u001f%%z=sC=p5U=\u0006`\u00012m=\"=ev6\fK=M=yQ4ƽ<\u00188<U\u0013h\u0003XmԻXC=B\t==ռn\r<~_=l<X\b>\u000bg=B;,G$T]<$<\nJ=\u0013սʽ\b\rT`H/\u0001К)%`N\"]H\u0002GtBὉ0<?]Äγx3[<>ڽ=׽?Io\b\u0014C?4\",<Q\u0002D=f\u0006ȯ;c:܁<\u0005\tI'\n<AٽZ)=`( =\u0013\u0016\u001b.F.mZ<V<ZXi=\u0002fRG<1Һ\u000b>Sj5={o*<t;^p;!v=\u001aN=P\u001b.\u0004CN]=GGQ\b\\=,l<\u000f~\u0006;\u0015=K+;\u0004\u0010k=(һ=\u0017D=Ɣ=9\r<\fc=\u0002=\u0002΂=\u001e܅<VI\u00192<<11O<@߼\u001cs\u0001==(绁A<\u0011C\f@<Tz\u001f\u0015=3ܼ(G=y\u0011=\u0001<(NLk;],ȼ\u0017\"=W1B3lK`D-'in\u00193&<O!\u001bΞ\u000e8\u0016=\u000b\u0007̼<\u0002쓽ܪ\u0015@Cg>}u\u000f;\".wJں\\.78e~<uX=aӼ-J,;\u001ay<><)ﺔc;\u0001#\u0012;wsGX=g\u0012=qnn^8:\u001d=-\u0004NҼ\r\u0002::S\u0018*\u001d._\u0017\u0005=]\u001al<݊\u0004=\t;^\u001c<q<g#ow!-\":3<_u=I\u001aXE=\r\u0001<`ʜbf<z=лC\u0012\u0000X<ԼU[\u001e콵\u001djz<!=\u0010yؼ0<\u001a[YpX>c(4=8\u001a=McE=\u0014N Nh=J<Y\"=(<\f\u001d缨8@FS1=NF!=;\u0018=q#<f\u001dμqy('F=\u001d߼\u0003F\u0004=Y+q<č<\u0007#=MJi=\u001d=\n=o\u001d\u0002><%=@\u000e>\\*\u0007[]=<JU\u0018=ܯWt\u0002=:<ݗ=.\"\u0019=,?\u000e<4I=$A< sb)<\u001aA=u\u0000=d\\<~\u000e=2?}@2jca<A<^M\u0017\t\u0019\u0001\u0005\r=\u0014>B\nv\u0002@2=<ے8><\u0017\u00152\u0015;eP=fŽ=<\u000b=\u001b\u0005׶{v<\u0002)\u0019GK\u000fS<Zʽ4׵=\u0015\u001f4=<\u001c>2~缦>=@9m\"W!=H\u0017\u0013mLR&=\bM\u0002=}\u001e>&C\f\bt6z_<C=\u0003>2<=\u0000c;Wu=1e1<s\bg=#û\u000eT=\u0019\u0018ɽ(QM\u0011yL΋\u0010ŋ=Q<!pC=\u0012e2#>\f\u001c= \u0004>\f=\"=k=y=E!F\u0003[=3=>=d\u0012>p\u0015/=q\u0011P;\u0017ԑ:4==T7\\=a=09C\u0012s=PY\"<cX\"=\b;H?n==X\u001bsŖr;= \f\f<=yr'g=*f_H=x\u001f=uN=:2<վ=\u0018=~1=;\u001a\u000b>\u0018\u0004>El\u000f\u0014B=]!<K|=d\"q;սR鶼t+ש=*\n\u0012==xҽ,M%o=Qm\u001fW=\u0012ŗ=9'\"\u0018_!ǽb\u0003\u0019Oǽ\u00175\u0003R\rbg=c4<\u001b\u0001<\f=G=ec=μV\u001e<Py߉\u0011\u0007=б\u0011;@<\u001cp;<N8m4K=/\u0014k\u0000\u001e=ap ؽٽZR\u0018=ν\u0011#Z\u001b<T\u0005=#_᳼v8\\HHP\n>h\rX_<P=j=l\u0007T\u0014<Ӽs\u0000=Ь#\u0012=85{*|𞽓zl==\u00198\u001e\u0016:ּa\u0017%\u001b{/Pĳ]sC<b6^y\u00026<\u0017<^\b<C]=䐼Mva黴ga=ӻ;S%<2<Fùۙ<鯽Wܽ^\u0012o&=app\u000e\b=E\u000evk=Ì\u0016<q_*;*w<\u0002ݽ.\f::\u001871<,:\r=ظ;+W4>7j:Σ&wR]绤=\u0017=E=5$q3s\ts<W<\\{<\u0012\u0011\b<-_#I=Ҳ1zw\u0006Ps\u000flD/<\u0006\t<}y̽n\u0017Ƚs<L̢=d½}5̅0g?-s$'򼏼@5QGT\u0007=F=@:\u001d=*\u0005Du\f=ӼiM\u0005=<~\u0014=B4m%\t<́=wqE)=)Nϼ8xx=Bf<y&\u001e\u001cWM<\u0005\u0018<}8\u0007T,7; ؽXpTνVv㸽~\u0012*Sk\u001cn½;\u00053#½\u0012,Xg=\u001fH(=°ܼE$!m\u0014=!f<M#<Z=[\u0016S\u0017Of\u0002<vM|\u001a<\nq\u0011=<q(̟ \b=Xh\u001d7;'E<\b(2\u001a\u0017;(={1\u0010=\u0000p\u0014 ϔ;L\u0019\u0010>4:\u000b]Q\u0000>=A=\u001a0-PB0<\u0018=\u0017i=,=u\u0003\u0015,<SDW=:%>?<ww\u000e><i=n\r>;KM>9r=t\u0002>a=\u0006=/:=XS\u001b=5<\u001auVƽb\u0007;\u0013<\t\u0018ܓo)G#Ք2\u000b\u0016<\u0005K\u001c\u0000!qy\u0015/,ҽmʇ\u001a\u0015u6I9\bI\u000b*Ur=ɚsh<\u0005n<\t[==\u0002սQ<aیd=SĻ\u0003)ʽ0@ս?\u0017\u0006\tDmZC\u0012p7xAcj\"ʽ\\\r^Zg,\t>e[6><\u001cR<\u001d;2ӝ\u0006>&505\u000b4\u0007S\u001e:4=+y\u0002Z=\u0016\u001c\u0011=\u0002\u0002=xq4P<ۇc\r< Z\fNw=>B<{=ͮ:=C\u0019q\u001c><=>f\\<ȡ%N\u0019[Z<\u001eE<z<\u0011:F\r_%iy\u0007=l[<\u0014\u000e\u000e=^<AhE>ؤ넒{=ܯ\u000b<h={O\u001cU<\u001f(=3*N\u0007ܽ-=p\r=e\u0018t\u0011)c\u0011\u001d(d\u000b'e<\u0016\u000fx&\u0019sv»`<w\u0013=\u0011>M=D=X>\u0014=tkM<j=\u0007=Ky<\u001d2j\u0010ʼ50@T:R\u0014=Ҍy|^Ļ\u000e=u^=;q\n=$m=\u0015\u001dmx=&\u000f=Bu>׻)@Q_R6\u0000\u0002=$I=}\u0006a\u0006M\"!=w(>,MeԜ<Ҽ*+-R=7d>\u00120\u0014g\u0018'<g%\u0006>a!̻ő&Q<f=\re>\u0003c\nw\u0019^\u0011\u0006\u0015lb&<\n>=H=91Ysu'F=N\u0010>\u0016܏>\u001b+>[̽\u0017=2=<\u001c=(=\u0014OV޾=5=gE\u001d\f>C1:km<oۼ\u000eGZ\u0011\t>\u001f\u0011y{\u0011\\=n*>S=Dן=\u0017&=\u0004>.U=aT<whc:a\t\u000b=y=<B\u0005ҠμKް=u>\u000b=$C>`^䒽@\u0003=\u0005;;>>\u0010ѽOo\u000b; tf\u0019>nB>\u001c~\u0002\u000bѼ$>)\n|G=\u000eνf\u0014\u001f\u0012=t@`\u001e\u001fXb\u000f_^K<\t\u0017=\u0012\u0000NkI\u001fM</;)蔼>ɽ\u0018\u001dd޼A׼+j\u0015>L'=-\\>}iH\u0018S!\u0006o\u000b\u0011=F=>E༻<_=Wq|D<\u0004~\u0010Mw~ǽv\u0017=5\u000b\u0018/B=\rB=f\u0014=̽ҽ\u0007\u0000\r\u001c$e\u001eRi=-=^\u0011BVO!\b>\n<*s\u000fpj=\u0013>3>\t1B>N>n\u0010<ā~=Z=9>\u001b'\u0001G>W\u0007=L~ܼ\n=)=c\u001d`\u001f0==[\u000fr!0\u001f\u001f>þN4\u000f>@u}=<H=Ѹ[_O=E=)\u0017ͽ\"9=e)ڊT.Kq\u0006bp=]A\u0007EJꄽ.A<˹<\u001a/\u000e<6=;U\u001d,ExR$!>L\u0015X\u0015\"=\u000bK=eEx<o9\u0011?gH=\u0017\u0005=Z=eg\u0007b'=,z<s?]K\u0013\u0013\u0013a=a=\u000eiZn-A=7\u0012=\u001fSZc=nP<m={w=\u0014\u001e?\ttܲ\u001c=t4$ 9/<P;}zǂ=4n\u001b<8=\u000b\u0004=jA=q-<\u001d>'ʽи =a_>{\u0004>ׁ$<yKZЄϠO=<꟱=%\u0004j|sne\u0015\u0015=7a\u001a\u000b9>=Q)X=\u000e=`s<k%L\u0015L\u0001\rF76쎞=儺H\u001c_=ֵ\u000bPֽ\u0001=$7<G(\u000bz<`ey[b\u0002h}ýEdB=^=,Jȉ!=\u0003j=n=\u0010\u0015=\ny:=a\r>,='=^=Ԡ\u0006<k{\u001d\u0007=Y\nȼr'=\u0004\u0012E=\u001a={<`0f=絮<IO[<ֽܲ<I\u001dߵo@=\u001c<\u000bRr7\u0012>\n\u000e>ɽԗZ<==^;γ$ըw\u000fZ5=E=X=}2\u001f\u0002=&>:/:\u0010qm=t\u0005l\u0014#.\u001c<a\u000f^=\u001d\u0004\bA6{^:ݥ*=0>Nf=\u000e\u001e=Xo\u001a{=+L4\u0015ok\u0012=&\u0006Z=\u0001l=0P\t=8Ë_߼CK\f\u0015<S>\u001c>ޖ\u0002uD/<\u0001\u0014F\u001aX2L>\\\u0002>\u001e>6\u001e]\u0018pjb=4\u000e*\u0011z==^ne\u0001+b=D2\u0004Jq#<6\u000bߩ,=o=;DWXFF=H;!=\b\u0012=\u0012ƨNw~\u0016=z<&6I\u000f=\u0013*H=(3>.=#=% >$=@ȣfv\u000156\u001fjųʂ>w=\u0006q=\u0011\u001eY=)\u0010\n<rP=<}\u0017\u0005a:=\u0005=\u0004\u000es=:X~==υ\u0011\f\u001f\u0019>ߓa@L=J\u0007\u001a\t=JQM(=䳙`==\">\u0003>}>K=w;Nu\u0018=-*)\u0001S9=cb=\n=\u0011\u0001=Q\u0014\u0011#=\u000b!\u0018>e;K*Ro3_j<\r8\u000f19\u0001<\u0001==p&\u0006O=w=ۻֻ\u0014\b(V>C=Q\u0000>\"Z\u0005>LZ>;\u0010\u001c\u0004>S=8[>͘K2\u0003r:d<\u0014l\f̀\u0017>F=0Ϣ3*k\u001c\f=\u0002\f0<H\u000fk+ռT;b=W'\u000e=khb\u001bG\"H\u0002I#[=,ˡ='Y==]A>_=&~x=#=\\E\u0014)=M=Ӷ=esҽ\u0017M/,6HԽ\u0019q=Е/:\r\u001e\u001f\u0017+H>Q\u001d>zܽ=F.\u0005UҼ\u001dc&>:\u0013j\u000eѽ;-\u0015F\u000f>\u0018K>)=\u001a%=cfn9>V\u0000>½Ug>@b\u001e>XL<4=+=,]Va+e\u0015=4>\u0010o<\u001b\u0001s0ďE\u0002=49I\u001d}ѽ*2\u0018<<\u0007\u000ek\u0003m<И'<\u0006=P={=*\u000e\u0010>\u0014򺷡u40k7v6{W=`۲\u001bܽI=ҽƁq\u0005 =v<\b\u0014=\u0019\u0006\t\u000e<ݬ\u0018|j=;\u0003o:uY\f\u0000>J\t=x\u0007^g;!ʸӽ]&nNJ\u0015\\D\u0011>Z]齲\u00055\"=|d\u0017>v\u0010=1|\u000e\b>e42\r;$=a\u000eᆣ\u000e=S(ˤ>\u001ePU>\u001aP<ۿ=\u000fG;N\u0007l_-=~\u0018>;a5\\s\u0014<6=\u000b>\u0001\u0014=ϧ#\u001aw\u001d~)=1\u0016м9=Z&I='<o<YuR>m\u001d(>K]\\>g^<0\u001d>\u0013E\u0015<Ʌ;\u0017#\rV7\n\u0015k=\"W\u0016>?\u0013\u001d\u0006u>@{=wF#<Ͻ=+\rp\u0018GL\u000e>\u0001p5\u0004w=y[\u0018>Ƞf;?<\u001d\u0000\u0010?n<H#<=\u0016=5lII\\z'[=ё_ᐾrk\u0019A\u000b=棼VÄ^=\u001e>|<\u0002W=&,ݼE\b'O\u0001>\u0018$>5gw>\u001f#>>y=4\u0000R>lV>W>\u0001#=W\u001e\u0001J\u0016=eƽ'\u000fy,=z#>2|=!>_>q#:m罰:6=ӼC\u0013A@ǲ;Y)BGL>ES=ج@lj2=\"\u0011=\u0016\n\f>>gB\u0016 \u0013n>E=>\r\u001a4N=I=♭<_=9'z= =h{f>x=>+>I\u00110_O>H\u001d=𳓽ہ=j\u001d;>9ʽ\u001a<Ğ2<e|=!>9Ng<u\u00104=N>\u0006o=\u0006V=OJ\u001e>&ӽ`^\u0018ftg\u001b|=ɝU>\u0012%=\"6r=\u0017\u001aD2|=\u001c</4Yӽ%\fM>Ah;<E\u0004\u0019=wl=Dӽs+\u00042[d=_h<[|06\u0003\u000eQ3>&//IkZ\u0019>=J\u0015bD\u001d=qK\u001e>cho\u001b=җJ=\u0002,m\u001f|;>\u0011\u0019WؽM};3p\u0018~=\u0019ݽHh<m\u0007\fUs۪MKn2Z=u\u0000>\u001cΕ=HpqR=H=e`>=%=ۜ>0<>tMU:<r\u0014>\u001a\u0001\u0010Wm=+h;\r=\u0019>3={2m/\t>zd\u001e=D)>\u0005[>(TA\r>N-꺛H=9d\u0014qa=\b߽bϕ=5s\u0017=[Ž\f\u0013\u0001\u0014\u001d&̸H\u0000\"=N\\\u0014=N;H\nɽ\u001f=\t\u0013y{ȼ4=*>܂$\u0002 X#>7\u0001:;B=G׼\u0018=#k\u0007:\u0014l<S{<8l\"U=\u0003>\u0005>q=\"|;f沽GC0M\n=_E =SB=l0>/}񎙽(&>kg==q=\u0017>Yfa<N/=H\u0015O;<-,<\u0004ν>K>̰>\u0001]1\u0014>nL\u0010㨤\u00021>7\u0010>)\"?:\u0018꾪U2>>X\u0015(=\b\u000b$:h:#v\u001c/pg>\"_<^>\u0015;0qqIyo>Q7\u0016<K\u001aP=lһ=3+>l\u0002MAP?\u0015>;<\u001f1=F)\u0016\u0002>\u000e=\u001eV\u0011sd5+Îڽ#>i*33f==Nn\u0010=Eq=>FO$\u0017;\u0019>\u000f =\u0012>\u001e?U\u0014QW\u001au>'>u5'!b==j?>\u0018\u001f>>\u0010\u001f4>y6NK=0^/k`<\u0000x$j>Y\u0007AYԽ\u0017<B`3?\u0005*=hݾs\u0005׻\u001df>\bEt\u000bΕӽ\u0014 >\">$=>k>ӕvɑ;L>lѾ|e=ü\u0002>`v<\u000e\u0004\u0007x>'֔N=\u0011\u001eS>\" SJd>\u0012<f>ٱΚYj<\u001d$kq墽\u0014>l*<\u001c\u0017Ƒ\u0005>\u0002R\"\u0014]b\bUP\u0016=F۽FzD={S\">N >\u0015\u0003/`Q->==\u001dy@=\u0000;\u001b> `=\r+=jC\u001b=\u0012\u001c\u001d>>D=:>EX\u0014a`=\t/[%sj0>\u0016`>\u0006#bU21h~>L1\u0013?>\"=\u0005e0>w۽޾RN>>3\u000f=ž9Ű>#Qe>ǽ\bmC㽾!u=G)\n\">dYHzWUk;v>\u001cS>!J>-;c>=;;=;%>\u001c=;QvPm\",>瓡<\u0005[=cl\u0003WĽ\u0013\u0017Y&,=Y'm7ޟ\r7i\u001d=,\n~Z)i;vmֲ=5k>oJ<e\u0016t}=,i׽퀉UU\u0010=L\u0005G\u001c>=V\t뽬=iv4oW=;t99\u000e\u000e=]Ttf߽f;vG=rt<ŽڳI\r=(=c=/\u0003Q>4@Xvս{\u001al\u0017<Pz\u0000K!\u0002z=N=\u0003\u0007<\u000f+=I1Jؽ\u0007\\\u0006Z\u000bcѽ{< \u000fv=\u001c>Z\n\u0016+א>\u0007!==r=Pl=M\u0007=e==HDn<\u0005:IGy;<\b\u0014<k=V\\<\"N\u001d7\u0007>c3&>8W❠=|H\r>\u000b]\u0005=\nT>\u0014>wD6<g!=>O\u0007<=;HD=\u000eH=~\fΤJV?|\u0001<Ɇ<\u0011Daa8Gngq>i<7<㒐6X.>zY>g;O0?;)D߽}\u00041n=//!U%>/\u001c>3rx[ZͶ<Rٽ\f\r\u0001Q\u0015s0U\u00013W@q=\u0007b\u0014ļ1<=r=W\tռF=gLW=F≮=3W=N\"<<eE=ID<<ߺ<:;xfټls\f>F<ڬ=\u0011\\\u0006Z]< \u0003=o\u0016̽Si\u001dU<\u0005':>ػ\u000b\u0012=ҽ\u0004c\u001auљz<eŽbË\u0015oRk\u001c=@AMfo< =?\u0011\u0019\u000f\u0002.ߺx䒽\t`\u001a/X\u0007=\r)\u0017J`Q\u0002=\u0016\u0001]\u001be8<a\"<8o:<K09\u001e^fGL\n=z\u00150<!\u0018\u001cV$#<N\u0000=嘽es;:׻P<t;S\u0017<'\u001cN@6<\u001f=\u001f<\b_\u001b<HH\u0007=1=\u0004V=,K%;ǳR\tf\u0011˼\u0000\r;N#Iam$<\u0000<n=\u0015ǽ̐=AS!-$\t=\\\u0001ocqu=K=cԿ<?<1X\nA\"<r]\u000f׳\u0013^=\u001a^=`\f\u0010_<a\u001c\\*\"=tK=3\"\u0002=I;iKK=5\u001as<8<I M)w=\r=y5Ry=9N޺yQ=%=0<\u0013=cX\u001c=o(pΪ=;}=P^)\u0015<=H'=c\u0018=x\u0004>cG蠄;s=I{=\u00126=C9\u0010<\u0004=(\u0011?d=\u001cY;i<8<?9:\u0011&+߽\u0015SV\u0019S;\u001e\u0004\rA%\u000e=A<1===:z=\\缟2ǽ׽6=XQ:=+*=\u001dd&)==\u000f>=7m\"P=\u001e >.o\u0002θ\tJ=A>\"\u0003}\u0005;Y/\bPݼ\u0002\u0004<'=\t<E\u001a=\u0016?kk]V\f|=\u00159\u0006\u0002\u001d;;yZ=x\u0003pP`R=\u0011<\r=R݁\f<y\u0016H=a/=nyD=k.u\u0016O&\u001a.;>\u0013t>\u0010>)\u000f=]\b*\u0000\u0003\u000b(=|F(H>66J=g<?ֈ\u000bq\\h>\u0010=\u001d<Z\u0006]\u001d>K\u000b];T\f>\\>\u0001e<X\u0016\u0000>$\u001b>o.>\u0005E\u000f,\u001dY==$ڼŀ=6<G60\u0012pK`\u0001\u001b>.\"Y9=\u000e\u0019>\u001c5=E=+f G\u0013\u000b\u001b'V=\u0005;\u0018h]\u0019?>C\u0000g\u000f>\u0003\u0015H\u0006^߸=Y~V6s~\u0013{1=> ս<q&;<0n0r=97W=e^$_\u001f=1\u0012C\u0007Y\u0012GW\u001aܼ\u001f=|\u001a{&\u000b˼}\u001d>Q=*\r@\">=nh`>oŽ\u0006A=t\u0001\u0003< o%uOTru:W\u0005\u0003;ul8mϕ\u0000=H̓=7(=Ml=(d=\u001bB\u001eLX<z$=½P=\u0006M\u0012\n< &O{\u001e<p\u0017*=_>g>-<\u0019=?iR=}G*1I=\u0005\u001e\\% .=\u0005в<R;|\">.\u000e*=\u001cOE=z8a\u0013Ў=\u0012۽M$ӽ,y-\u0005=\\;͗teUнW=8\u00048\u0011=1K=\u001dB5=28>1=q;\u001eHϬ<槕=\u0004==es=a\u001f>ip8=\u0012YV=;\b=t:M֢PG<?=\rU\"1$E\u001bc?޼\u0017<ǯ^=g\u001a\u000e\"9:k?>M\u0005>6Z>U=\u0015H<Qɼ]7><;*\f\b\u0001\b\u0010\b\u0005\b\u0005\u0010\u0001B*septimbre_amt.note_branch.conv_yn.0.weightJ\frȽn0<\f}</JPT\u001f` 5򖾹\u001f6w\u0019\f&>-V<\u0002:U<\u000eb=\n3\u0001RuF`伏<V<\r;LA\u001f*˼\nݥdT:XiNa*.I\u0004=;Q'\u0001o\u0016;lֽ\f\u0006>3J\t=*=x\u0006V=6=\u0016e=:в<:*\n\r=+\u0011z\u001d\u001f<E\u0002\u001b8Ѻ\u0005o<ݽjMV-I%:*:\"g,\u0006oV#\u0003mZ|\u001c=\u0010:HvҼn;F<HJ<l_cJ/\u0011g\u001aҼ`P^<҂׽\u00114<5\u0019e\fNl\u0010i\r\u0011/ǽ\u0017)߅wCy~\u0012G\trG[\u0011^J9Is\bd˼b\u001e\r\u0017;R]a~\n}) j伧3޽a$V\\Oa;];%Ľ`\u001d+@\u0018rᘧ\u0010\u001dku;#;삽.\nݽ\nR.vu5`9]&I\u00005D\u0019j+\u00064<;\u001c3YT<<\u00010;\r;u\bmHЙ(ǽ\u001e*5=/mpu<J<3.=, =s5i\u0010=n\u001a#=<% wzh=;\u000b*=HY\u0007=uJ=!==<[<m5;ȼi<\u0014<ul<g,=c\u0013=\u001ec\u000f=\u000f)=@<.G<]</=r%==\"<\u0001=ˑ=\rL!@;\u001cܼcP\u0019\u0003\u0019\u0012X0+)Յ\u00149[\u0000<[I$=\u001f\u0010M켟CQp½iѽFxM8*۽PG~j]:H</g\u000f=<W\u0013F\u0006<_%`_|z\u0007\rٰ9= mY</<t=j=G-䂽%4tc\u0006\u001c\u0011\u0011{\u0014\u001f_W'=g!=.٪vBDu;\u0001i;մ:\u0013o\u001eĈ<zcBül\u0013%NTC=*=A\n=l<\t[\u0002H<Kp<8J;$\u0005a^Ie<4<m%\u000e<\\<1!;7F=<\u0011.ru'==\u0015=-#=8<h<3B;;n(\u001aIdu:c\n+7\u001bҽn8M\t;fHJjfE\u0011}[\u0014><f_\n=\u0014*=aa<<;\u0012\u0014ԍ<4;r=`v<7\u0016<o<\\:,P|bj\u000bY<2zqg˨iؼ>#N<`2el47ƭșf\u001e2<\u0015A*c\n=,r=Y<=F=U=\t=`\\⼂f'û/67Y>Q\u0012\u000e\"k==\".mGQy\t6\u0005CZq堽;}?;#;\u0018\u00072Ű\u0004OX\f`\u001dB5\u000faq~<2\te\u000eI<=\u001cE/>\bp=<=H]=U;ʹ\u0010\nŒȽ\u0005,\u0000=&<kLC<=J\u001cj=Պ-\u0000o)\u0010ʺJ<*4\b\u0001\u0010\u0001B(septimbre_amt.note_branch.conv_yn.0.biasJ\u0004TȽ*I\b\u0007\b\u0010\b\u0007\b\u0003\u0010\u0001B.septimbre_amt.note_branch.conv_yo1.conv.weightJI@q<0=1\u000f\u0000><&<~\u0010\u0002>`O<\u000b@\u001d0<\bDA\u0012\n<\u001ft<k<pY\u001b\\<4пe;ZU;Uy===p=&\u0001P=!\u001a>{\u0011\u0000q7<'b>BK;CR-=;\u0001>\u0000jJ0<c=\u0012p3Wj\u0000=&=G<B_=;\u0018^=\u0000>S6h;0\n>f%ռqU>[\u0006vĿV>֛*\rD>\tP\rlA>0\\g=iK\u001e\u0000>W&==\\2B87ѳ>Oqx(ڐ>\u0016\r=n0@4=@><Jν<^\u0003>\bZn=wb>$D\t <0\u001a=\u001c\bP=4\u0003\u001c=s\tD\u0006<<<fLO{\u0004:~<\u0011\u000f=4,>=qZ<е=܅g$\u0007=x\u0001Cg\u0000\f>\u001a\fZ<\u0013\u0018>I<\"\u000f=d\t<N\u0004\u0001e;\u0003i\u000by=l=\fEo=d=\u0012>sv=Q\u0014ϼ>9=p5j\u0019>uh<Rѽl\u0010=\u0003I\u0010>5Q=ڛ=\u0004j$=|Q='\u0001=葷=A\u000b\\4ӟ]&-=N:m\u001aṇe\u001c<zK=\u001f={4?揟=MݼR}<=:Y:D\u001a>\u0013NWI>\u0013\u0014<F>ׇ]<4\u001b=ӻkdR\u0001\t=`Ja\u0012`\tm!=\"<v&!=ldn\t\r>\u00113H=\u0014Q<R9\r=\u0004x<t`=8ֽW\u0001<yB\u0017)\u0018=\fF=;ý=Q\u001f75TS<YM7<BF\u001d)<\u0017:Z==d@9]=\u0007޽|i;>\u0016J=\\׀=3\u0002^=i`\u0005`>pF`=\">.dq7/B3\u001f{\u00114T.\u0002\u0017(B\u001a=n'O\u001d=\u0000>;<Sl!2 =n=nġ:\u0014<$<zT_&+KĻ\bdo{=\u000e\u0018<\u0000\u001bs7EV=\u00020;?]\u0013ɔٱ^=WSC;&`J\u0013'\\<\u000b=\u000e\u001b>&=\b\u001b\n=r<9l=.\u0018\u0013n=oS\f=U=n\u0011\u0014.BݽK=C:>k<=\u0019\t>膽\u001cBUL=&-=D<}(>9sŽ=<=8\u0012]Q<]Y=\"lB\ny\u0003(s'#%4\n<\u0000\u0004\\=\u0003ol\u0019<fY\nz=8%н\u0000<4g<̫=`<cX\u0005S\u000e<\u0019a<5\u0003#@T&[\"=8\u0006>=t>ǵ<>mTI=b=\u0006T<2m=~>=G<Vۼ*6<FEk\u0000=>&<ǘмV\r>`u=;\"=B\f\u000b\"r\t=B޽HR3=o懺.0Z=*Z=>=6M#|r=+㳽\u000f=C`0=}M<>IG=NY>:͖>{5\u001frz<u=VI\r\u0015=V:ޛ{?9=}=E='\b>}-H=*o=1==\u0007M[u=7f<)\u0003ͽˈ\u0003N?ԽP<l=Bѽ\u0015,\u0015O=%=QE$<<<(Ż\u0004m<_'=$z<`;⋶=[MT:s=-MA\u001bU'j ,E=9vx=\u0017Oj\u0001ԞID0<\u0014ݼ1=f=\u001f\u000eսw=\u0000>א=e=d8\u0003</Ͷ쳞;H.\n=że#>\u001fnQ=U\u0001\u0014=s_8`&Q}=)Ż`{'=9\u0017=\u0006_\u001f=\u001d:\n=Z\u00028Y=\u00016̽C=.ě<2>̇Hﺽ)\n\u0001=l\fO`-=G\u000f=5uG߻<x<\u0019Q\u0013;u=soK\u0017>!4:aC=b;׸ɽ\u0013=\t\u0014c\u0017֏<}\u000e<\u0018=\t=v+\u0014\u0016'<'Y\u0004=\u0004>\u001f<E܌|=<\t\u001f==6B\u0000>P\u0012>\f=;9=\u0019\u0007\u0011fe\u0001A;6|%\u0012;sX}>\u00124\f\u0006<\rz\u0004I^,;rCʽj\u0006K9<9ĽI\u0017\u0014½\u0012==<\u00023\t>\t9\u000e\r\u001eo=L\u0006X\u0007-=\t}6b<=N20O\t==A\u0013!=c<\u0017<\rD<=f{\u000fbM\u0000<\u0006=Ҡ1;\u0005\u0018;\u0015=X<\u0012\u0013e=\u001d*S\u0015IM\u0003;*\u0002ܚfu<BuT=o4=\u000e\u001b!=!=UZ<;7<p$T1R\t\u001b;^\u000bP'=cڼ\u000bˇ<ս\u0012yhѼq'\f<jJ\u0000\u001d7='\u001bA=\u0001{dh<Rw\u0007Ũ<J<m=<\u0007<Rv\b\u001b=;=:Q1鼇q=B}T==B萉i=(PU1=\u0014<`#<O=\u0018\u0004=\u00051=ԉ\u000bEo(==\u0000\b\u00034C=ޑ<\u00184=*(ｎ\u000bJ7%=\u0018nG1\u0003>\u0015/cj=%\u001e>lw$=py=Z6=?Ƚk+Pi}=q5=r\u0007+1\u0005h<4ʻ\u0016=}\u0001/k=)=\u0017^}=\u001a\u0018'=\u001c=xν\u001d\"3ŽVe\b*J<W\u0015\bڼY.Lϟ\u0019w\u0015>\"=R◽%>I,<?=\r==n\u0005>\r.1=<\fD=\u0001ýb<?k$=(<ҾjϦ=5\u000f=D\u0015\u0017=I\u0004\u000fL\u0006e=\u00123Ty<©P=\u001f=\u0011\u0016y.Y=R=Tr2=xX<@@>mFS=|*<a=\rQXͻϏ<P\"`=f\u0004>w@;u&\u0019ܽI=+\u0003=89ܽ<\u0017a>m6\u0016u(>\n\u0004P=3\u001d>#{=![;\u001d\r~==kF~\u0012Q=RK=bK\u0015>\t:U\u0010Y\u00026cн3\r\u0007\u0014[g3=4F{ս<JIX<i\u001bܽ$ֻ;b\u00199;I\t>/=\u0019\u0000=Ҿ<\t舼Lq\t=y}=\\\u0017\u0010E={'J<R-=<:/Խ!ִ=(K̽\f\bf=+==|p潻mM>Ro1<\u0019ཽ\u0002=oɽ.x=4S4<T\fk'=\fk9ҡ\u001b<\u0007\u000byʼqI\u0012=NNE=.t\u0016½`}<194]L;\nZ=\u0015>N<@N\b=7潏BZ(=8ؽ~\u0003ӽ\r62˽!\n]\n=\u0019?\r:=(=8c>^\u001dknp;ɽ*\\\"GN-߆\u0014<'lwB<\u0010=IM,=~3\u001a彇0=C\u0013\u0002<\u0010=Ivv+9=x\u0014@xPLS#=!\u000f=qr\"Ҽ:\u001d\u0003='\u000f\u000bҊ=^1<=o<]ق=Z<\u001b\u0019=\u001cýu)2=CdvJ=Ay=2\\=d\u0000\u001a(\u0014;㈽\u001a)iϊ\u0018>'l\tѴ&Cc\u0012\b&6,%落NOq3\u0017\b^=\u001f#9yȽ=,\u00046=m-J;\u0017\u000f<>\"Z\u0016/;s7=g\u0013NZu%qXz\r\u000b:\u0014\u001f8=X.=U\u001eP=ʦo='\u001b=;4\u0014\u0003<\u0004x<-\u0002>hb<o1=\"\u000b>\u00170=/3;I\u0006=*6\r\u0010<\u0016=K5\u001aU<KӸ=B'ƽ\rG<C\u001f=4#[w<L=oȽQ=r\tA>~V8=Ѳ=\u0017y;ld%@=aG<ҍ=L0%\u0005ɽ\u0017\u001eX\u001e>=7J\u0006<\u0000>\u0016R);]=Cc=, \u0003=b'L\nq==g_oLSO~<` =\u0011\u0007p=h<u弹\u0011\"\u001bۼ9.<:H\f<9f茼\n<1;<lpa=+DOS=Q=ojAj\b?:t\u001eg W1NK~<Y<\u0011\u0000\\;CՋ&<|'<\u0018k\u00181¼=R=\u000f\u001eXZ\u0014><Q[=\u0015\u000f\b=7ܣ=ż\u0018(#\bl=x`'=\u000eX;'̼iU\t9Ө={=:s\u0013\b;=ǰ\u001cGT=\u0006W=\u0001^=o\u0007~\f\u001e<M\u0019\u0013<$K=\t뛼\u001f\u0010=TSrWd(<<ʝ=\u001aR\u0018%=\u00117>K5:k>;g<\u0000Kr[b߼(\u0013R8<)DhE=|ק\u001fQмlݽ1e9?&bżŴ=T.=i4=Xv>#ޜ<\u0012\u0001<%\u001aI=\u001c\u001bI\u001d<񼮍\u001e\u001a^46;N<#<xt=\u0017>\u001de<\u000bAZ\ntz>^2xܓ=ڇ\u0001X4\u001d=*\u000f\u001fA<Ot<035k\u001f&<.\u0019r\u001b=g^=\u0016\u0019\u0004#=K=}u\u0016Qs߻\u001dO\rj0;\u001d\\65\u0017X<8<\u001e7.;8\u000e>\u0013kٿU=/IR<\u001dq;\u001f񎼥go=\fnp\u0005H\u0004c #R\u000b/Й=\u0010=Us0<BD=:\n=\u0012}\"rnA\u0013:=(=Y;$i+>{<IY簸=(᧽5=rV>R;y=(@>ȼT\u001d<vA%*=^\b\u000e=P;=\u0002\u0011\u0001 [)==c\u0012<a2ֽP\u0019=v\u0015=C\u0010]qe='_Eڽ\u0017\u0011\u001cyZ<F=&NlB\u0014ό)=m1:P=i=\u0014\u0017=fm\u001cJ\u0011=v__G@9\u0019=μܻNc=\n\u001d\u0017=H3:\u001aa`f{\u000e=>\u0017$<\u000b>nѽv7+\u000b> pt\u0001&}^=㭉\u000fQ= \u0006t\u0018=T8g<\u0011V)<x\u0016=\u001a<o\u0013:\u001b<\u0006=R8F<\u001ah*<^@<۬=\u0013?;\u0015`=\u001b><`F\u000f\u0019MfgԼ\u0016=B1\u0015;\u0017\u0016B'g\tC:\u001c\u000fոҸcϤ5<}c\f=u^zÍLҼI\u0012@=\u000e*\u0017L΂m<(\u0000B-3j<<\\񷼬u\u0004E\u0016=f#6\u0000v~<\bq\u0017;\u0016P__㼼@$\t\rY\u001a={\u000bۜ:W<rF::>EM=OHl)99xP=ss-3;6=8*\u0019=3gEuw\u0017;ZB=\u001a鼭t=;F\npj:晽@\u000eg7;ԙɽ\u001b驼ׁ\u0019%-\"r<*=n\u001d`<+\u0010;g\rѫ<P\u0013{\n;_ݼV1\u0005\u0006\u0000=@}09=_<\u001e!3\u0005==\u0012\u001am<GZ=]i4==1<W<{Ͽ\u000f>I@|=h\n=t\u001cF\u0006N\r=\u0016}5-\u0004>I4Z<R=<\u000f=~h=Zq=\u0001\u0016<G\u001a;սIp50H<뎽%z5˽\u001cԵ:=Ѝ\u0012\u0003\u0016<\r\u00182YḜ]E\u0013\u000f\u0016֘;r&=ѵ\u001eG<by#\b\u0013\u0015=p\u0013=\u0005^ʽ+;g\u000f,}`'n:2\u0007jѽ^=PL<(*3\u001d<-ý\t$0=|41IGz\fw\u0003<\r &\u000bнP'[=q)=Y۽<\u001c<BY\u001bVG=U\u0001J.N=/\u000b3=k\"U\u0000ѽнFuB@њ#R\u0018%;\u0002N=u\u000bPJ\f6U=\u000b2^WԽg=%Aȼ\u001c=6\u0003d<zA'_ͼnpk̿}<\u0007=\u0004=\u0015\b;}5=S\\$꭫e޽B=CV\u00179A=8P\"=\u0007\u0017V=}!=r=\u0007=}\u0003=/Io=E\u0001>=0;Dκf=\u0003Dq=0=Wh<<f*\r\u00126=d=UJ<QZ\"zY<\f\u000eR\u000fR󊂽kW?=\u0002<N<iO=\u001f5#=R=M\u0014S}=.O\u001ec~=.\u0000\u0010\u0005=VT༣7t<\u0012;dq\u0003z<\u001b<DJ^W=\\=+\u0004B2K'敕=\u0004<\tg/=\u0006\\<l\f=l<'\u0004=\u001b\u000e<G=ock=w.<Z\u0015\u0017<x㘽#\u0012>νQJ?'>vŃ=\u0004[\u000f>\u0014=@hxʙ=[=c=P\u0014\b>c\u0001<k9\u0019<QI==>\t\u000b4=(_<\u0003Y=©<\u0015=3=\u0004K:'<\u0006cse\u0010=_C=l\u00016<Ք<,$5F<`x[~K=\r\u000ePӻ4;9\u0016=\u001fU|k=\u001ahL\u0002\u0004Ֆ=\u0000y7<J~|\"\u0010;&<\b\u001d<I\u0015=fnĽRv;\u0010Nf\u0007<'\u001f7=<a\u0013;<}4;\u0007\u0013d=\bz\u0017g\n\u000b\u001e>闗MSw7\u0006=m<\u001a\u001f\u0016=W<VB<\u0016CS?n&=\u0001\u0003=Z׼\u0001\u0018\u001c=\u001b8X\u001cwh<uU=a\u0014=\u0003<t=\u0002h0\u00139\u0014=\u0015+==\u001a9<a=\u000f4=剽=ȶ==Py=\\=ͼO+D]\u0006<\"v`\u0010<Yk\u001e\u0010=ۿ\b\u000eS\u0006\u0012<\u0002(=\u0015<\u0015<DG;|\u001c2NT(=Bt⽴\t<o<p@%U;%\ns\u0004\u0011üt\r=\u0011|<==\r\u0016=꾽$=m<t\u000fI;`\u00048=v=\u001b>LX<%]\u0014>{<9W\u0012>\u0000'\fj|]YƻodT\u0003\u0013Q\u0000w0z\u001d>\"v\u000fҼg<M;\u0010<q<5%\u00029oJ=Vog<=R==\u0005\u0004=p=\r'=h=W=0)b\u0016<\"<,<\u001c9<\u0000wwbJnT\u0004=]\u00055>Ǯ\u0011;𤻽\b>j\u0014<8\u001b#{H<\ba\u001c1\u001d>\u0005=#7½\u0012k뽖~Xһ:)=p~='\u0010=\u0006>\u000f=\r\u0005 >JK<=\u001e+).Q\u001cp>o=\u0006\u000f7y=\u001f3=5n=x+<dψf=E5\u001fq\u0018=-଼|\u0013u^=P'=-%8q)0\f~|1:\u000bc)\u001d\u0018\u0014rhS<h*Y:\u0010mC=W3K=@f)YP=<D\u0013۬=\u0013<G>>q\u0003;]K;EV}݆GMۘA(༨\r\u0002\u000e>}<'N$EL9⽲\u0018(H󱽼O<pt)<D\u0018\u0004<kb=}Re=rؼ\u0003>be\\YE=\u0014\u00155V@;2oV\u0003<g4=ZB;\t;\u001f\u0000=`J=\u0010\u001c\u0012=w=l\u001e=^=\u0015d-.=\u0015\u0006=\u0006>\\Dz#<齑<\u0005B<:;=Co\u001e9]=\u0002%4·\u001a,lwζ8sI\u0014/|;\u000e7=:．YC=<ļZ@１P<vQ}̽˨<ˈѻ8<y\u0011%ዻd\u0003\u000f=0wہ<r*<VN=B<T\u0001 \u000e<\u001b;z\u0016;.\f=\u001f<O\u0006V=?$<\u0015\u00159T\"5+\\=\u0001\u00140<H<<a3<\u0015<\u0005Y=RL\u001a⼂\u0004K<\u0006[29=Ҫ;Ǥ6'=\u001cUCE==W[J\u001f==@=ʅX\u0011>-<*CGS35Pۼ\u001d\u0010/\u0012>r=n<`=\u001942=`\f=p\u0010<e\u000ea\n>\u0015J\u0013wt=]ic\u0002=*=\u000e.u=DsΫ\u0012>\u001e=>\r\"Ep-JQ{ֻ\"\u0004l\u0014:%nܾ\u001f-8뮼>\u0019_8=\u0005~\u0017=r'\u00078:?<g镽ӏ=sl<\bO=dGAl\u000e;HNs=\u00070U8;\u000b4\u0015=oý6!;\u0003ӻ\u001a\u0014:}v\b==\u00178\u0006B'=hhˡz*=\u0000K=\u0018K=\u0002=*\u000bM=حȻG;y;\u0012\u0006O=]D;o\n=\u0000N;;\u0012\u001c#<j;<{=̫/*r?6@?:\u0014v.=K\u00153<.<s,E߉:g\u0001=f\u0003\f;\u0003=j4=ܑ<rҔ=8n=n\u0001>m˼U;\f<\u001b<)=$\u001a=;=\u001a<o|=f\u0014;/jm<\u0000=5L\r`<\u0019\"m=aE=` ǽӥ=\u000boflQ=,옽76i<[ F<'e\u0016\u0017\u0010P=j<\u001f\u0000\u0002=\u001a\u00013<xF<!\u0019=mzIW\u0019\b=a;,\u0000=\u0002ma=t<Iit\u0005=P;\u001b~\u0001纼H\u0018='78<cU<n<\u0006\u0000=\u000f^<\u000e<\u001f^\"<;\u0012<:w;\u001dlr:Ss/0dżTu=н)k<V\u0016\u0017M=e=pX$2<E=S\u0003\u00105=1=My\u0005<T{p;a;Dɢ<[@H=B_==\u0002\fc\u0010=(<4TE[\u001b=i~$=7LǱ=\u0001Y$\b%=\u000b\u001a=\u0012;Z\u0011=V8RMG=\\Ř<#N<1\n\u0003</==q5ƽ\u0003=\u001f6=D=g\t>Z7*=\u000f\u0012G<c\u0003\"=Af\u0018p\u001c\u001c|\u0000>\u001d\u001d;\u0011Z\u0000Eֺ\u0004\u001b<(aɼ6\b=1;/5h\u001b\n!=l̘\u0005<BL֘\u0006=\u0012\u001fԼ\u0001\u0002=-=+|;\rF\u0000-\u0015\u000f<\u0012I<\u0019=n`\u001a=BH$;\u00043e\u0007<J^=Z;)bġ=\u001e=<V\u001e<;C\u0013q \"<{\u0005<nS!Y\bh<$;a\u0015P);W\u00164=.]JE;W=\u0016=[=&Y==<j3\u0017F\u0017OC=%<υ\"=F=SzV:\u001bN=\u0000!&.B;'>p=>=\u0005\u0003\u0003F >\u001b%\u000f=Q1>mn;!=Qv=m(Qz\u0015\n<\u001a\u0010<9\u001b=\u0017m<\n=[K<Y\u001cby<Yټֳq=&=W<JF1\\\u001d=i/m\u0007=S\u0011w*\u0004\b\u0001\b\b\b\u0003\b\u0005\u0010\u0001B+septimbre_amt.note_branch.conv_yo2.0.weightJ\u0003lJ=߼M̻\u0000\u0018`ahϾ\u0005ˇ}>z=B\u000e<Uż\u0011(cW%y{_c{ؽ^=9wI=ۑ\"|q8-xWܽ/ս\u000e&\u001a2Jo=l<\u0005]\u000b&55=FN\b\u001dXr<Մ=2Wͽ\u0000/\u000f\"Gj,,\u0005-t\u0016\u001a=U,Eoz=\u001a=\u0001:\u001e\u0012\u001e4׽Zg9n/4_\u000b<]ֽ\u0012ݽ;ej~˼y޽\u001e \u0011ᠽ[\u0010\u0017ӆ\u0005=G>`Խ\u0017\u001a(Z\u000bD)̽踼#㸽+[i𼒮\u0011o'$ľE>!jvc\\\u0002TM\u0014ĸ\u0004=~ O[e2\u0002f\f\u001b\u001ejZX;<i\u001avd!\b\b\u0001s\n{*5\b\u0001\u0010\u0001B)septimbre_amt.note_branch.conv_yo2.0.biasJ\u0004\"`*!\u0010\u0001B\u0017septimbre_amt.encoder.kJ\u0004_\u000e>*!\u0010\u0001B\u0017septimbre_amt.encoder.bJ\u0004zs\u0014?*d\b\u0010\b\b\b\u0005\b\u0005\u0010\u0001B)septimbre_amt.encoder.early_conv.0.weightJd6_=bd=x\\N<H\u001f\u00023\u0011\u0005<¯\u001f=oWS=\u0017=\"<A\u001c -e=\u001aj\u001d=&g<\u000bRJz=\u001bf=\u000b\u0019Ǚ\f=U\f=Tc<:vd{á\u001e\u0013=\nS=\u000f*L׼\u001dJ=^`<3\u00134=74=8ռc;\u001eNҺC=mW*x93V=\u001f<i#^\u0017\u0007p~;*[\u00017/&=a4<gy\u0013rߜ&N~\u0016\n<#8\u001aʼ\u001f:B}\u001c\\s(^;LS=*<\u0002\u00029\u001czh-<,xټ\u0018Ҽp<X;=}E=\u0006$>=wڼa+=SǺ\u001es<\u001dS<^gc\u001f<UM=>=`pv=gO\f_Y~\u001c<3\u0018:Ga)?y7^2:\u0019z\u0011X=j)\u0000;>:\u0018Q=oi\b=YJ=W<+=m{<Xȶ<b2a=<\u001e\\=Y=Q\u0005;oM\u0018;\u0006<8Y&<t2ƛ\u001d<gA\"O\u001f<\b,=3\u0014YB\u001b\\\u0018;Z<.>|0K[@E=\u001c<\u0015cx2j\u001a[<\u0015<ǚQHbV\u0001>\u0010.o<}\u000bc\u0007O\u000eѻ\\\u001cJ<\u0012%\u0017Z<e2p\u0005M:\u0012䓼=\u0000O]^C<ޖ\u0017=4;\\%=\u000fDM=\u0019z_<R==w:\u0002F=)\u0016\t>ve=j\u001b\u001f>\u0018==7d\u0018=8U=l?;\u0010===\u001d\u0013>\u001a)=ǉn=˯=\u0007\u0004=d=}\u001a=\fD=p`=$=*!>kl=d&>V֡\u001f1<4=n\u0010E<x#\u001c\rmC< &\b[:\u000b5ţ<e9K\"deye='\u001evo~B#<,\u001c\\1<4*&e<f筼da=LZ;-=oja=suE(u*Z<4QżJ =\\\u0000<~ơ=\u0004=\t\u001a8<{=Vr=?\u0012)K|Up:=(=\f=yP=\u0019\u0000<B#=FsKg=C< 4\u0019=Uja\u0013<Fʻlx=}V,\"<Lsg=b#\n^!=\u0013/=F<z¼\u0011@=~<N;b='a=M9<A\u0019<\u000fd\u0012Dx=E<d\u001f]A\u001f<<\u0019=YrCOּ\u0004 =\u000fPe=F<8==<\u0004<!\"F=\u000eF<\u0010e(<KQ=G(_;laP=^=>\u001d\u0001[c~==ei=!\u0005o@=χ9UKB\t\u001avW=bqA:\u001e=\f6d\u0014VӬ_\u0019\u0001\u0006=R=ɡ0t\u0005QX<o-=P\u0013=\u0003\n8\tg\u0019<\u0002<s<\u001bμG7[tX<?>SFW\b:v꼋\u0019}<ȼ\u0001U\u0002=J+9<[\u0001\u000e(׊)<'\u0016<!\u001bF<-\u001c\u0005?EK<(9=2=\u000b\u0007\u0017VB;g=[=<)\u001a<%\u0007eR\u0011=؄=pļ\u0006P\u0003ý\tLIw\u0014G\u0017 ֽ\rt\u001dYvψ\u0010>t\u0011>;>z@>rJ9>n<F%VS&<&WR]L<L2c\u0011<\u0003%ht[=#i4\f;f=`\b<\u0000Od\u0018><6N~̂F<dp`/=OTU\u0000=M\u0012_=\u0005nAQ\u0014=\u001cK\u000fI6<)j񻼅d&<W\u001eS\u0011\u001a<55\u0006҈Gq%qZ\u0002+>s=RO=FO}d<t\u001dW^+<\u0014L$=\"<$=6<k4=Ra==@<0<N\u0017OT=tz'=ȵi\n=ܥ\u001f=ދ^;Аi\roл9=:\u0000\u00107<c\u00127X=\u0012谻2=j5<\tm=1'=p)=\u0011=\u000f.=:<KT3\\(z;\u0012꯽,y\u000b|N-z\u001f\n<Ym^<DX%=o\u0016;H*;)\u000eY:\"A=}\u0016B\u000b<\u001a;>ڜٮ9E5\u0007=WνD8db{\f̽B<#\u0011=v\tzG*<<<l`PռG}\"2kV\u000e¼\\\u0001%~~==a\u001a=\u0016(=i\u0004\u0010=\u001c;(X9ܻnuU<;\u0004<;<\u001a4=\u000f:\u0001\u0017=^?\u0011<_,sviu<\u0006=-M<%/=3K\t<5<\u0000IN=ƷŻu\rP<*Q=L<9<p=m(\u000f{ӏ=Y\u001f<V<=G=٠=٧=S\\=e<21`<Z\u0019=\u000b=kʈ=ß==;<\u0007Rny\u0017a=s\u0017=9===q\u0013>=\u0019->D<\u0001*c<#=lܼ\u001c\"<\u0007\u0007=5<k\u000f\u000e4=\u00110BB=o<D\t-;FT*=\u0007\r{^\u0001=+\u0013=,Ou\u0001rż\r<\u001c3<\u0015H=|\b=8=ǏM=n޺=pze=i+^=\t\u0014;|\u0011;fE\u0014~%=0=D\u0019:Uտ=g\u0014\u0016;1:=R\u0013T[=q@=\u0013QI=\u0013=r=e|<\u0001T;\u0010[=\u0000<=#rrGW\u001b=\u0016\u0002\u0005<כ<\u000e<!\u000fʢ;cșm=E1<Z\u001dKpa;K\u0006hs]=}|\u00002~V3U\u000f=\\= p?<Ɩ;\u0001\u0012\u000fdP\tΥ0\u000bhYx\u0013>f̩^&N\u000f^=v$j9%Y<3[\u0018<\u0001䏼$tXb`w\u000b<$|<\u0012<\u000fK=ʏ[=68k~Z\n\nQ=>\\=\u000f\f=c\u001e=wѼ\u001eǙ=L\u0006\u0007]U.=6lta76=9=\u0002<C<\t<*_\u0015\u0010\n\u0007.\tRKƺխwcꓼ\u000es&<\u0000Ywzf'=h\u001b=^!<Rg;G\u0011vsO\u0006bupM۴<?=\u0012񼺹{=>c<C8\u0010̯==+)<!<z#\u0000~p޼4+=V=<GT'<ǌ@<\u001dJ\":\u000e;5\u001c<?1YF:\u001cm^NT\u001148ɉi(c|a=(\r=kMU`Q=[s|2=<;\b\u0011dļ<O2\u001cfM=&漧\u000fra\u0006.fжꫮcɽ*\u0007A鍽Ro<k\u0004=N2⼟h<\u0017;\u00139\u00107=&(WAg=??缼K=\u0010\u001e\u001e_=ddNڹ;;\u0005:=&޸\b!\n<Ʌ<ص\u0017pe=RP\nҼ\u0002\u001f\u0015V=\u001e\u0012=\u001b\u001b\b5=XѼ\u001cmƼZ::\u0019(Ɏk$Y:k\u000e_;8\u0011\u0000;`*=t\f<V=T׷\u00129z\u0015=)Uc,\u0017Y7<,]=.5Z!=%}<\u0011$m-=1,<9:7\u001ckm]ow\r@=gP<'<^=-;T\f2WSyޢ=lZ\u000eE\u0001<:ؔ<\r><\u0011<J\t\u001dnx\u0015` \u0006<\u0000&:?=-]\u000b\t<\u001f;}.A=\u0010OM=&|<\u0017BD>=\r!<=<R0\u0014v\u0002=\\<:2G=9.=t<PY=U^=E(f|H\\q4:Pj<|=>\f/G{:`<C#=\u0006t!@<9^&/)a\u001f2g[?Y<\u0000;H\\\u0010:$j=\u0016W;]\u000e~ۜ<slP\u001d=\u0006=,xϼ];0=;NG=\r<؃<\u0014\u001c\u0013\t\u000ep's޻qݼC5\u001fD=KI=A\u0002\n<h/M\u0003<\u0001zX\u0001=\u0016<WhXf+F=/=,ӝ;Z=e|<j.=ˮ=#\u0006>2$\"=0\u0015=B=M=9&<\u0011<\u0015<\u001eK=\u0018B<1qN<*6\u0017\u0012D\u0004`Ͻ4BA\b޽\u0015߽\u001cv$U\u0014}\u0019T=\u001e\u0015==<\b\f=v?)<o$j{l\u001f<&<GG=E2=\u0006R<}E=u%<!9\u0017=j;u.<%<\u001d-vf<=_\fKK<J]b#\u0012<SՋћ=\u00047;44=t?\u00176o=ۦ_ Z@V=jw\t=U<\u0005QR\u0001<V9ҙ\u001e\u001fe=q\b<\u001a=\u0007io<U<\u001a%#8:<x \u00188\u0012<hR;6[e<({\u0001=\u000e;Ap\u001a\u0015<\u001dz<\u001b)<Q\u0010BOu={\u0018\u000fO\"_\u0005=p<&;e=\fC!-\fH\u000e;%<t;Ze\u000bG;$<<9hU\u0003=G<ֿr\u0004<JRu\u0006I<I(f*l8<~<y缫A=\u0015\u001f<\u0019:\u001b<;\u0003M\u0001`\u001fr> m=ۢ=\u0002\u0002<7<Eav<\u001c\u001e~(ڼ/\u00022)=(w\u0011;=7*=yw<W\u000e=9IcO+=\u000f\u0014<<\\BnHsgj¼oX}߼\u0019\u0016'k\u0015\u0015Ç`\u0013j=\u0003T<\t-;`=Cf\u0013f=?.\u000eOv<:\n\r6=w9=1+\u0010ԼTʼ6LO$=`_=\u00151N\u00184=\u001c=\u0017Z}<\\\u0002\u0019=;<T\u000e\u0011=\"<b\f=\u0005-=هq\u0000>yi<w=JS\u0012>Ag\u001b>r}=!=h=\u0000@\u001a>k_>]\u000eGzF{\u0017.\u0004f\u0018\u000f.V\t@bͪҏIӴνlսҫ\u0006=^X\t}<Q$\u001d=ͩX\fs;us/g<\u0011.F;πT<9/L=\n=\u0000-\u001c\u001fV\u0011=<\u0015\u000b0%{v=!fD\\<\u0001-\u0003=(t\rI'?+\u0001A\u0003\u001bhAX;<Ҋd<WuA=\u0016\u0015\u000b=V^<i\u0002cf<O\u001a0=[=>+E=lv<c=<-\t^?yt7\u0019ٹ#V\u001f)=3<)\u000e;ia<\u0016=N==5Iz\t6s\r=0/K'DF=S؂\b_=\u0018\u0019=\u0004׼\u001fߺ\u000e2R<L\u001f=$=mAk=&lp$= <R<O=`5GɻeAT6ӼŊd\u0004\u0002yT&a\u0015`\u000edŽ\u0017\u001b\b|Fܒ\u001f)<\u00029I=I~4=ݼ<ƶP<Hx~:=}\u001b=ϋ=<\u001eeb-=\u000eZ漫\u000f<~\u001d҈9'==`,=M\u0012=v=\"K̼\u0003t=\u00027={=\u0012㞼5;\u0010y=3M<I;=7=ȼN\u0011<6=(\u000b=^{w=f}̼z=<C\u000b=,;d%\\n\u0019=?5Kv<IܼO<\u0013= ȩ<&탼BT<h>v<M\u001b)<?<RM{c[w(V}߻r\t=ڼ\u0018>~q6\t==&;\u0017;Qf`<y\u0001=z*zRLb=͎i\\M9=\u000e=T<g໠d賢<W\u0000=5=\u0018S<1G=\u0019f< #\u0012*c= Q=@=(2;Z!;`<,m|\u0013kx,<5<z뽣G\u001be<M)\u0017ģ̀Ҽs$<\u0015j=\u001b\u001dN0;\u0017<h!4ԽJ+<gJ=\u001eҽ\u001a~lNE@={\u001dSн˼LL<g\u0019=ܼT8X=\u00175\u0001=敽\u00022D$<B\u0005<L<y覼ϖi\b=\u000f<o_X<<<n*BQ9=6=<ׯ<\u001c=8\u001b^=B5w==7dڼ0Cd= \u000b=K\u0019;y\u000bzE=\u001c=9q:f>m\u0006=\u0004JU\u0016+==Y=}\u0005\u000eEx;x\u00002ȅ;ZCvt5=\u0015\u0012؍=G\u0018WdUSA;|<\u001e\u0015%ay=<\u001eA<pF|y<;<\u0005c=mf=Y\u0013;1P\u001ek=d%M\u0019=1<\u0002Z='I\u0006e=,=90U6dq=N1Dd<[f!Q\u000bZ+\u0000\u001as/,E\u0019P;=<Xi=\u0018+x\u0016=Լh\u0003=;,I<;\u000e\u0015~^ʻ\u001d<#\u0018=Xy<73<<\u0006UnT\u001d}DZ=\"5E\u001b\u0017%\nɌWѹch<-B\u0014bm=̀P=ݚ.;yJ׼<B);R\u0003,폼\u0014\u0011<\tN<\u001a<\u0006/˼^=(<v-e5-׼+=鸴1/\u001fm\u0012xo;\n=I-8G Jo\u0004i;<\tU<\u0005=5\n=?b=c%\u0018=+Ӯ=Rp%\u0016ý\u000b>4O.[=\u001af2I#$<m:<Q\t.<C3=и2<z<XW<jV^\fmN=Δu\u0011M=<)7=T@Pʟb\\\u0014\u001e=\u001e\u001d<ks1p<B<3q<J\u001e\u000f<NE^ٻ\u0005\u0017;\u0007J\r;BD<6\u0006ѻ\r;\u0010H<KF\u0019=}f\u0010e<)<\tg\u0002l&|=\u0018<3\u0017\u001bL~<ż'ӻ\u0005\u0016_<;\u001aJ|\u0015\r=kb\u0011t\u0019\u0000=)lޯ\u0000<\u0015<پ%=\u0003Q\n;$}: 2An(a}k!!<(/<74sƘ<:<\u001d=Bb;öP\u001a\u001c\"=mHW\u0015F;`~\u0015\u00197=FF<zk+=<\u0012Җ<;S'=]=<Z\rj=\u0013u\u0000)=\u0012=nM\u0019ڸ<\u0000)l\u0006=\f\u0018J\u0004%\\}\u0017=\u001b7\u0000'Q\u0000\u0007=&,;Ir<Sܼ;@Լ> =\"<X\u0017<c<\u0019Pb4T<\u000e<!u\nu<\u00191޼#Լ\u001b\u0007༤3'Q\u0006\u000e=\u0004\\f=\\o<o-=x\fKsڼ\\\u001e=jO5@Uh<\u0012&hp<\u00172\rh\u0001:<U=QO<ꆹ<i;7ѳ<d\u000f0$t=C\tʴûG݁VmF=\u001e8f\u0003u|X*<\u001c&t惽uOR\u00196=ZN+,\u000e<|\u0018쥽\u001b\u000b-;]<OK\u001e<(=]C<d>^f>Ȯw>k\u001e>>1R\u0019\u001e=CN<zp\u0002=`;<J\u000bBkgFS<\u0016Q=B=|p<=\u00030M|\\<\u001b\n;\u001b^\u0013dF=kx\u001fHL;2\u0016&P\u001e<Gb;\u001a>=;y:t=]\u00014>=\"f<6Q=$\f=\u0013=B=+3IYUgOd\u000f;+\\c\u000b\tЪ\u001e \u001b<X\u0003P+=a==hŝkH=&e=a=\rV=\u0000-<čդF=m=p(:<R\u0002:zr<Gn`zePO`\u001b%\u0001n{H=yq>=\u000f(\u001f\u0014i=x;OPy74,=K=g\f;\u000f\\<zvA*/\u0000=?m(<*3<?\u001a.ؼp\\;?\u000ec׼\u0003A-0sU)=s|L=#<<񰨼r\r\r=m<z;Q¸;\u0012:.K=\u0007< \u001c%<<(<!:{^7<\u0018j8Yܼ<\u0000B\u0000h\u0013\u00033=0T=sG=1\n =(=:g=9==<m.O>XJɼ\u0012ϼ稽[˽&u4?(=K\u0012\u0015<;\u0016\u0001\u0007\u0014=y^8½\u00070aW\u001cl2Q>G\u001cT<$<q=_[<]==;b=0@:u=.X6=i3<!@tIX\u0015\u0016-\u0011G3\"R\u0015M=<ۊ:Ӹ<\u0013uܼ\u001bc$=u`8=\u0003ۗ=3z<\u001f\u0015n8=e<Ah=2p(\n<\u000bY\n=%B\b=i\u001cT_+\\<c޽%h\u0001\u0014=O'=\u0013Bh\u0003<5h=eF@F=kQF=.5=ڧgB\u001b0<\u0010\u001c<+<;Fq\u0019+\u0004yۻ#V\u0001=\rCb<wIbS=\u001bk+\f<=%>\u001b>{\u0000<&m7\u0004>t$=\\\u0006k\u000f=d><F\u0006?v=bG>\u0004Si\u0005Hg=5<;T=D<\u001c\f<0\u0017\u0003\b*=\n4Qۼâ<N(\u001b\u000e=\u0001=[\u0016=kun=\u001c}f=<2\n\u0004=\n\u0019\u0018[=v\u0019%%\"<:ܻ[\u0004<q;;S㻧!\t^\u0005=Y缙E&:F\tKJ=-<b<g=vS/Wz9< }\u0002;*\u0002<TE}\u0006ʺ:\u0018ȼ\t\u001c<f =;u݀=s\u001c\u001e=\\\n.^Dw<&F<mܽ욻\u001c#G//o<l:\u0015<B\f?=8|<R2=3@󪼙\u0019[<\u001db\"t8<\u000e=<Ԏ\u001f=IQ=źN=plټ>5֓/<.I=c&}\u00073\u000f=\u00109dZb\u0006|\u0019\b\u001eO\u001a\u0016-=\b=\u0001S<\u0011\u0010$=Li=\u0000\tx={-\u0015</<7D\u000e<\u0001c<;>\b|\"V<\u0015Ns<De;\u001c#?`=s\u0002=\u001f=\u0003(\u001c\u000esO\u0012<\u0003e <<[\u0007&7\u000e=3q/}уVؼHP/<\u0019?2\u0013.M%=zܫ]\u001fhW\u001b4l<á@=#\u0016j'\r=u=ke#<\u0001_=}m\u001a\u000b<\u001b\u0007)¹;Z߼\u0012L?&ϼEF\u0007=;\t\u001cy2<򼩋RQ<MX=ݤ<Ϲ\u0005yQ=_Ȁ=&\u0001=c:E<֓Z=r=98;}tL<Y=f\u0003'ձ;Ǔϭ=O'\u0001>Ik;)\u0018=V?=m!=D\rB_ϸ;\u0005=ii=\u0013W;\u000b=bu\n\u0019\u0002<V\u0018*=\u0012;vU<\f\\Aݽ\"~\u0014\t-F<\u0016\u0013\u00136\u0012?.o׼v8=J\u001e=D\u001e<#0;<=c`=\u0015*\u0002V}e=v=6o2=(\u0014=\u0004yL=j\u0003l\u0002trA=\nS:|\"C函#B\u0000_:_\u0007U;\u0014/>=(\u0001T=\u0004Y\u0011o0<\u0019A\u001d=aT<%^<2=)út~=\n\u0014쥼~< \u0013g⽃r{5fGHa:\u000e:̮s\u0006=\u0013Ӳ\u0012\u0016|\u001b%<R<=K\u001e=];=J/d+h=Tٌ\u0015=:\u0006#&\u0000&=ԂY<.\u0007\u001a==X<G;\rG<,㓽}\ba8֤G=\u0006Ҽ\nR=\u0005<<\u001dp\u0011=\u0015K=^;\u001cB\u0003=KJud\u0002\u0010\u001f_Rh;s\tf<<G<v\u0007=ꔋ<Z\u0002>\u0018\u0012\t\u001eI\\4\u0005u%<`<[=֕=,>='|=,=In=T\u0005缣lM3ǽ<:v@r\"`>\u0014wG>J2$>\u0014e^>T>J=;=\\\\=5\u0002c=/\u001cD=ywԇ\u0006\u00032v0\b!Lʭ87+Q7Ͻ%^>ȹ<=x\u0002R=\u0015==\u001a=i$Uq=\u0011-\\\u0002\u000e]Kf<!\u001b\u0013>;%.T<U\u001d9<,\u0001\u0019=G\n\u0014R\u0000;\u0004Ҕ9\u000fj<M\u0002=\u001fKݼf\n=<lH==d@H\rH=5,\u0003꯼'n\u0000\u0018ɕ<\u0015Z<=.\f\u0018z<LNRj1=H<orRrƼ+9=7;xM<\u001bB<%U>=i2<69=WB겆?#\u001e\u0010>@r\r4;:Bv=jG6<3N\b=\u0006E=ov#\u000b<X~Ѣ<\u001f;˼\u0013\u000e\u0012=\u0013~<1<h׼\u0011F:\f\u001e\u0016;`=zJ\u001e}<-G2<50<\u0016ZshPp=;;>Ҽ:<H,6G}o=t\r\\L=¼\u0006\u000b;;I<\t|!=\u0016<7;0n\u00182=2B;5\u0002L</2\u0002O\ncm\u001c;\u001dv<\u000e\u0011\u0013-c\r=o\nѹȽüe=t\u0017[bJ\u0013:\u001du<!-\u0003\u001d=\u001el<&n=\u0006\u000f=A\u0000U<uX=2fs!<+;\t<\u0013\u0015Fc<z8=kBJ\u0005^\bZ=\u0019a_;8J=\u0014<Bٺi\u0000u#\u0013<0ἦw=\u0000;<=v;'k=\b:<H`\b:6\u000bۼe\u0004*e=\r\u0004;%\f\u0013=%A)\b<!,=pب<(\u0011;|\u000ef<P/ǻ^$\u001eϽ\n\u0002-=\u0014[弭+l\u0015:<\u000fІ;Hu':PI\b\t1ܼ'\u001bP!<:42\u0010yd=H9{:(\n\u0012=@=\t=%=\u0010=v=k=Y=owK</:̝\u001e@U?;\u0019?\u001e/<B<.\u001ao<pAa\"'S=\u0007߄v<`\"<Ui=ܤ=Aڻiy=:,=맙;3=@?\u000b_Q\f8\b(֯<&M\u0003D󫽬⼫p:Ϛ.<:( 6_ps<<\u0014=ܢ<l=0<ZA=?s=\u0015\u0000>p=\u0003=ŤU\u0017f\",4)u\u0001<E\u001aѽLiŽt\u0016ڼwrm7`<\tj\\p=&\u0001>!\u001b\u0001>Fe\u0000>=2`;U՝<jƳ=Ǿ'=f\u0000\u0011&0Y<\u000eYT<A=\"\u0011i\u0000w=Sy30\u001d>\u000b:Zo=\u001f\u0014H\u0016dtHi=e<G=VB=Ul;ô<P===\u00198\u0004\u0018=<T=;|</\\B@s~<&\"!;TBEup<V\u0005{\u0019ڻ?(|<x9N=91nT={\n=#aݻA\u000f=]='f]<Nu\u0012 !;ee\u000bxʊv5\u0013=\n6c<<=?<e<\u0003=\u000e#=~U<=Ug;7\u000bA-<1\u0019Ę=\u0013]>g\u001bB>g>>Qm\u0016>rZ>\rݽ\u0012,\u001a3è5P\u0019=}M*<\u0019Gh<k\u0012>=˺H?==j>>)#a<[=mQ77喽E?cI;XKs?;\\Q<ρ#=+w<j\u0017eX\u0016<ۀ<Cȼ\u0016q<N=4A\u001f<5\u001e\u0001\u0004\u0016=,,}<W;ĽYe<L2\u001eό㚼\u0002M$᫚\n\u0007)H<D=\tt~B=\u0002=y\r=Ni$\n=r;\u0007=@%ӻ6.8=,<\u0002h_\u000bW8=BO ;Ɍ<볻|\u0014I~򭼕X;*= \u001d\u0011q=q\u0004x\u0011\u0004\u0000;\u0005b<\t:,=wQ#%<@(=H3;a^W<[_\u0019=w\u001byU=r=H&<t=yG<7\u0010n%=9u\td=\u0005<Y\u0000=f\u0016=\u0016'\u001fgU\u001fR\u0017=\u0016HDA<\u0007jL^\u001d\u0007=\u0001<#\u001f\"$=ջ9N=\u0015V'=+=i]/CwӼy< =|&=\"S\u001f&rycV<Ӹ;<X)6\u0003=q<\r<\\=<ǭo<Gd<G޹c\u0005!J&<\u0000\u0010=`s<\u0018<\tm<\u000f\u0019=<AkR\t=\u000fjN-m<\u0013=sj7ֶ\u000510<k(X;؂oc\\;qBIUhf\u0000\u0016;\u0004\u0007=:\rKy\u0017U[=O:={A<\u0014\u0019<6=<<\"\njۼV\u0018=\u000ff\u0012ɽ\r\u0015N\u0002z\u001d=d=T|`=P;5B=\u0018}=t;CU=>T;K烼r\u001a=!\u0011\u0001\u0005[=N\u001b\u0011\u0018<h7<ͼVkUGQ\u001eT4\"\f=\r<HE=Nb<\f_<^<al<ܗ<lϥ)B)=\u000b[Z;$\b`e5+=6\u001f\u0017<\u001fjT=2B<w8=Ia\u0003P-R椽\u001bw\r:.\u0001\u0019O\b.G<A)<&Fm[==~$\u001a\u0013}%=2<~܈<1D=\u0005=u<m=׶=\u0019=[x\u001d+q'[0j='LּH=@=Z`=4t\u0015~&\\ ü\\;N=\u001c\u0011;d#7=\";;=Xb\u0011==ۭP0<GA3\u0004<}+<=X6I<:\u001c:\\;JZ;W=$<.\u0018]6R|=86\u0005_<qT=5\u001c=~߼r;\u001dr<>5=3\u00198\u0004\r4ѻ=KJ;/\u0002\u0007=\u000fC<r%;ܼn<\u001a<=k|\u001aS {\tU<=|<\u0002Y\u000f\u0005E\u0002*ƻ\u0000\bx \n\rѼjiNK93\u0003V,<p5/P\u0015<\u001b=;W< <!<;\u0010o\u0002H\u00004:<#IM^\u0013;\n\u0013;cza<\u000b0q\u0007Y\b\u00176gaT<iܓ\u000e=*\\=\u0000=\u0015Q+B<I\u0014D\u0004[\bs\u000e4;.;!+[=6cY`<{;ߵb;$9<B=4>;=Ү)<\u0016\u0006\r>*o\b\u0010\u0010\u0001B'septimbre_amt.encoder.early_conv.0.biasJ@gaDm\u001d>P\u0007S>(;\u0000'=ҙ=\u0012j\u001e.z;f*>d>=ŮY=KT[Z\u000e=*\u0002\b\b\b\u0010\b\u0019\b\u0003\u0010\u0001B)septimbre_amt.encoder.early_conv.3.weightJ\u0002{<O͡1\tA5\u0019=۠\u0015<z\u0002=uL=\u0007=fH}=\b\u0019=*]=\u0006M=?\u0010<<wk\u0000dz;\u00046\\</\u0018;<y\u0010<O<s\u0015;m <q)<T<Y?=<9r< 3<\\=π=-D=*\"=Fo<=W=<G=\u0011b=A=y=)o=\r=jV=\u0002 =D=xU=(\u0012\u0001=|d=GK=x=\u0005V=\u0001Ǜ<[-<\rx\u000fT<<<\u0002b<;7;=B0\u0013=q6=ۚ=\u00003=h=Y<;$\rq<:<_kj'j=c={\r<I<rw=l=E\u0002<H\u000f<\u001b,\nC <o<<B.<[\u0017ܹD\u0000`=y=S?=C\u00170\u0006.2\u0015G\u0014s4ӻi`0\t\t##\u0019WϽ\u0011s_=<=.\rkWfQ(\u0017J\u0003efV<\u001a~\u001c\u0013\rO<X<nיo<\"t涼-\u000fQ\u0015FA\u0018P\u0019ՎTL;(\u000b\nƼ\u001aA5H}՛q;\u0011)\u0006K\u000bb2L伀\u0000>I=|<\u0000<\u0000C;\u0012\u0002+<H<\u0000=HY==N=S=?=&\u0002=C%=<\u001bW=:\u001bq<m\u0011=\"<#\u001aS:o=<\u0018<75^y+!\u0000C<*p:-/7<)<<7+=<<\u0015d$=<<ir<:A<ǼQt<\u0001_\u000b=8\u000e=\u001a<=\u001c=\u001b\u000b\u0006<H\f\u001e(=}Z<s=<:N<Ej=d=>#==ra=Q=X=\u001d=vK+=\u0017<Y<o\u0005<\u0007\u0016;z쬻\n\u0014=e;<`t<\u0004\u0017<B<NC=\u0019d=<ڃk=\\n]=K=\u0002򺽄\u000fP?hpXXV8e<\u0002=*\u0000\u0015&K<>Լa\u001a\u0018TQd{\u0010\u001f&\ttu\n|Ҽ\b~:%< y\n<\u0002{*א\u0018i'+\u0017gu (<vߚ<<H<# \u000eY\u0018C=\u0014\u0014=;+=5=,Ƅ<)=E=\u0010s=.Ę<EX<R9<e\u0004*e{~ >\u0004@wbn\u000f\u001c^n\u0012{8%<t%Kǽbm6~Q\n\r\u001d3OnNP&J\u0004\u001c{[\u001eѧ<?\u0015<&l:\u001af}N=нDR=!N;=_n\u0007\u000b\u0007B~s\r \u0006{>\u0006.\u0000߉uޫ.<\u001es|=P==oV\u000bWP<\u000f\u001a=\u0013w<\u0005<E!= <Bg0\u0015<U\u0007\u001e=\u0002<); d?\u0002%=\u000f`7=|; <n=dG&Ͻp\u0018Ǖ\u0019k\u0011;p°z<ds:2T<\u0001<u<\u0017c<s(._\u0018ٝGhؼn\u0014F\u0011O\u001cs+0\u0003Giȼ\u0018*<g<l<V<\u00164=\u000e0<%ȼ)*#=oQq=\u000eW=H<9r=)=\u001c\b=#ݝ\u0001Vp\u001aO<ىR=+'<@@Fn+ \u000b!=[T\u0004=\u0001=cGb\u0016<zt*;m<'q=<D=܋_=\u0011Lv\u0002іtü;->ged)79<;\n\u000bӹ׺:R<l2N<9<;BԼμ%/\u001bֺ%G#ARq<<<\\\u0002\b=˼~=֐=*=\ns\u0005>\u0007\u0012C\u001e\u0017\rN;L<\u0001=UV<W\u001b^^½D4\u0003P<)\u0011=V<`m<cG=\u0011<\u0007\u0012=c<D<֝<\u0019=l=T\u0007'`LF=\u0001=\\=#O<cƼ\u0000lcan<\u000e=\u0016\u00026(\u0018\u0018\u00013W훼_$5\u0015ׄf<f<\u0013_Z.b+/:\\hI +?p]d:<D8Ҹ!=i <F\u0015\u0015=\u000b\u0011L<!OO=&G2Qf<\u0007${\u0018<18<\t<+\u001c=߼ue\u0006*h1:\n;\u001eg=d5:8Z<L<q<.ν\u001b\u000efX<CuK:Q3հg@˧;M0;b;\"\u0010=Kn=XrC=i=KD<lȗ==nV=n=y=ݚ=J=6<=L5= =<1<\u0013/=\u001c\u00058j\u0004\u0001Z/?\u0012μs7|R)\u0001Q\u0006goE=^#d\u000e4\u0004X\t\t\tW\u0000\u0006Z̼ݼX+`(Br7U\u001b\u0013oѼG\u001b=\u000b=_x<ޑ<Dh=mm=˦<s<j;l\b6ǽdK\u0011;[o<\b-8J>:꽋\u0005I\u001d<Q%\u0016.o=$^=\u0003|e<輶OjV?\u0007\u0000\u001cUEü\bnf֪ƻ\u001fV}<\u0010<\"^\u001aJ\\4ټ[*ErXw:e<\u0017N<\u001a\u00020f.\u0013i\u0007ȼ\u0019H?<+\u0003%@<+5<!8='\u0018<;4<a<\u0003i˺4#102ռG\u0014\n7\r5<֔<g<K\u001c=a?_=!J=g\u0015=巼X<\f\\h=;K=F<x;eCEhƲ<-,L6\u0002\u0019=\n<\u0015F=\u0012d=P=?K=_=\tZ'>\u001b>'8\u0016=n\u0018t=q=Sզ/=\u001f \u00056\u0002=\rJd<5KTp|\u0003<m䚻C?1Y%d:Ƽ\u0006\tf\u0000U\";7\u001a;k3#==)1fؽ)\u0012c\u0006<\u0004;\n..@<U\u000f=\u0018V=/]:<p3\\\u0004/;l΅<@\u0010\u001eԻϼbdPV\"+\u0015rb>1;Ov?X#\u0007\u0000⩱K7νiА?c$[M\n0<X{諰&b-\u0014h:̔F|\rt\u0018\"b\u0011)y<ýKe<\"o@={=d%<g=\u0015]=\fG<<^<R\u001bZ׺<l\u0014;ls;b;Ļ;_w|\u0015>;mش,\u001aJ)ũ٧f_;འgǽ\u001c~\u0001ά<\bt=|=\u001aǹ*q;6=Ǧ*=\r<J\u0000=Y\u001d=\tJ=f\u0013l<\"=aֻƼ'B<<N\u001f\u000b/ݼ\r\u001fw>_naw=-XN\u0005\u0016k\u0018p1=?3\u0003eLoһws;7=I\u001d=G;yV=\f=\u0002=̷=\u0007=M=:a=%p=\u0004k=GZ =o;*$;#9v#';q<䇺;+f:!*\u001e`@¼Lkwifdc׼&΄ݾ\fv$@Q}D\u0017<VUY;_$n7R@ؼ\u001c=]<JS'=\u001cE!8鼢Gtx<m\u0004z<~\u0014s;~EvJٺ\u0011!<5g<j<z1.B\u001f<\u0014CX<<ra\u0017B.4`\u0011n+;#K+=uļ_\b<<D!I=Z\u0014^=U==~o=\t<fp=|\u0011=\u0011X=&wG\u0006VG&Ǽ;»^RLꖽS\n\u0013\\\r\u001c޽LU\"Cj\u0012\u001e~Xɽ\u001d<Z{<9&h'9,<˂<ሟ=\u000eL=\u001c+=\u0012>)_=\u0006p=z'=\u0010s=\\=\u0001=l\u001a={\u0006>mb=tT=<5\u0017F=8'<H-<\u0012=3@=0==1=Fˏ<˫:ޮ8=i<\n.+=d|<v<[}<\u0016\u0015< \u0010 be'D<2s&B;w\u000e=W&<A<UQ1=\u0015\u0018q<$1ޯ=|==$>jQ=`\t>lj<W\u00057=\b=q纪p0˅=^=:=b@\u001a=+8=<ǺƻAj.=`=-: :\t=\u000f<\u0005\u000b<*<(;\u0019Oϵ+M\u0012<.݄<L{<ȃK}WHU1GCABuk`<Ko=Ol=\t\u001cqH쭽zUh!=-<I2@bg<;/N=d=\u0001?\u0015<D<O\u0018\u0010?f<<-<-y\u001dn9߽!x἖s\u0010cd2\u0006;s9=\u000e<yu臽]Ý~\u0016ԲF6'ּ\u0005!Z5<#\u0014J?=c?=\u000e;ԣn\u0006)`\u001eo((o\u000e={ӻm/\u000f=KU<Ҟ\u0007]<y9\f\u000b=;yC6=Hw=3=f\u0017<ʉ=h=\\\r=4<-A=ު==Gb=+W=v<3yۺ|l<w<ve=\u0005\u001dy=M\u000b<ba==\u0018%=k\u0019F&<\u000eC=i=\u000b\u000b4=}=֫>=\u0016ni=3=o!=\u001fZû`g<x=bT=͔<!쮼\tr\u001e\r5=#<D;5!\u0011:5pԽ=\n7=pi;\u0005;0j\u000b=\u0003<m<\r\u001f=}C\u0012=,n4\b=}]z]#=\u001f\u001f;S[=9}t=lW<R;<D/o\u0010fOV<\u00138,:һ8K\u001a~=d\r=\u000fu<O\u001bd:ɽʝ\u0007'=l<x<0ݩ3>:\u000e1={=:4;,`\b\u0012\u001d<n<k\u001d;^^_\u0016=\u0017<8\u000e;Lj<h<\u0014/\u0016=0H#w<6\u001e\u0006<i\tk<|!\u001e'-==\u0000=D؃;$<ϷX,½ʼor!{TK=@1=\u0003=<+= <ڥJ<faFQY<ʱ<\u0002U<\u0013m<M/<pw\u0002t⼹\\׼,ƺ\u001b\\(Nj;\u0019\u0013<\u001e|ERڙ<\u0018:<6X?=_\u0013=\u0006=\b)='\u001c;a5<(1\u001fǻu4\u0019==<<Ď|p\\<&<<¼;Dn\u001bZ0\u0010=*O;:-KN<\u0002<<L<2s;\fI:a<\u0011=]=6j\b1H5T@4F);o*<)$\u0005SKaԈ缱\u0018\u0006=Pǫ<\u0001\u0002^<+]<^\u001a;\u0019\u0013<\u001c<<\u000b=;ĉF<$8=RX=:\\+=\nm\u001e=ݠ^\\+Pp<+<\u000e<m=?;\u0017=g^=-<D!{=Woyi˼\u0010\"nU4\u0004;a/K<<Ll=\u001fO\u0003=ٍ<=-o=\u0003ݼn7g*v\u000b[<:<U\\=Ӓ1S.~]ڋ}Ö\u001f\u0006e)\n簼E=űC=);s@\n>O\u0002>\b=+\u000e>\r\u0015>b=v\u0004h\u0019%\"\"ۈ<\u0015=D<$<ϵ;f<<<\u0006-=\u001e7⻼w<\u00189\u0011<,=/R=Wμ]v;\u001dHA+=^v<?j:\u001a\b6=-\u0005<æU<1<;XG\u001b\u0017 O<-Y\u0002{Ҽl\u0017$gǼ22;\"\u0003tH͸h\t(;tq%\u000efS<\u0001\u000f\u0006Ҽk-ZȻ}\u001f<;GE<\t0\u0011<'n<U_?=_OcKa:Eu\u0002;e;BhD+_<-=>\u001bFf;A/8=D=<_<Mм(WTi<XΒ\u001c\u0004`<\u0000;\u0005\u001dkT\u0017\u0018ܼƽ\u000b\u001eBx\u000e\u0007ڄ;=<5<\u0004oTI<Tg;vm<\u001b<U=*4n42۩=\u001d=fX<L>$={<xP=ln=+7==D{\"=ʁ=#\f=\u0000=\u0019\\N;%\u00033FoƼӼH%Dļ~\u0015\u0001= //;?\"^<MIw:\u0012\u000fB1_;!\u0000\u0001:\u0001I6\u0000<+\u0017\u0002=ahZ(r\u000fUo8AR˖<;ۇ<\u001d~\u001b\u0000l9\\\u000f<w<<><X_\bW<l\u0017N;s?UC+O^s!<<qG=C\u0018J\u0019)lAMI;(\u0012\u0007%(<\u0005?<\u0005< \u0012bΛ*v=\f\u000bh\u0013=-6= =\u0012gX빽/='=0B\u001b=,\u001e\u0003=J<Ǩ[v=\u000f\u0012=J`\u001f=>\u0017=C\u001c<{\u0010=e\u0001[\u001cv<<\u001c\"8M=;=cݮ=Enʼ/;;A=05\rĉ<M<\u001d=.?V\n<1<\rLmɺO&\fT<Uvrma;\u0000l\u0000=~\r=\u0019`\u001a<@\b)C\u0010\u0006\u001d4'¼\u001faJ3a=j<>ޠ=`?;k\u00023\u001c;<l\u0018=\u001b<t=CǸ\u0004J\u000b=\u001e=$(=L-=DB=L\u0001=%<tgM=\u0014\u001e<h<\u001e<ŝ=\u001e?491E=2=ś=q8\u001d6=\u0011F`;\u0006<7\u0017==LSq؀ǼBX=OG=\u0006=\u000eh<\u0014-vmc\u0003\f\u0014Ӽg=<\nQ=}K=\u0007$I=\u0012O0<WN\u00036=\u0002)M<#fQ3<9\u0010;\u0016z\u0006;\"x瀼jͼÅAbIDtļ<\u0000lGZ<o!<a\"\u001fa<\u0013;<\n1;CW4=yeXEƒ)<!Vg=\u0004=\u0015=w=5*<!1:5;S<\u001c<Ro\u0015\u0000ۼ;\u001eY!<j\u0005;\nr=0b=Y?\u0003\u0010<t\u0005;f\u001c=$F=\f;\u0004<GZ<8-=\b\u000e<G\u0016J=e<\u001a<^dM<<m<d\\\u000f\f?92\u0015=q\u0013=\u0018=d)H=+@<\u00141ټ'A2\u0004<f\u0011\u0019\u0001;^<.uzfӼ\u001e]\u001b;;1$:'#<\u0017唽IŻJdE\u000bay\b<K<\u001b\u0013=|+=#;<<6\u001a='\u000f6\u0005}\f;Ij4P0\u0007\u001f_P\u0016=\u001f<5<<A<\u0010\u0019d\nMt)L;<\u0010<\n< <w;&=淼<k\u0015=\u000e\"<\u0011\u000f=o(=<!<7<6\u0004\r@s\fn\u001e\u0007?\u0000y<h#<ebD=׼\u000fx.\u001dȋ\u0007=\u0015T~<S\u001eRy;8<\n\b\u001e0UV\u000e<̤[<\r <_I=\u000bם=\u0001H<JF\"\u0013=\u0004mRV<\u0013\u0018]\u0005; ;\u0019=)p_R\u0004-\u00113<b]:We\t(ݼm\u0014#jپ<[Vs,\u0004ϼcZ=\\U<\t\u0014<D; =@\u0000K<@\u001c\u000e~<|_\u0007oy\bاJgk;\u0003o\u0004;Ȗ<ޥ.;<\tي;XaJ<\\%<(s<\u0006\u0000=\u0010O=S$\u000b=Z&=\f\u001bL=+\u0004l;GE%C;\u0010wV;\u000ej:齺\\)\u0012ż̵my:94 :^s~U;H\n$g6\u000e;) t$;L<Z:\u000f=к<<\u0004\u0012sZo\u0016\u0001;H*\u00067?\u0007Ku@\n\"<wċ;<Ό4=+^plμHF=$\f=e<\u000f3<\u001a;ɧ9?q<|s<PV\\%%=\u000b\t=\b=<j<}\u0004;$<r\u001a'=|<\u001aP=Q<\u0001=;;z\u0001\u0004<=t\u0015=*<\nz|\u001efϭ\u000em\u0017SP\u000eE=\u001aP9}G<O\u0002;\u0002n$8Y</}\"V]\u0005=\u0014庲F;\u0001\u001d\u0010;;X/\u0014\u0006?\u0016\u00140Q|XM<\u0001\u000eO#WZg<\u0002=O[<\tP̻e<\u001bѥ=b=V=>\u0000<\ri==.=r?:r\u0001<4-lm\u0011mu;;vp\u000e<\u0017<B\u0001<:\u0001=\u001b:;p;0W\u0001E\\\u001e<ٛ\rS\u001c߼к㯓<yz<T\u001f@*<^鼡!<d\u0000y<.,=&==:Kٽ7}ܼx\u0015:\u0007\u000f&ۼûF\u001f.53,<\u0016~\u0012B\u0012ӻ\u0007Xs<L\u000bw?/\u0018=+\u0005=\u0005Y<<ŷr^;H8D=',=\u0003\b=0\f<e\u0018':\b ='<d=<P=\u0015=`\u001cG=i=\u0014=<@}=t\u001b=\r\u0002$=5\u001bX=P\n=\u0010=Aʻ\u0011;Do;\u0015\\<.;A\u0006>&l5ؼݼ;nù\u0002=N)$:\u0011\u000e=\u0011\u001e=z<\u000b9\nG<w\u00037\b@Ư*\u0017Tf}e\t缸!=<Sy=\u001e3cf\u0002;A\fպ<8;,<&K;Q\b\n;\u0001󺘁a<\b<N{;;s7)xD\u000eڲ;]\u0005`ڼ*m0<nmp=<ޏ<vL<Rǻ\u0017\u0011xým{Q\u0016q\u0017?[_|\n/^D`*\u0019\u0002\u000084\u0007Z&;S\u0013\u0007<]|hޟ:\u0000C?\u0014¼R\\M[P-\u0015L\u0019w\u0015k/m̽굽P_(z\u000et\u0019\t\r=<i \u000eɜ!3̃$H\u001c<\u0003\u0012<Ëc1μ\u000b<\u0004<3<<<<1<k\u00126τ==2<\u001fɳ<UM\u0004hUf|\u00044<󮻤{8izZf\u0004\u0004\u0012-=}o_֋\"=AϽ\u0015\u0010(ּ\u000fVb\u001d\u000b\u0017<\u0019\u0007<~T<ؙn\u001b<4\n6=~<\u001a^<g-={<H\u000b;=\u0006˻w<\u001eh?źE<־<\b\\<X<;A<\u0017E\\=b<b<\u000e\u001bʝK1\u0006=,\u0012>\n>\fE=\u001f\u0002=̘3\f\u0001\u0017;\u0003\u000bAf0ܼ\t\u0000u\u0006\u001f\u0016ͻ;5\u001e5EBQ\u0013b<F)=\u0011\u0007<\t+<E#EG\u001e<<t0=\u001c\u0014=m4ܵ;\u000fE=7%=\u001e;xr=b=\u0014=|\n\t\u0005ϼ\t<\u0019:q\u0016ѻ^Hv;`%=\u0012G=V{=u[=\u0004<C;\f<UR,H٬\u0011\u0016n<O;D<5\u0016<!ջL(<7<-\u00068ҟm\u001e)7MC\u0000\r{\u0015,U̼==\u0015>,\u001e0ጴ<M=]Ѽ\u0019;}\u0010\b-d34w<\u001fƁ;\u001dq-\n˼\u0014d2wO&mڙcp\u0003`1.Y&^;\u001e5\u000b\u0014\\<\n\u001dL-Ѽ9:*{ <ΞP'4}73}܊<1y='\u00154<ڱGp`\u000f\t<2<{J<r<*[<(\u0015<X9Y]79\u001b<\u0015=\u001a;\u001cFp>@\u0011~Nj<m&<H\u0015<<ܭ<a6V%<6\u00007[t]L<\nT4=H\u0006=b=\u000b=~=Ru<\"\u0019=G=K<B<N=j5\u001eF\u0019;3Mm<5e༡u@<i<Т1<;&<<*1=A\u001b=wH\f<\u0005Bi< ^T+k@n<\u0010<2<y<>=c$=X2;D\u001f:Z怼=:\u0015L\u000eT*\u001d\u0017a|\u0013C{ؼǗ[d-\u0001^3\u0001Qj@K <~<a=\t;h4\u0001=.<7<<ep<v=\u0012<Y=k<ˋ<63=d\u000f,<4b<&<\tf@F\nh\u000eY\r3=5k=\u000fZ<\u0006U\u0014=:&=ɟ<}< /<g\u000f86\\3&=8Ow;\u000e;Ӻ>)<h\u0015=\u001f;\u001e<<O\\=/=\u000b=\u0011\\\n=<i(=2=qW=<G%+==K;\\(\u001c=~<\u0015=s3<&=\u0010=!=\u0001\u000b\u0017̻'Ը^m1,\u001eS\u0011:\b\u001d\u0012M<B\\53_;\u001a\r=kiϼꡗzA\u001fE\u0014\u0018>N\u001c\u0017<u=\u0017<Y=\u0014zHF\u0004мCm/D=J<\u00103\u0013P=\u001fM=\u001f=[<fԼN궼\u001f\u001e\u0017qL!rS$<\u0004=[K=>-<;ڹx\u0014=F<L+<u e#+]#\u0015=<!M<<qA=Y(=\u0018=LF==)\u000bƻԗ<<hW=f.='<4E=Q=\u0011=\u0016]=\u0013={<P\u0014绁<DWĻ4{:px[<MziKs|c\u001eUԽZ ż\r!\u0016<M<8;B<\u0004;\u001aټC=Ň#=A0=\u000fO\u0001\u001d:һ\u0018m\u001a<#<\u0007\u0016eOL8~P\u0005<-`<\u000bںeȲ<׍=UL=a\u0007=^Ļ:f:\u0000=:\u0014M10Y\u0006\u001d\u0011Fƽl\u0004\"8:ټVO\u001ehT=G\u001cW=|s$r\u0015j_+\u000f7=\n\u001a\u0000=A<6=kg\u0013<]ۢ<\f|\u000e<̑<Ax\u0018b\u0019'޽mXv\u000fm1\u0004Ľ\u001a]\u0004\u001e<A۴<u?=&Z!<ᨆ\u00126|Dd_*kz+\u0005\u0014\u000fUҁ<<r36o)<\u001d<!ﵺфVP»v\u0013\u000f.sN{\u000b=,*=\r=\u0002WHasyO=\u001c٨=Ċ=1i<О\u0019<l<pjk6.A\u00132\f5ѽfd\u0011V!\t\\нK\u0011=\r6;}y\u0006<3\b;\nXr<i\u0012p~$)Aw\u001a\ty\u0014=ɠ@=q\u0002<B=K\u000b=e6=;-;\u0017<4;Bh\u0011<D<\u000e==pn={`<\\;\u0015<胑oDټ+<t\u001a=\u001a<$=<<\u0004,=I\u0019|=?<\u0006=e=3=\"\u0015=B=;e\u001d\"=ٵ\u001f>׀&>*:=H<\u001f<鞬<ds\u0001t1r=B!=~=E=Q\u0019<b`Hp= \u001e=WL=\f=ɗ\u0001=\ba;\u0006\u0002\u0003\u001em/\u001e\bV'\u0017\u0011c\u0005=vi<< <!;ܚ=&=<v\u001c;\u0013<v\f'k\u001a\n\u0003GYX놽O#\u0000<0<\n`;\u0016r=9\"\u0019<\u0016,\u0003<u<o\u0017=#=E\b=&=΋=9=zc=U&>\u0007;S=L\u001f\u0007=D9A=\u0011\u0014=\u0016&=\rt<wRE=μc.=\u0011z==\u0019\u0018<\"oUw=40=\u001e=\u000b\u0018<٤<Q;\u000f;4\u0011轘֎=ͳ=_\u001a=@Ο==9*=7`>Ͻ?\u001dŤs\u001c؊W+s;\u0019\t<\u0012==Gμj\u0005<\u001f=\u0000=U%Uc`ad\u0013vb<5<4T5=\"=Je=\tĹ<V8=[u.&<y=5=\u001d<\u000fpa<\u0018\u0000<~O1<><-j<U2<\u0016<\u00105=A-K\u000e={<X4=(_=<%\u0012=m\u001c%n;S3|==-I=\u000e,<5<4Z<6l=\u0011\u0002s=kL=t2=z\u0019\u000e<:`=Ѽ1<\u0011\u0015\u0000:NNk;2=͓=:\"=\u0012\u0003V<u1\u0004t\u000e\u0000ҽ\u0014K<H\f=\u00074#`4<\u001d*\tL;k/`\u0013=|P\u0013<4e>\"O ^+M;$<{+\u0000='$\u0003=JK=*&=\u0002Q;\"\u0007=7\u0019=:\u0007<is=<#S;uS<w!:ⴀ\u0019c~ ׼ֺ:ƳƽnNy{u伻Ƽ\u0005o=h\u0005==<o׼\u0015\u0011\u001c_<\u0007t\u001aK\u00116\u001fec\u001b<\u0013\u0015g\"S<P<\u001dZb=y=1=j}==\u0015CB==pB(eLЃT\t2\u0002<*\u0003<75$;b8\u001f=׳7'>bw<Iq5=ۺ?%<.\u0006<k<Xm<:=M<I@<<=b=\u0018>4X=kS=\u0004l===Y=H>\\=3=*=\t=Z==\u000eIټB<*2\f= <9\u0006 </Ş\u0018=<\\ك-\u0013<\u001a=<H]==np;\u0014~<;\u00112<[.@;[4\f=÷\b=Ņ=A\u0012=4'8\u001eDjpf\u0002;>ݼF<ql󻹚?K<\u0016iI\u0013eZ6\\=\u0010\u0015=_tP=5<\u00172O=\u0005=\u000b\\кe\u0010P-\\;\u0012p(=\u0003;.ž<{\tԼ1{;_+Q=+^=\u00169~;\u0006/=Y;<移<p<-E<'a>?׼s\u00073\nk=\u0013S=\f7=\f=4=&\\=`<Y@\u001a<1=Q>ň:1*<<ڼ<?q4e+\u00151];3U\bG\bҼb;k@=\u000b6;cmn»[ݹ<\u000eo:l\"=\u001f\r=E(= #\u0001<,\u0018\nf\u001c<q\\=;27\bMʼF?˻&\u0014<T\u0010$=A=\fѻKA\u0007=\u001aB=\u0006rW]<S;\u001b;D<>`<s\u000fһ;<~\u0003܍\u0011A$=\u0016\u0016]=\u0015\t=,.=T7\u001c>\u001d=ѐ=7\u001bu=\u001a\u0014<^;\u001f$=Og><3a<3L=\u0002\\=B<\u000b5\u001f=\u000bg=BGX=\\;ż;K<\u0018=\u000b\u0002=@<X}̺STħvGj┱\u0017\u000f=sQ=vuU<:=\\D;Hu=\u001ags=F\u0013=\f=p=\u001fx\u0003L;x?'\u001a<\bou=\u0002=}=\b\u001a=;V==#s.>\u0018+\u0000[ph'=i$=U=aw^C`<\u0001=ʹ<\nA=K?撽\u0005ؽN\f\u001b2;$h\u0018=-=mۉ<G\u001e=%Q;<S=<[=4\u0015=Z:3<о <z<Lм1v(N<w\t=<c\u0002>S<\u0010k\u0003=\u000e<\u0001U|u/;r\u001eC\u0006\u0012S$6/F\"DUh;\u001cӻe($R<|wP; C<;Z]FU\u0003#W[=ґ=@d=B!=b=H}*\u0002ܰ\rx޼A!\ro5(C<I\u0017cmTx%]Ǖ8h\u0006\u0014`<<!==\u0019\u0019<dǍ e@aw<ߐ<\u000e\u0018zD\n*ԕ;gf3P\rj-혘\u0003dp8`a<@)^\u0011c-<F\u0003=<yG,=;=\u001c=\u001d>k=J;޴\u0000<\u0012=^<8=x\u0018<g<tr<xZ5=\u001c=1=;.=:N1:R\u0015=\u001b=z\u0003<\r!Ư\u000f=t<ua|O\u0000nѼ~\u001bCh6\\ü`8\\;\u0018<o\u0011\u000b=7<06޽sD\u0016NQ=&\u0006=I}=rj\b=-/=ߺ$m\"\u001c\u000b=\u0016u&<^ҮBӻ䌽]'G\u0017K{\u000e;\t\u001fPҼ܅Ƈ\u0005\u000f'(=\u001aE<_p<^.=\u0015p=\u00120=ķ<\u0006=wV4<<Q)\u0016\u0015g, Ga<b+Լv4<\u001807!e=\u0003,\\އ\n{\u001ag䯼\u0005Ru\bx&2\u0019tl\u0003J!@hZ\nݼ\u001a\u0015;T\b;G\f!\u001eӼȜ3\u0012\u0012;ǼQ9<<<X=hVn\u001aNԂ\u0000\u0004\u0018:\u0016ӼeikƼh$pI<+\u0001Vr<\u0004∼?1(Su\u0017）/D_\u0012#8!E(<<\u0005\u000f<)绞2;ĕ\u0014=ٺ|s<.[umV\u001dM<ګ<ѻz\u001c<-q[<\r<E=ߋ<̋=\u0016\u001f=<=Y\u000b==+=|!<\u0018=i_<<P\u0013WOu,\u0014ҼG\u001f;X:|m* \u001dֻ\u000e\u0018<'\u001d9ļEGxd\u0013w7]\u001f\u0003C\u0005<)U9\\r%=\"`,vWxb<V;\u0010^6˻<\u0019\rV1\u0002*[\u001a<.v\u000f==v=@< 2&9b\u0001=;*<\u0007rWH\u001fi\"\u001c߷ܴʼD6U1<c<\u001c\u0004-=><8<R\u001c=K7\u001d\u001f\f=ur=vF3ؚ\u0017r=qߋξ\u0012D=e<T<@\u0016<Z<23\t=#4\u0005=\u000f<<\u0012д<\u0003\u0002=\u0015<Pp<Q<=<'<I<\r\u0013=\b3<vY]<`X<)<\u000bV;@\u0004Yٜ<p<]\u0012<#\u0007Ͻ\u0014\u0011AŽ\u001f=SM==\u0004n=|^=0x=\tX<+l<\u001c;<\r\u0015;_R׃:K;LͻB\u0018;u_ɼ\u0005;<B=~<\u0018<cw=-<oz9q\u001c<$<&L\u0016\u0018ᇎ\u0004\t\u0007½ss ^\u0012\u001b=\u001a\u0007q<x=<f\u0017k=\u001c=LC=v<n\u001c=`=o\u0001\n=vf<W=0o$=\u001c\u001bKbo]׼ij!\u0002Q\nP_Ƚ\u0004!i1ѽ\u0013н\u0011qX?\\9a,zNW[G^Ľ\u0005\u0006\u0010$/\u0012/\u000f=V<=i<<g;*p66\u0004\u001ffu)s=}=l3=O<\u000b<s=X<8eh=k<g\u0010==K:t3=s\u001e=:\f=0<== v=}=ڦ\u000e>D=ZK=]k~=5\u001d=C<{\u000f\u0000\n=bc\u001f=\u001eH\u0013s\u0006\u0018>-a=G2=\u001e=\u0013<\u0015%=)\u001d9$-HH\u001f9)\f\u0019=49='=M<\n^=U=ѽ=M7]=s\u0018=\u000f=\u0007 >Z\u000f>\u0012\u0013G>e=T<=/=[|=V=P=a-\u0010\u001d\t\t*E)넽:`\u0000*켿\u0001Y\rἺ\u000f *S\u0016oҏAv,bDʁ|B\u0011+\tk\u001e=]^\u001c\u0001iϽD\u000f\u0010\u001ejc3x\u000eq-\u0004?1\u0017.f}\u0018g;mr躪<̞;c)=mu<8\u0002=\u0006g;K=`c=b9<<<#Trݺ\u0002=2\"f!gXNAFω#xҽ\u0012\u001bYYлc<u<\t6=@=ܫ\u0018ǎ\u0015<+@<K<LKs<\u0018mS=o\"Z;ռ8\u0002;j'=\u0015=x<,=B9\f<l\u001c=Oy<9,=6|=\u0012ҭ<\u0012'=\u0011=\u0011:Z=.9\u0003%\u001bG-LZjH/\u0003G\u001a\"{qӺNDH\u001a<|9rǗƽCk\u000f>\r\tpyr=ϳ8=\"o\u0007=Ō<\u0011*ռyl\u0018\u000b\u0015H\u000f4\u0002\u0014;<i8\u001a=\u001du9;;)\u0019\u0002\u0012:B<]?Uf\u001e㼫\u0015pD\u001bH]<^~=c;픽0_;\u001c#=x\u001eŽ \u0016e\u0018\u0007l~ݸI]e\u0019]U0;\u001b\u0004=\u0007=G\bS5KQ=Ņ+zy2ҷ\u0003\u0014\b=\u0018\u001f;.i=\u0012=Ex4Ydl鼍ǣ\\?7Rt\r#h=az<-\rڰ/\u0014حV<w<N<^U=S?=l<</3=DW\u0007%\u0004ZZ)0M<!i=c=l\"Z<\u0007:/<[<>f<<\"=i=u<\u0013\u0017=E=R=9=,=L>=+=&ʈ\u001c<g\u0007+=``\u0004Gxs\u0013\u0002\u001b\u0002!Kռ7\u0015 <ˀ$\tA:#=6m<\u0017aӼ\u0017w~<S\u0003`<T\b=Kxh\f/ȼVT\u0000=d>;ڒ7eo8+lἝF6텤4v \u0004< :=<\u0019<\t㔼\u0010=)5zt涼\u0018<μDf=\u001f-ҼAe\u0017\u0004=\u000eGy=HQ=y\u001c<L7\u0012=<\u0017=n\u001f=/j=t\u0015^=<\r--̃=G=(b}=`=f==8Q\u0013g\u0014\u00114<\u001c04ř<$\u000f2=\u0018=\u0016b[\r=l2<\u001d\u0007=hn=5B9\r{<1+<\nC[k=fE\u001e=n<3;o<\u0007R%p0Q˽\u0011u_⽾\u0016;5\u001d9g\rW\u000fXSU\tOL\u0006߼\revP=)~<\\粼\r3=G=I=1ػ+^<o0껖{\u0006L7\\x\u0013i<;;\u000f=\u0002I\u0003=2=PW;\b;Y\u0014L;\r<\u001d<m;u\u0005;J\u001f{\u000e=ьJ;\u0010;tr<ɐ`&H=}%\t=w9=b\u001aHKґ;B\u0007U,\u001a=;\r=]qm=#=&=uN=NW=1Y\u001bk_\u001b^\u0015ޏ6(;\r(=MҼ@\"q=\u0015\u0014#=֊<`\u0013=\u001eN=\u0017[<K\u0013\t=\u0019|ܼRO=/<\u001c5=\nFF?vx\u001aO\u0015\nP  &Ҽfͯb}M락Ѷ;\u000f\u00127]\u0016D\u001aQE̼Joj{c\u000fZQ\u0000Q{!>ۉ.O===\u001c=\u00032=E=H#.V\u0015TC<x\u001b;O=K\u0001<l<\"\u0006\u0006Jvf؞\u0019u\u0015 Zμ\u0010߼{=ۏK=t)\u0018=M=<;R<O\u0016<;ޢ\u0014\u00147>7\u0002\u001b{\u0015=8=\u0001W=2=\u000f*\u0016=\u0016=\u001f7<N-{<\u001c&4iYkT.<ë}=\u0006d=\r=T*Ӻ#m<8T\u000fY_==CI^=Ӎ=s?=3G<\u0000J<\u0001{<ir<l9[<i\u0006;&%=8.\u001f=O==[==a\u0004=\u0013/<K\u0012@=\bd;;\bp<\"a<\u00163=(=9쪬MJVm\b\f;\u0002\u000f<݉N =o<0=f\\=2F\u001f<[<;g\u0014=\u0001]<x\f=<ax$k5Ui轇\u000fB=ܟf=\u001eE4=\u0003M=G\u0014=Ț=M+<)<8\u0007\u000e=ʗ\r=쬰0\u0016\u0004:ND<мH5<J<En=B\\/H[b\nK@\u0003Y5DPyz)=<:D<G=-z&۰<\"N<P9Yv=\u001a=c}:\u0011\u001cH=?b2=Ζ=J;=Ti\b=Qn=^8<\u000bo\r=\u0003]xQ=3wb>м?k<02\f<2ܻQKM\u0013=`^<'k5]\t$|<ՉON=m\u0006;Q}=1o=l<\u00012;8;+\b=k2<^N\u0011=%^=㚼m<\u0019=gE=|=z<F\u0014Sw.S;i\u0019Js<!<\fe>?=P\u0007\u001aaq<*=x= I;Gӻ5M=<\u000363-=h\n<;\u0004=x\u0006\u0017,}Q\u001e=A\u0015;<\f=$=b=Ŕ=\t>DAP\u0000>'\u0014#\u001f=dh,k\u0019<Af^=ǜ<Wc1=#\u0013\u0012=@:=8=DR=ݷ=\u0015\u0007(m\t\u0004#;f3b$4<~Լ\u0004Ek+\u0018}GWɞ\u0002=IY=\u001dx=I<Q=w5<\u000f88xk:<bH:=Y߼ˀP31m>;\n=)+6v\n\u0014\u0019_eԼjzE=zz <\faa`j<$຺*\u0016=<Z]<$<pʼNβ0C\u000e=6r*=D<\u0014=<B];|<؈+<L\u0018= =7===k\u001b<G/-\u0016vc<\u0016\r=~A<d<,.=nu;A:\n\u001d\u000bI?<f\u0007>6=@\b>7o=&=\u0001>`X3a<\u0003U\u0016\b^:0k3f/\b1p;7Woڛ׼/ټY\u001f6\u000f.\u0015\u001aLml<7<<`ǝ=r=<'\r>=UC\u001a>=1s==z%=><w<<=\u001c=W==c=\f= NI=O=\u001aF<;O=<+:dm<*Aq弁C\u0000\u000etX\u0013;Cd<z\u0015:\u0011'ʼAM:!\u0013N\"\\d^oҤh1\u001c==bH=\r6?<޶|<v\u000f=`=<\u001e\u001d\u001e,\u000e֜<Z:35a\u0010<ѣ:zɼ(׼aɼ+rr\u001f\u0001\u0006*ݏG\u001c2\u0010ϼ3\t;n|r\u0000<2<;ǼܚF\u0002\u0006KƢ(;E=R>=eE=*=\u001c=\u001dؼ>x=\u0017a=\b=g=X=F\u0013=Q= lW=r=P<\u0016;z;\u0005u<k<<8O=e\u0012=\u001ef<\u000e=;=7U=S\t={==}8=_@=?2=z؛=y\u0013=qr==\u0019S=Mi=\u0016D>\u0000Eh>\bia>\u0012\u0019\u0014>\b==\b>\u001eO:=t=f'E=W<Ls<1L=>==<-\u0016\u001cֻ\u0005Lx=^F=9\u0010[=IP=N:=a>=O?=a=l\nh=ܚ=(=\u0019=g=B(=ALu==_~=$\u0007%<<|߇<:ݶ=>\u001a==\u0017?<;]\u000e=D/=\u0016.=Jĭ<:b=<I9a=A=F-=(v=Iy=gA(=i<=ʪ<79Ch\u0005=\u000f;!+\\w\f=B:\bL<V==p\u0001=+9Oz+=ɔ=2&^e#L;8&8f<\u000f<FY<,\u0003=qL=nQ\u0014=*D==9<W\u000f<N<ps=\u001bC=+\u0000{*=&=/;Ǽå\u001c\u001cY\u0011\u0010҅r~\u0014g9on<F\u001ak\u0012<\rT<\u0019z=f<4=O:=z9<?<7W3-<;IͲ;r-=\u000b=|X >\u0004r=Y=\u0004w<\u0004JJP(%<\u0014]<x=)C=\u0010=e<H\u00031=x^0=\u0007Z<[a=\u000f)=]5==vIN[X\t-+\u001d \u0000<~*q(\u0013<v(<\u0004W=Ii<k\u0012=qμ\u0018^]ټC|<ioLL=`@==\u0007o=M=\"=O=\u0005;=+=ʉ=aÁ=B=\u0013\u0013\u0007>}\u0010>ȕ=m(=ʪ*=aЧ<h<Fv<<\u0006R<C<K^j\u000b<)<<F<{\u0001\u001beAN\u0019R\"\u0017|/a7\u0015\u000fN\u0006\u000eyz⓽\u0017<\u0014B5\u0013<\u0017\u0003J=i=P-=>=c=6=w=Y='\u000e=o;<\u00113i<\u0002I\fѽДԑ\u001ayi<;h5&<ٝ=(\u0000t\u001e\u000ef\u0018kt\u0000\u000bו='=x=;I;'什\u0000l4\u0004'߼A+<;ED;Ik]Dy\u00118AIƽ4T(\u001aOIJ<1Pϼj\f;]FW];t=\u000f.T=r6Y=<=9QQ]<!`=8yiS|qQ_c=͵=6?=Jo<(<=<u>U<ƽ<\n=ׅ<ݽ\u001fWī\u001d=@7=:=Lۂ;Bn=!\u000e׽3WCZDm=c=f=,N\u0004=Q<\u0011T=Is\";\u000eA\u0017<@<N.\u0013\\0?u=J=D=BY\u001b\u0010\u0004$<\u0004:1{C\u0007;茹4;ۻhuzB+ཱིauR\"\u0004!1򼸃^\bB\u0000p\u0017\u001e5'\u0001aӨ/;o;ԋ<{ν\u0007Fʨ'\u0005V0\u0010\u0013\u001bn˽\u0012}*Kį)ɼ\u0003\u0006-z;B=3)=b====:==P==<߼ R\rX\u00198?#\f\u0010=Y<\u001c!=\"vTסF\u0010=PI==.d<Y<8b=OaN4;\u001a*=;=ߊ=\u0004;<,<\u000f;\\\u0006o\u0019<7Y\u001b&|<E*\u0003+\u0000Q ȡ21Z\u001fͽuHԊƼ-`++!<oӼ\bk\t\r\u0007<\u001b\u000f<ۂ=~Ҁ*8<ME}<<\u0014=\u0016=\u0004=<s%\u001d=\u001b<0;\u000e<$ι=`SBIB=<`<\u0012\u0006V<p*=..==c\u001f=vB=Gт]v<Tv;=%=y\u001b/;;S<a_Լ\u0012<W$<7=̽3)ۻn켧*X;KÚ=_<B/U'><(\u001e$=ۂغq=½Uɽ<+6\u0013\ru<X/L:\u0006Ѕ=Y~P)(<T;t><HN<BK\fхӼ΃5rfC]Լ$GL;\u0007\u0004^V)\u0019&g<(6{ϼ\u001b{A_\u000e=\f4Yڵ(-½0CƼ\u0016^\u000fszo%\u000e\u001eLvZ\u0001Իo\u0010_ue\u0012E\u0017\u0007 \u0017:8;f\u0013;\u001c <;\u0012/\u0001;/=\u0019Α=o=z0\u0003<\rha-G%LF!=~<\t\u0001=x=<b\u0010=G;aRɛS\fY^#<BQ\"g٦>A\u00165j,<<?=x\u0014\u0014.l7\u001a9陼Y\u0007A=r;\u0016!h΀G\n[<~9\"XTj5F<<м@\u0014|\u0007m\\ⓛmUB\u0019¼ݺ=흽\u0006Z\u001f\u000bϜ=\u0018\u001eՏ<=.<<\n<\u0007l=̧<\u0010<=c@=%=5=|<\u0002fb\u0016C~~\\\u001eA<&z;\u0016_d;<EE=<I=)=\u00166=､<}R\u0014\u0002\u0010m<XĞ::\u0006=ve5{|*#\u0000\u001dlX%1\u0005 =*<<}\u000f=Oo\u00126edѼdX£$\t{ë<<m4忻n ϼ0\u001cc\u0007<S==7_\u00016R@8O\u001f>ܰ\nΎr];\u0011<ʉ=7a?yH\"\u001bIB\u0014\r\u0001{?>*;\u0005I<\u0015W?0;\u0010=,;<\bf;<r<]t.\u001a7<<Ϋ@=a\u0014=ٚv\u001a=BF=Xt3<WJ<<Gq<%\n=\u001aĻ<\u0014=K=ÇE)\u0003=<\u0014=,<@\u0010;\n=.'=(=*2\u0016*K{\"˽*ܼ@ro;ʙ=]Q;X;Vw\u0002Ƚݭ;z߽˨O\"`|4&\u0016\\$|Vx=$U=\rS=Z`<f<H=>==X=i\nټsCA\u001cd\\\b\r5\u0013\u0011\u0017\u0011\u001esfiG刽%=\ns=\u0016\u0018=m<\\:J</\u0003w\f\u001b<\"[a\u0010\u0017A<<a*<\";\u0003<\u001f<%e^\u001e#\u0015=\"$=2-=_6=<<&>i¼Wl\u00017~\t=1W=M7`LY\u0005(\u0002fѤN3^fM\b#?=wؼ<爵K\u001d<\u001f׼\u0006\u0007\u001f\u0001<A>\u0012=7<B<$\u0013=&m;\u001e\u000f=FҼ4H;\u0013Խ0C\u0018-'e\u0019=+<E=QNl<\u0011;ݢ==೼1O<1Χ\u0016#<\u000e\u001a\bt:T_<O<Pd{=\b}g`N;8;ZWD\u0013>\u001a\u0002ITD,((iͽ*%CݶG\u0018i$\u001b\n˼D\u001e\u000e=ߎ\\=_M='\u0014!Pi\u001e=a<O<t=V\u00187=˙<[=\u001aF\f=\u0002F=~=1(=f˟3pu=5vC0f>\u0016,<\u0018\\<iF\nvw3g;\nUN\u000b\u001a=5Pu\u000e=ڄ;N=z\u001fZ<w<\u000f\u001b<A\u0017=\r,=,s=ź:=>=L\n\u0007=Et4]!?=\n؊ᗼ\u0019zd<1z<<UN<*b;\u0005<J8<\u0010b=\u00175`=<G\u001c=/(=j\u001d܂\u0011^Q!;1d\u0001սrl*'L̽D\tWU\u0011w`j<Zs=\u001e=J^==_==<\u001c\t=x,=*<8=uQ;fd$*;);Dż =k`74\u0007l<گAu\u0002i=g=\u0012t=boaȺ=딽z<\u0005;߃=\u0015tmս\bB\u001d]iLL\n=#<\u0005=Y\u0000=P<lN\n=׫m;܌\u0003=\u0007=K<\u001ak\u001a=a\u0005=v*A$dF;rV=ّ<DC=\u0018Sy;}==J#\u0013;\f\u001f=zs_\\~Ajyc1нSqآ&+<\u0006+\u0005fop<\u001eI=*E\u0000\u0007V\u0017:\u0017n;z<91;=\u0001H=gA=y/=*9M$\u001c=\u0006\u0015\u0010h-<;~\u0006̼`(\u0013;kA,u\u0016=9\u0017==ݼTV/aB1R=г<;i;=z1<U:Yni\u001aBs2-<ҩ\u0002=\u0018b<I><\u0017]N]a(\u0012\"օ\"t̽\u001c9z\u001d\u0005\u000b\u0019\u0005~;,\\=r<T\u0003<\u0003===ϒ=\u0017AN=G>=-=\r=Z7=Sk=\u0016#;\u000b<cy\u000b@=\u0003zݯk.<^=jk=\\=G=~Y=v\u0014=|'==t=\u0015\u0010=\f= =`g=S=\nm=ħ<\tB\u0002=1<1EJ=<&V+=MP=ΌT<c>=B)7=x\u0016=EU\u0006ź\rѕ\\(<i<H=͠<ʾ*==D<}<=<6==\"=-f\t=6<Si7=K=h3p<\u0015<{\u0002;*\\ͼBUC\u0018\u0004bW;;ּ÷hku<A@\u0019]\u000bԝLᒽGa9A\u0001<\u000f<O <\u0015E\u0001<ں\u0018=p+=*'=\u0004\u0006==<̭=A\u001b=\u001eh=]\u001c=c;C;뢻\u0013};Ꞔ53}\b<yS< \u001f!˼G<B@_zi\u0004\u0005==\u000e=adL=޼_\u001a6{d\u0013{x`e<'_43M(K<쪽{+bVY\u0019Խ\u0011\u0003܊hz$zzΡ\u000f蜽\u0002OeK\u00033T\u000eOd)齵߽)x7ӛ><;\u0003f;n/<<奼[k9<XK0^e+'`\u001d轩\t\u0019.q<\u0012g<\u0017p+{hfY<`ǽ\u0019pQ̽L\u000es.\f~<qo\u0005U=</\u0017\u001e=\u0018Ӂ<\u000b<L\u0010>=&Wr<=\u001d=\u0004=Yͼ(\u001d]\u001e<< ɼ,-\u0005;H\u0014u;c\u0012J=={\u0004;h<,5[;=\u0006=\u001ae,\u0005=Ku=\u0013\u001aCNo<-sq\t\u0019'<\u0002;i<\u0006y<S<}\u0016=U<\u000b\u0014=#<hҼ}7n=i*-\\BM\u0010[%G!CE\u001fT&=\u0004\u001cV={ֽ/j/43\u001a'; <M<?_=\u0007R..X=\u000eͱ=tz=JN\u0004\u0015\u0014'\u001b5Y<?<?,=\"=@;&0^<Rʽd:E#>D\u000f<k=%m=\u001eg=\u0004c=kѶ=\u0019ڕ=\u0000ğ;\n`\u0016֌2zH\u0013;S\u0016=\fK<L<*n3<\bY<]CO<aF|k\u0015:\u000b>=\u001b=}L=CN='sR=:<<>(]=Z<{,\u0014䪘\u0005!VS!m\u000b|:E\u0011v}}[\"\n<F3ll?',ofŮ\u0013%Z8C\u000f=9<\u0018\u0015=f:.Oښ\u0011Uɼ\u001cdYv;਽\u001co߽\u000bҽNd|\u0017\f=\u001b~;6\u0017N\u0002Լ=6)\ry\u00139T`kCl\f\n輨\\\u0014x}ֽ-a!\u0011WWy<\u000fًATϼ\b=p<ʆ\u0005=,\u0014};h<\u0017A=\u001fS=>!=\n\u0006=:q==<I:=;a=ȊfC<:>=)B=\u000e\t=@=\b\"˼\u0004\u0010=ýLo}ƽd<)@=5\u0011>\u0013~=R\u001f[=.=<~\"=φ=T=;\n<\u001b\u0001\u001d<\"\u001f \u0017=`\u0012=<\u000b<|\u0007l=\u0011GI=@<zb+;Y<\u0013\u0013+\u0015k;\u0003Y\u001c\u001b\u001f9\u0014\u001a轁ȽNe\u0015\u000f4 E,ͼ\\\u0001:\u0014=`\u001c\u0004=B=\u000f\"S]M\u000ew\u001a?J{\u00129\f:h;H\u00143<`<=\u0006_=hx<w;)<.\u001a?=8<ԩ<VHJj\rU\u0015mڽŽ]7:&zH\u0006=Y=x=_昽ߗ*)\tt/@~׿g.`=DT<\u000e&h=#\u0013UJ~\u0006\t\" #\b\u0017:8W\u0015\u0014͝\u001bD*:2ݷb\u0002\rȽ:ꍽ8;P<\t=\f\u001f=6;=6!<<(<\u001229ܼ;<Ŧջ_\u0007ސ=u=5U=,NR\u001a=\u0014\u0004=\u0013\u001bNV`<h\u0015|=\u001ei=\u0002=z\b\u0007\u001a&żz:D\u0016*<맼\u000b<\u00003\"\\=<Y7<%B%({b\u000eX;^\u0003;'ԺPQ֕'~]9lֻ\u0000\u0005\u0003Ev\u0014I7\u000eY:Zټ|@;\"u<;&;s\u0002H\u0014L,%QiU02F\u001aSub\u0006v싽oB1=-===j=h\u0007\u001dz\u00020Y\u001eHp\u001aͦF\u001fO\u0005{\u000f=\u0010<;X=\\,R:\u0006E\u000fѳ,=Djˆ!==]ҽ[+B.=]ܒ{~<N =G7VA;\u0003{\u0010(\u001e\u0015pԪ\u00035\u0017+\ntj\u0019\b\u0005\u000b[=5F==\u0006\u0018ڽ*ռY;F;̼=]\u0012G#<=qֽD\u0007?A7;!=+\u001a>VYM;\u000f\u0003=F\"'X\u0005<\u000b:.F&D=D.=\u0006\u0004=\t<2\fm<CSм\u0014=2Ƚ\b΀?Ľ󡈽W)}k9\u0000 iΕ&&\u0016Ľ\\\n<7\u0011=U=\u001b\u0001=}\u000e:Z\u0006]Eg|?_=U=M2;\u0016=mt<뇼\u0015\u001c<!dp;;ö<h\u0006<Fa0b/\bu:$lȼ'RO˽}.<Ϸ;g\u001e\u0017o;Nq;\u0007;2<0Ͻ\tüVк<=00=\u001a=.ͽؽ\bwr\u0012IU\u0003\"\u0004q2\u001d\u0005\u0013;n珽{~w< y=\u001a<\u0014<>==D>=\u0017{\u001e=;rswv~\u0016K=e3UkgU=ٺV=ڹ=u\u0005;8\u000b=\u0006V̻xI3\u000f\u0006Yl!ļ7)<|:\u0015|?cں;N<\u0011\u000f=n\u0010(=\u0010^A;\u0000#\u0015=<[:X<\b<<w\u0007B\u0006=:Z=z<0=I<\u001e\u0010=\u0005=WY=\u0003V<K\u0003>G=b=8\u0000\n=\r<@=%ĻM\tcD{\u0010&Z<\u0007\u001a<\f<\u001f=̷=l=\u0004=_n<4=mX:heb;\r\u0004,r\u000e/!8:\u0014=~&~Y?\f<\\\u0010=:,Y<<8\u0014<<A\b<e\u0000<f<=\u001f\\=;5ʱe<Z<N,(<\u000f\u0016T\u001d\u000ey. GJ\u0017\u001eVĘ;\u0013(n\u001d\u001eŽ>ҋ<̋;֭J=MA<)a\r=l=ܕ=i;t;>\u000b=\u001f=\"\u000e={M4==7,=HB\n=|\u0011<R||ּ\u001b<)*\u0000U\\p_J2OD\u0018<\u0015\u0015SL\u001b;\u0017dK<f;\u000f0g[!\u000e#\r\u00044qK\bAi`\u0016\u001f;\b\u0013<ӧ[\f2&\u0011\u00166g\u000fн\u0016\u0007l\u001bkzۼE;vN<UrB6!CVik0;te\rG|\u0010+w_qgIgҽrҼ!\f\u00008UPL\u001c\u0014WQ<\u001eD-gRu\u0013· mЇF6O\u001fp<;Ks,\u0011=^O<u\u0014\u001fki\u001e製VԽKU\f\u0011k\u0007V8\u001c=g<\u000e=\u0003\u0005U~R-E\n;\u0002ds=c<_>=!\u0007O<v3uGr<\u001dn?wWC}d,\u0013\n\u0001i-ܽP\n$#\rC㹽f-`ƽ=@s\u0010Ӽ8R}#ҽ]}σ&\u0006n<\n\u0002c;\u001e;Q=1=T=9=2s=_#\t>\u00026mB<[=~/?=v\u0018=Y.=<\u0012<bӼōkoýܻ<ǣ2<3\u000e>\u0013\u001bY;\u0010;4\u0012<cR~\u0014/x&\u0012\u000b=\u001f̻|#,+\u001dM-ST#F;i;lۏ<Z輻L\u0003r!m\u0006=H<NZ=\bF\u0005<䪼@;;<Q<;]4hR\u0006\u001a弰3eL@\fV\rM?\u0001UM!A'\u0019$\u001e\u0013;|޹1x=D=ф\n=z\u0003<ғ=<L=ǒ<S\u0001\u0011=\u0003<\u001f\u0017c0)=%<d\u001e=\u0017\u000b\f<CH<*<\b\u0003<,&=oѽbY\"@\u0003\u001aQn\u0012=\u000en;\u001ceA<#<n<\u0001<¼mCwn<6<<*<38<\u0017<Zf=\r<G\u0012B\u0012<C7<\t#3`0i0Ug+;＝\\v=F#\u0007=ͽ!\u0015<==o=hi=Qk=bU=g<Ny\u001a<\u0011\u0012=RU\u0005B\u0004mA\u0007whˎ\u001a\u001a/.d\u0017Dd<Rsм\u000f}<\u001e{b19\u0014Svx U}yM<1<\u001b<\u0006;ܐC=a'=D^\u0011z.==աO\u001dRHӸ$\b6A<^<\u0012(犽JռT\u0018y\u001d=tB0e*=2f\u0000;?=<\u000e=p;K\u0004׼\u001eܯ<D;\u001f<N%=Z*=R\t(_6=Ӥ4=%\u001e=\u00019G3\u000b/\u0004;\u001ewp<\u001f=?7/=|=\u000b<$\n<yH<q:nG]\u0012~;FFj<+h\u001aC\f=Ut.\u001d[nkYC\u0016Ύ'4}ke@ռor\u001c4.P\u0019=LW \u000e\u0013L\u0006/\u001d<}IZU:\u001f۽\u0003Խ\u001da?r\u001f2IȊ\f~.\"ּ܍Ἤ?. 7<#(a\u001eb\u0000<~6-;!<<<z@=\u001e==:?={=N=@Q\u0017k\u0001<\"8pۻ\u0013)/;q)nxF˷sӑ*l\u0018bB\t8޵|\u0019[Sey\u001cֽcl?`ܽq¼%4\n*\u0011\n5Ѽ =;t;=<\u0000\u001e<uB<=E={<f[=\u0018>ۘ=K=Ņ<ei\u0019\u0002A\u001aZ\u0000sRh_;^Ǽqf\f<R\u0006<<2$<C<\u000eO<9\u0000=ʹ<L{+\u0000\u0017W9I\u000fE\u0003\rbh{<|><rf<ڵ9ey<<ֻu՞=\u0019=R=u|>Y\u000b>\u0003.>y=ݛ=}=\u001e\u0016=%\u0012=\u0017('=3\t=dQ<ph\u000b<gn=\u0015yJ=\u0012!\n=\u0017=p!\u0004=NR=ם==|<_=c=\u0006=e\u0007>c=.\u0007>$¢=T=\u0011M=\\<d\u0015;')<~\u001b=n\u0002=镂;.luN=Ȩ=<)T'\u0010\u0011:\u0007;؜\u001d=\u0010<ɓ;=Y\u0007n= =̺\u0001>}=l==ڑ=I?=E=\u0016DD=6xd\u0007{MTc\r=<6Y2XYB\u001e=> M콏ǽƽhֻJ:}㦽\r)\b/\u0004:g<\u001f+<jqҼ\fx\u00027\u0014<=XKJ\u0012\u001fKMP;;gL=\bi\u0019h\u0006aX;/a]\u000b;=˼S;\t-=Y$\t>F\"\n\f\u001b=X;=HK\u000e\u0018oW)@A;<c=i-=N]==<<pR=%7=\u0002O\u001d=L<\b=`8>y\u0013\u0010<[\nL=<M={=+8aP\u000eDU=% O\u0011\u0012<\u000e\u001c\u0006=\u000ft?qpBk=G-=G\u0000=\n\u000fW=fWUu9D<ѪO]\u001a\\bE;=S\nB}Y~bP\u0013\u0013\u0011N[9F<l\f<Q<o)==ZV;~<4#Ѽغ*zsknk^P\u001d׽<'G\u0018=׳<<%G<Y=\\|e73F:yؼ\u001ekϼEȻȏ:C \r=\u0004\u0001<g`=r<Qz=[\u0015w\u000eZ\u0015=\f*)\u001e9GԽҽـl>\b1;,<{9=[ӱ<<%<5\u0001Իk\u001a=L<pU=;m޼6¡&/Tr\u001c4\u0010\u001edd\u0013KY:J1\u0007=T!\u0006=a<##<YV<Y;2ٺ1<.=\u001b\f=;=\u0015\u0018s=k^=:=%-=r=\u000f7=D\u0005;⊼3X*\u00126ٺ*<\u000f\u0007\u001d)<\u001c\nd\u0002p\u0019{\u0010`F༓\u0015Jr5.˽@½z\u0006\u001999ڰ%<'@L\u0010q<\u0007\u0010\u0004U<X$&=$`<\u001d<\u0007\b=\u001c<1==uű<^<(=C;\u0019`\u000b=X=\u0014\u0003>O=\u000b\u0000>:><t}<zW<*P[&)I''\u00000zgN=K$Q=Iڟ:+=N=0*=븼6W;\t< \u001f<\u001f<nE3T\u0011=W/;!<s`;\r,Ԡx/\rJ^Z<߆<\u00149v=I==*<-μGN5p=s\u0017=OF<e<=[<L<:Z\u0013<y<3<%hL7=\ffY<2\u000f\u001d\u000bo\u000eE(S;\u001e\u0019G<M<踡<w9ԝm\u0005<<\"\u000bj=`=*j&:⢷A<k(eӻoꑽw\u0017Vνk꽼n\u001fkԼ i\f׽Tk佉>d\u0003qۋX\u001dA\u0004\u000b\u0019ټݨ;?\u0019|\u0004=\u0001m;*</BJ=z<h\u001e<O\tP;<ˆ\u0014=Bտ\t=ј<\u0015T<e8=,;\u000f\u0002\u0004<\u001e<=猎<\u000f;/.z\u0010=\u0002=SP<nj=p=o\u0001r=O\u0010=y=<\b=2=+^=<V<0A3]\u0018d{'<SM(1\u000e\u0014O\u0019'm\u001b&f\u00182\nܽ]iiRn>ͽW^Ym<Լ<y\nں5<cʽʬFw?7I<Qj&\u000b\u0019;=eiH=|@=<;e=R}=+Z,\u000b]//\"E\u0006I\u0019ȼ\u0004<\n<\u00159m@׻-<*\u0001=K/\u001e<6\n߼ZYVZ;E\"\u0011=+'=]=L=\u001e=\u0007Z=5==#=n\u0007\u0004> \u0005=2)=͡^=\u0005`\u001e=<i7/=?=\u0005\u001f=j=^=&jm=&\u001c\u0013>&L<\f̎<#=:G;= =gdwۻDK\u0006=x\u001dF~9#r=[ý޻\u001btx/n)\u001c}齣elQ\u000b*̃₽\u001c\u00029&;3a<#\u00184=T=8ѧ<\u0003\fE<\"I8\u001934\t:1K=*=х~DaS<+=<\u000e<\u0011J'=P=z=\u0005i-2\u0007=Օ]=\u0007kd=\u001bS<o<\\\u0000=\u001f`y!M\u0015<M<C\u0013=='<u<v\u0015<@=\r3=Bh=2='\u001d=a#\u0010/v$=O\u0003@==n=\u00043;j#c<8Y=\r=/h3=`!={\u0006=Pu=\u0011-=\u001eO=v=\u0002V=pF=\u0015~=\n=\u000e\u000e5~\u000e\u0016=g<L\u0002<֥=<5;$;\fHǼ)o\u0019}\u001cXjW<c\u0004<B\u0006\u0001\n@=C<\u0004м7ƛ<e\u0011QQ\u0013<N\u0019_<\u001a=\u001c=\u001e=;AΎVu+;oH<.&=\u0007<Ա=\u001bX<Q(<\u001aR=$=WȲ=\u00011<1\u0005\u0004=H<gꝻa<ّZ\u00114<i<G_=X<\nx=\u000e=;:=!%\u000f=qA=<c =\r=N<MDs=\u0018'\u0003ǳ\u001c\u001eu=oM6=\u0013=CK=|=[=\u00055i<\u0004\u001b<h2<\u0012=\u0010\u0007\u0007=\u0012R=\fE<fT<kg=E!\t<dH1P<|W v\u000f\fC\u001fg.ӡIO3`\u0007\u0012*H<»\u0015\f\u0011F<:Ļz<ݗp=;\u0015==,>=:=O\u000f=\f=*k=D<,O=}A<zXJ<\u0010=ŐV\u0003=\u000f<pX;$\u001c1ka\nTU+\rz(\\<bPCgV:<$I\u000b<r2=\r=D<#'=\u000e=\t=\u0015\u000f=A7I5c\u000eWj<g\u0019=߼\u0015<,J;_46<g\u0007=_\u0017=G\u0015\u0012}3O=\u0001<E=O;\u0016<\u0001O<=bLR\u0016\u001ei,\u001d<<m\u0018\u0012=w$<X\u0012?\u001b<Qz<L'\"\u001bW)Fn,V\b <i;7ؼ$lw=K5=Ƒ\f=1=9<\u001b=x\u001a7\u0018\tȻ\u0011;|J<PYV=\u001e\u0018=p;D\n=\u0002;<\u0012@#=\u0005<ǹ<f\u0004==J<R\u000f;\u0018kA<<X\u000e\u0010C\u000029ż>\u001cq^iSm^b\u001a6\u000e<r- Y;\u0007m\u000eg`\u001a<f<\u0015-<o`:D<ou\\싌U+C\u001e\tV+ӼN\u000f܆!\u0018됽Fi\u001ao?<9Ļ\u0007ak!JN\te߽\u001a\u0001q\u0016TM3V*ئ}#ERI\\Zs\fhf\u001d54\toAJ\u001aI3<\u0010S+#SE/\u0015a8=Mg\f=d\u000e\u0012=K=s=jUk=&bP=6&<;=j\u0015=\u0015\u0000=\u001b <\bs<xm(;!<*\u0011=~-G<@<Y<y<W);3F=\u0006\u000b='\u0007\u0017*ͽ\u000e\u0000q\u0003BI\u0003\u001fཙâ<&=l<e\u0015\u001el\u001e<\u000f2==\u0000=DE<\u000f\u001e/\u0004>'t=4\u001e<󼖼\ru<º\t8<h\u00102mj\b<%<)8\u00012=g=C;\u0003D<p<:`B<(G=\u001c_M\u0005z\u001b;ؼʢ\u0017Nm:Jf<Ѹ=\u0004\u0014~<w<n;X{mF;\\cj2\u001efn,\u0019\u0003ί\u0013\u0006Z)F\u0010ɽ\u00122\u00160g\n9b\"+\u000b\u0004=<\u0003ʩ\u0003h9h=EOvlԤzI\fw\u001936c\t<˹ؼUb;F6R<\b;a\u0015<}<l/=F_3\u0005)H=F\u0012<<'ܱ=u/)=%\u001f]@<\u0015<bgv=q<\u0005=>3<]o<Z<\u0016\u0012=5\u0019njwX<fX\u00079\u000e=\u0012x=dJ\u0011żd=\u001b\"\u001d\"Jsw\u00074'u\u0018\u001f\u0017<\f\u000e\u0017=Ä<\u001d?\u001d#20/~0j==\u00113\u001b=\f=h=f?<8żcj==\u000f>ۼ%&\u0001m\t<\u0007%<U픻oK=(=\u0015=F<U:e<B,8=@=\f=*\u001eU,('s\u001b\u000bˑ<k\f\f|\u0010TNv$n\u001bB߼\u0013R\u00135'\u0000H\u0017r\u0010ǽ\u0016ýmeEѣn-`\u0019H߽\\\u0005&<㲮<JE<*|*rn;Ȇ<'mJ&\r<\u0006Q\f:v;Ǽߒ\u0001b-\u000bº\u000f\u001f9 M]Ƽ\u0014Y[G0\u0005\fպ&.oJ6}v|Qp\u001a:ͼ6I\u001f×< qnR\u0014spλ]3\u0007\u00182~<\u0000N˛&=[=<;?\u0000<D<@\u001f~\u001e䚑\u001by\\E+\bڃ9<KR\u0006m\n\u000b\u0010$TM\u0016G-;b<}\u001a=\u0004\t=;b4\u0004<2{<\u001cz2=Cͭ<o<p]$=<\u000eM=&@X=FO0===1{=Z\t>`=\u0000U=b\u0019>0~?=fE=`=\rw\u0015=v<)=[a<\"<}<L=\"=\u000b<v[j:|;am=2\u0006<<m=f=`=րY=P=nL=\u001c=SG=E=\tm9=D=%<5m=!=\u0019=0=\u0016 ;t\u000e{'=[-=\u0006=\u0018|=f\u0019+=\u0003=*=\u00042=\n\u0010=\u0002<y<\u001e<O\u0019=0\u0000>uj\u0001>\u0001<<1=<\u001dj=<\u000f\u001e=ɬ_\u0012\u0012\bp/\u0007\f/\u000eu=x\u000f=פ=J<\u001a=F4H\t>{|=V;?ϸ=3=סaμ\u000bTbK==\u001f=H<\tLr뽾*#=};X<\u001a.\u001d ]ܸӻT8<°\u0002=T<\u0011=<\\\u0011<ӆ\u0012\u0004VꆼtM\u001e)4DO\u0014\u0010<;598\nUlD<,;\u0005Ȅ姺*<ǌ\t㼉)<<;=(ڬ=䌦=q\u001d<Z<<\u0013q =Pl=:=0=:=<\u0016b<P)\u001f\\?p\u001ct!<@k\u001fμ\u001c\u0017\ts<Ƶ\u001e=\u0004*\u0007=\u001fq=s\u0010<O}=\u0017Z=*<\u00141=r=C胺p;B=u<<=.3y6\u001e<xI=\u0017@</\u0016=\"݆<\u0013=\u001c]\u0003sj\u001f\u0013׬<y_;\u0010\u0007=5=\"\u0010u=զ=\u0001w=`=>6=VN=U\u0011=[+\t=\u00063=ze=)=ͳ=d=.\u001e=yp=@^=\u0005^=U=Kص=`=ł==\t=P_J=V=hA=Ű==a\\=Q\u001b=<\nK<<4\"ӄ=\u001b=Eb=M.3<˨<bO<+\r\f=<9\u001b<\u000e\u001dّ>H\u0017[Iw\u0013E=\u000e<qZ<O%;f\n<\u0002=;<̀\u0001;\u0019<\u0010ں;o`tkT&\u0010\u0004=\u0011`R+\u00116MB<p~'\u0011蓔A]?1)Y\u0014;4\tIh¼\u0014IL+<#<\u00051=aC=a<\u001a7<t<\u0017k<h!<Pl:=8J\u000f\u0011ʼǼ\u001d'<o<T=A;\u000fdH=#iق<o\u0007W=|\u001a<\t=1/=LH{\u0017L`<b\u0016=E?D=\u0015L\u000e4<Hg\u0001;\\Sɼ?\fͼ!.:=ǎ=G=ds\u0007@\u001c%qR<==Ck<\\=pȩ=Qv\u001fL\u0019>=!B=\f\u0014=L=\\=yh=zA=\u0006D=p^=o~\u0003$*<k:av<Xi<H<\u000f=\u0017\u001f_5;\u000f=L==U=b=\b\u0003=4|=q\u001c=\u0007=,=)=[=zK=m=\u0016=[<!*=nކ=\u0014\u0002>\u0000==ic\u001b=5==ei4:=|۽==kN=7=z=%>=E~=\\\u000b<ּ_ru輗\u0018ڗ\u001d\b$9=\u001cw<H=\u0018k0V<I\u001b=[\u0017H_(<{<w=<bfF\u0018'<ɀ =+\t0<\u001e\u0014='\u0005<w\u001eͼq葽y4)kڈ<\u0000:KU9耽[9uZʽMypƽdө;\u0003޼\u000eUX<z|\u00141+\u0010<E<21=nh=<4\u0001n<d<Q</\u0007=y<O\u0005=\u00185=\u001c6=8=~=\u001e=~U\\=\u0002Wg<r+F<0]л~C<\u0019G<\u0018{;\u001dW@\u0012\u0014Y0;!=Y˼4;|={==p\u0003=ǣ<\u0017\u0011=\tw8c<\u0017ᗋ<DҼ(A<\u0010<\u001e\u0012<0\u0005=n@<\\f\u001c\u0011B\u0001=\u0001=kx=)fO;<\u000b?\u000b\u0003=\u00186itU\b\u0005\u0017}>꽥{T\\N:Ĝ\u0006+\u0019ټtۭxG:i̩<l;){|\u0015\rІL ܤ \"\u0000p?'ɽ\u0001Ž]\u0018\u0019\u000eּ4\u0002\u0017\u001d\u0005\rN?л,y>/\u0002]AG{e:|\u001cy9ӽ;Ud%=/=n\u0014㽵\u0000\nd6<R:>\u001c=j\u0007\u000bUܕ<\u000e=|m=]w^ѼPY4`{n=::\u0005=K_=Q=?g\u0001>^-a\n/\r<\u0015\u0013\bF%=@8;=\u0011\b4V;F\u0014m\u001b;5=8Vf_#\t$:J\nê$\u0011=z<<=`p!\u001fW5Ľ\u0016D<X=|\u001e=\bH\u0016w\u000b):h\u0003C\u0010=\u0016<\\r=?\u0007!\u0010\u0019o\u0004(ڻTU<-q\u0012H>q!;]4q)m):1ٽ:<\u001dEPnC\u0019\u0003\u000bZ\u0013zկս(I8<gF\\3<<\u0019\u0017=\u0005摽eۼ\u0007՘m\u0004\u0002%\r\u0006.!\u000fU\u000e\b|TeƖ<hO漴\u000bׄݼ\u001eLBms?6VD]쎽H-\u0016;i⓽#нz\u001c\u0018eگ2ýH݅)1\u00141*%gx./ \u0003N\u0005ܱ<\u001c$<{Jj&<&z<\u000f(ze)\u001c17Ž_<kx;ܿ<\u0011\u0005<Ȟx<6%<Iw\u0007q\n\rLԡ=-==?=va\f!=\u0019yk9}!=IG=\u000f<\u0005P<Mtܼٺ\u0001=f<J?<2<z<Rx;<?H,b\u000e?5o|G\u000e(>\rV\ff\u0010\u0007x\u00057n\u000f\u0012\u0013˼\u001f;;\u0016\"<,\n<?>=P<1\u001c<[\u0003=[\u0017;GڻZ[=-oI=cD'=)$<z\u0018;LK;v#\u001d\u001b1)9\u0001EH\u0000oB<\u001bE<\u0013Ǽ}\u0011}R\u0017w\u00172\u0017F\u0004d\ng;\u000b=\u0002\u0007=T;a\b=\u0003<\u001a©Vy}c,<\t{<ѳb=\u000b1=B\u001a=.<m-\b=\u0000\r=N\u001a;)C<bT\u0006+\u000f\u0010J黌`=T\"\u0018=\f=W\u001a~Dkؼ;{n'\ri<PL==؈<=~=OT=z)a\"C<WĻ<3=О=r=[\u0019mVgqxڙoO?W9=\u0003DA=Dǁ=ӄ\b^7GȨ=\u001c'=%D<d\u0001&Rkc\u0011;O<\u001e=*=5:<E򧻗ʸ:\f\u001a<T\u000e,=^\u001b=?<\b<\u0010\u0004<=&=)c\r4;̺d]<QANXթ\u001c\u0005;ِ\u0006qh0:X\u001d=j;{R\rռ<\u000eRYS<\u000e(\u000b=t-u<w=}'=\u001d(=r\u0018=<o\\<=\u001d=7=\u0012=X=;r<,=v=#=2\u0013\u0015<\u0001=Sp_=ʶ=6=SC=ϲ=a\b>\u0010>_=\u0002>\u0014{=\b=\u0019\u0000\u001c>x+eZ[j\u0010;#ٽĴ܃&Dμ\\I\\\u000b\u000e0le\u000eE\u0019Y\u0002LLŽ4M\n\u001f!IX%:zay\u001c\u0000CD<0W=F<;<XY=<p=J\u0019Լ80\n\u0012=<\u0007<:9=w+;:\u001cuR#w:r-=e5:{T;=>vy\u001d<T=`\u0013H!Ż{=zj];\u001a1<v\u0010\u001e\u0010<Wdڍ'Z=6` ;1X?M=/W\u000el9ԭ<\u001a\u000b\u0017:pC<O\u0018\u0000=0;>/D\u0003\u00112.;?ڻ\b)޼#[6\u0001ɼnVa\u001694\u001dHV\u0018\u0005V]3H(ʼ\b<\u000e҆;ܚ\u001a1'\u001e\u001fPY؂W<b1?={]a/6T!5<o<\f\u0003=\u000b-=,=٨H\u0010,WaJܓ2=I\u0011=j\u0014\u0017\u0016L~:Cd=+;b\u00128#;*KG=j<\u001f=3={=$<ɞ7=\u0003=t\u0014W0n^v\r\u001eU:l@ZNU=\\\u0000>U\u0002=\u0003n2Q<k\u0003<\\I<\u0011\u00066<\\X;fL\n+ݽĤ\u0015\fM&<:<<*$\"6u;PK޼&\u0018@WܻRȻ\u0005<iQ\u0015-;Ym<#Ч'\u0012;<H<\u001c<<\u0011=,Ӹ<0\u0010S\f\\wU=:U^:f==W<\u0018\u0003=ʣ<Ї<\u0010T=޼\u0000:\u0004\u0011=ʴrs=\u0002<.<]\u0016=Ƨn=f@=)\u001b=<<L=I*$=\u00169<j=yF=-\u0015=x;N<5Μ<\u0006<J<\u00073;a7=\u0001U2;1<}Ejؽ:ǈ}l0=*=\u0002=s=\u0001`Z=O=4\u0013=DP=O =U==P=D=\u0013=Ͱ=4(==Ք=5=Si%=o=+=a =[=|=Lz=΅=Im=UR<`\u0011<3\b=T*=u\f=Hc=?D\u001b=gC=#Ch=$<7\u0005A<=\t`==\u0013=\u0007̐=<?qA<\u001a;\u00178g=w=6,Y=Ӊ=fC=Ks=s=u=\u0003\u001f=\u001dŔ=kn\u0000>\b>\u0011\u0013>=={=\u0011\u001d>=5=Sd=<3X=\u001f==}X=\u001cr=F߻\u0003=ս\u0015\tbi\u0017\u0018޼Ž=^\t3^\u000e\"\u0000\u0019-\u00102ɽ>pĽ\u000f_齦\u0014Y彩_*OY*I\u001a\u001eX5髽(_ݽ+/<\u000fe3\u0016P</<v\u0006Y<fAOѽƭqn;<9c=u=R,=\u001bݙ=S=\u0003=\u0011\b=</=\u0007\u0001\t\r<q0=<\u0011\u0001<}-<Ӽ(\u001bM;᠂<*GX<\u0019޺4<]\u001b<\u001295s<\u001b=G;hm\r)''35\u0013=t?:Y`&\b0<joQpj@X`(%+}Y\u0001$:\u0012;Z8ʼʺ\u0013<Qɼ㩧^2=}lս5;NǽC\rA]~E\b;\u0002\u0014,##Gpqo9d齣!<,<<>ؖ;f;\"/=8>;\"Ļ\u0014L|;򝼼9 3\rqv\u0019\u0000rPܬ<\u0014\u0014\u0001=\u000eirh1՘Z\u0011=9gDB\u001d\u001du\u0004\u000bTa:5F=\u0014,=]=H鼲%sA\rw\u0006\u0005}սR趽Գ\u000e\t=&X=V\u0004=a=\u0001;\u0001lz=1I=m5\u0012;\u0001m\u000b;B=\u0007p=\u0001<\u0017\u0018%[;<=JU;Nܼ,<Դ\u0003=\u0004=\u000f|=ڜ<\fZ;3\f=38<\u001f<*A<7;'#V(mHڻ\u0010Ě?M=*O\b\b\u0010\u0001B'septimbre_amt.encoder.early_conv.3.biasJ 2\r<v\u0006<\u0003>\u000b=x<aZ*d\b\u0010\b\b\b\u0005\b\u0005\u0010\u0001B#septimbre_amt.encoder.neck.1.weightJdNL'0}\u0012E!x#(\b]Ӽ<x0qIU7\u0006,<DE.n=\bb$\u0002]i\u001cFR<1\u00182ֽLwռ\nG\u00161ʼ\\j4[<=\u001a=\u0005\u001eȼm;Qϻ$\u0001=-y\n!J%\t\fO=H=. ty=m=\u000f=`:<p<K=Q\u0002>(\u0014=IJ⃼ط\u0017=t=Hȫ)\u0004nY\u00069\u0012\u0003\u001fQ$XR=nM\u000f=v;iX&\u0002<\u0010=ZCa2>=5DH\u0014^;I<-U\u001e=1\u0017\"<֜١/<9<}1<E8=t@Qyo;=DJ|\u0002Q\u0010^<E{>;:\u001d=a\u0005v/A[\u0014=o\t=\nm;{\b\u001cF<l\u0003<<IA|\u0012)<+<p\u0011?D=G:=?<;K\u000e;3<|F<\u0012\u000e=<`K9\u0015=\u001a](\u0004]_=\u0011;uC7=\u001ca=Yua=\u0014<#U=]\u001a;EI89*H=\u000b_\f=\u0015<+\f<^j<ayd^%;\u0003=bc=:b}\u001d)<|stYԡ/;P<;\tS<<G=\rx=w\u0010<VFն=$\\\u0018Ӈ;#52X?w=?+\u0016\u0017pm\u0017\b 輸qo⽅ڻ\u0002<\u001a=<=\u0005{=<V=LYMټ`:F*9\tV=\u0019YĆ=1\u0001=,\u0013=\u000e\u0000\u0013~d<C\u0014=^Rk⑖W<od2=\u0015\u0018)\u0011\u0003<J%#4V*m\u001aک=td)=A\r=$L<ɼ\fw=I\rN\u0006=Yc\u0015\u00193!=֘\neSσ=9\u0002<L_W=ӬZBy=\u0011<<5l:Tb<!^x<'X=dK=|C*p\u001fQ,=HG;eV<\u0019$tfBH=e介i(=i\u0013<Ln<λ俱<!\u0005w=+\u001a=r<\u001cE!\u000esO\u001c=v޵;\u00166;\u00019<{VA!BW\u0018=p0\u00028\u001eQ<l{==A\u000f㼁A\u000f;\tlqǽ:\u0004<K<',~\u0017;`\u0003w=i¨~\u0001<\u001c\bX\u001f\t\u000f)O\t]d<ZL\u0019=Nཀc<O\u0017pZ\u001ah%p\r\b$=$:!;\u0002)<\u001d<xF|<\u000b<<\u0001C<피ƢҢ=\u0010ow<=\u0006\u0016=;=}y{=醠r<$/=\u0006<$\t=@BO䆼O8~3\u0017=tx^<.żFG=<觼}$uK=;̼\u0007=\u0010T=\u0010<c98<V<\u001fB$,0=i=]?==bGZ:&k~=ϣ{=@=\u0005=+=Z?=<\u0006=\u0011P<x\u0019\u001bg\u001e<;il/\u0013\u0019K8\u0012BTׂ=^=q==6;\u0011=J\u0015=B=v0<s=ۅ=0<.-aA׮<\u0004&=hE\u0012h<߻\u0002[)\u0000\";97K/=V:uە=pg1<\u0000\u001f9=ħ<\u0016hT=#\u0006\u0019<=<\u001d\u001b=<\u0002<io'\u0014\u0015tQ=z.\u0003d5?vC]y==$Sn]3O=\u0016%;m̮=Z'+=<_0\u0004=eۿ;!:\u0004?\u0006>--<e%=@S<\u001bU=\u0014>O\t>\fU=+>J>\t-\u0002=lQe<I=X>ڱ~2;ۄ\u001b\u000foA<x\u0018uP<\u0005&\u000f~k<ͣ2=;\u0010r<_A=%<g=/)=Ax=\u0001^=j<j\u000b===$³\u0004uF6ӥwm+<Iּ\u0013J\b=\u0005r\u0014+<9Q\"}>=4k=A=m={<\u0017=m'ƺv<\u000f0=\t6R=D>=\u0017\u0018Heue)\u001b;r=\n߼ƚH\u001bAӼ\u0001=Fk3ݽ>Yj(&\t(\u000b==#:#T\u0013?=\u0000>f==zJ;i\r=<`V=Xh\u000b=\u0000\u0010ܼh=[м\u000f\n\u0006j2]\u0007\u001c^:z\u0014\u0012!\u0013=M\u000b=e&OP:2޼v\u0000;M73!\u0001Y<\u001e;h:wZB<E)f=H\u0005ͼ*\tuS=$p=7\u001b=uټnC=ec=gs0BϊW}R<9b9;Ρ<{ԼWXΗ\u0004\u0014=T\u0017k{\u001dǼ\u0012Ec=aDZ<!{;'U<gj<-<'tzt<'s.1(\t\u0018!;5I\f<h\u0013<Ds>7GüVüӗ޼͏=\u0001=17\u0000=܀<\u0003]K=O,==Fy<W?=iT9*;;<f\u0016\t^˼<y}=<\\\b=sg\"<=\b=\\S\"\nc=\u0019\"=ѣ?-=\u000b\u0004\u0011=\u0011=}\f=\u0016p=?2=ځV=w\u0003kg|\u0012W=M\u001d\u000b\u0011l=\u001a<?I`&rF=9=q\u0014=ض=K=}\u0000=\f6٭<=3;9x<\u0013.:&=\u001fL\u0000/\u0013=e\u0006=T6<u<N=R=\u0005\u0015\u000b=<;ȋI\u0013<#f\u0019T<x\u0013<7\u0006=xּw7̩Y\t+<UE\u0011=\u001f4=}y<Ǻf\u0007\u0005D=\u0016,\u0015\"Ͻr6Y>%=Qeżh9Ade<i\u001f@劽R齿1C\t}=-ܧ=~=:=\u0002\n\u001eX9=Bh\u0003p3<;B\u001d$<\u0000t\u001eu[=_q\"<\u0004\b_=ǘ=\u001d\u0019$\u000fVemP\n\u001a<G2&\u0005*\u0012\u0016+z?\u001dռ\u0012NbͻM<M]=\b|=;\u001f=\u001d[<Wi\u000e\r\u001d+<>:\u001b2\b\rh<#b\u0014e\brC+4^PM=x@w^ddU=>;יj<\"]=!<iZ\u0004uڼ\u000e{\u0011= m']<u\u0002<\u0019AS4_p\u000f\u000bßjT\u0017࿼\fkG*^<g/\u001c?μyUo7}lݼ:%\u0019=\u0006\u001b;=Rq=H<k6=\u0011\u001f=7h#\u001f=6<8\u0000=vU<a<VI\u0017d<\tq\u0010엽$ü\u0001v7r\u000bM=\u0003*=]L\u0011<H؊=XQ5t)\u0015&;ټ<\u000bq=bH\u00189;\u000e<)<z%*/5\u001d<n<2DJ]6=\u0013Q\u0007e\u0015\u001f=+H=\u0005\u0018=܆o=\u0004:˪=Ã5i?:=F\u0001=x@=\"uw=M@Y<dF\u001c=m44G<M\b=\u001b<< <scgz\u000e<=E\f=IQB=M\b=Q=\u001a/Q<b;;Tt=m6=S\u0013<b\u000e^?@<m=ʂ\u0015AFμf<\rҼ32\u0016=`\b뼷v<;BO{\u0004.=X<O\\=2H=j<\u0018c\u0013<\u0010><ޠ\u001e=i.9\u001f=G\u001dZ<q=\u0013?<f=<\u0017<_>)<j\u001e=0\u001a1¼b\u0001=@<+y=?l<*yD$=\u0000̕=2ix<@b<0N/z<5<\t\u0006<2|\b<<N,n<ens=\u0002L=ɗNA=rNӕ;\u0016=<\u0016A=\u001b6=:q=-=6R=\u0002<2cBy\u0019TY\u0016ջ ~ۼ\u0012?.AW\"=-n뻎7̽FݲV\u0011<x1\u0016\u0013^\u0017O0;\f==\u000f\"=\u0004\u0004\u0016=%=៼=\u000b3NI\u000bL$\u0004\n\u0010X0;U<\u001c<\u0006<=o\u0017\u0002=+Y\u001bW=XPd\u0018\u0013=\u0015\u0019<\u0016\r<\u0018\"=В<IE=\u0000=!~\u0004=\u000eGw\u001a=\u0002<B\u0002;\u0018,2=6f<6=\u0019)G=j\bo=\u0000u\u0018;\u001ar憣<X<=4L˻弽!k<\bxƻ\"ռ񍽀¨z;Ԍ=4aA=\u0006=Y?x=\u00125=ye=ua\\w<\u0007t7*qߺ_e\u0001Yo=PϺY\u0010<N*i\\<f=\u00164$*\"1<\by\u0014=Pp=6\u001e<ȼ\u0000.;wu\u001d>\u001cb<[==|;8=ӚNg*G)cVs^ѽ\u0012;7=I<\u0018<\u0006:=D\tK=\rx|=_=\u0000(<0\u001fBHo =Sx\fp=ܪCF=\u0006 <ɼȃ\u001fkrSy\t5V|gq=]= <\rT\u0016=\t}鬿<3\u0015iE\u0004H=Ķ =\u001aZ+м\u001dM\u000b<;_\u0000<p(!&=D\u0018(rɣ<\r\u000eGC(<[\u0011v ,T}7/ƽ\u0002\nG\"|<[\n:<\u0001^\u001b8\u0010w\u00150oI\u001fܼ5\u0007N)'˽Er\r.2,{4m\fަ!v4\u0017kOG<\\m<NY\u000f\t\u0010A@Mr;\u0018=C\u00128<`\bм%e<\u0007l)cPfI:\u0007q<_%=\u0003)TޘA=<o\f\u0016\"<>\u0015N\nOp#\"ݯɳ<H\u0006I\u0001ߺ\u0006\u0000<!7\twQ=$[l\u001b<$\u0014\u0014=ŏ={<w\u001e\\<\n>=\u0010<v<\u001c:/+>Ҧ;w27p=C6<)Z>Y8=\u0019;X1\u001e=a<?\u001e=\u001a>\u0007Eo<@<\nj\u001bC>Û<7;\u0016(;񰁽H&\u0003\tF;t;<!\u000b|P\u0010\u0017\u001dB\tN;\u001a<<D<\"%=\u0006H2=\u001c<;ݗ=\u0013~=ۻ\u0011P=\u0013w<~۝<x\u000b<6I\u00197U0=qXe=x<GW=,R\u0011!<d>g,;/c\n\u0015;\u001e<xn <\u000b0\u0016:n3\u001e\"t'(=\u0000_\u0019`x\u001bƻU\u001f\u0002=8ïr5\b<J!U<4;s=V5vz\u001b<\u000b~\u000f\u0006\u0011=O<\"!ء=0\u0012J:Ǵ<\\M<Z\u0006\u0018t\u0019<<~|A=C^=s\u0006\u0011k\n<6=B;Y(=|<\u0016]l=\u0010ΦR?=V\u0013[\u001c\u0004Ly\u0013:8<4v=xꖽfm\u001d<\u0014~ulj=\u000fkҼ\tLF$)=/]\u0003\u0005K<9<f<*;лϹ\u0004=z\u001d<\u0012*b=Ȕ;Þ\u0017\u0006[ޔP;\f^O=FHA<\u0012.սQ$tv\u0007\u0015]|<8:85\u0019<l:<\u001cj\u0017c\\I\f\u0003Nv=x<lI=s\u0002;h=ͼ˪;9\u000eX\u0004=\u001a\u0016k;dQ<\\cPa;μ=L=\u0004 +;&x%\u001cw̼>v\u001c==괯<3[T<蝹สm+<~\u0005<\\\fh\u0001]W\fO \u001du\u0000Iӯ<Zy=)/O=5=)\f\u0015\u0003; f\u0014漺\u0019\u0018˜޽n:<B=htJ9=ED=\u0005ӻ>KkZc!9,<\fQ<=20*$/=\u0019q#=;\u0006=Ĉ<\n<<\u0015\u0013o<\u0015S\u0003;5=\n\u0011\f=\u0017Pbh^vNp|\u0018A\u001f<-/<\u0012\u0010\u001a=\u000f\r}\njϼP<':=:\u00005=M1.<Ė<툤; -B=D>=7 %=H\u000e%=\nͼ{\b8=\u0006\u000f=\u0000\f*\u0001\r=W*=ptM4\bf=Fl۟=I ;\u0002f5\u0004rUM<<\u001ff\u0000E҇=L`Z\fk<8=~wX=s솽\u000ff7\u000b<6\u00022;\fS:pk\"P|=G=\u001bD{=}i<\u0014>6\r1=|:=\u0002=!=\u0015˽3Ѽv=x\u0019<Dy<t\u001f\u0000׽X\r=\u0015;\"\f(HY<e<:=_{\u000bý/We<8\u0002ɏ\tYj;atD]<\u001a\u001by\u0017;=\u0003\u0012\"6o¼¼\u0006=a=_\u0013v;Q@+\b\u001b<:8ƻ7;\u0005v=\u0017޼I(eMDg=Ma\u001fi3<@<B<8_ڼ\u0013;I\n;ېl;Z*\r\u001dS\u0018\u001f\u0018\u000eG=\\'?=Uik[aѼ\u0003*\u001e\nTN<ǓI=)Ϟg]B<գ?<XQ<G<q\u001fJ_~<U'%<OzL^3ʜ<x£1A<ZY\u00168<\u001e<J\u0011=??=\f\u001cg嵼\u000f\u0003\u0018P=f>%f<<n\u000e\u0018;io<\u001fB<\u0017ӽ\u001aL<:\u00015<<\u001bǛ\u001fB\u000e5\rډ<Ѐq=\u001c槼k\u001cN\\\u0017<n\u0005\u000f=xr%Q=C\u0006=8$w}pqs= Pu=\u000f<P<ǼC'T=A1\u0019傽2R\"9S\"c=U3 =E<n;.=\u0002=!<\u001f=[c=\u000b'/=\u001fh+< \u0015\";5:\u001d><oژ<\u0003&=\b|;+\u0011;,=g<j-YkLbv\u001b=I\u000bW \u001a>gܜ;\u000b+q\u0007<\u0011<u=lj=m=\"/t<2NR=\u000b\u0016iy:9\r\u0001\u0013=r\u0000ϼ:\u001f֢\rλ<lߦ+U$<B?=}\u0017\u0017=C=#==b&>\b<d\u001b<\fT35,=\r#tl^\t<c;*.;,ʼüYC̽6IjZ\u0002itif#=뼽\u0012<\u0005\u0016^Bٗe<u\\\u0019\u0015I\"d3<\u001cC;]e ;1ļB񍼨Av;%u;],Ȱ$ފ\fϼ\u0007W<0\u001c\u001a\\<l\bp><?<\u000b%\u0014P\u0005\u0010=F*4+н\u0014{\fd<<&\u0016<G\u0014\u0015.\u001e\u0017j\u000f3V?\u0010+;Q<*'<\u001fo\u0006=\fBc\u00136NP޼-=vJS\u0005\u0015=F\u001d\u0004\u0014+;m;h\u0018{<c-#<Tt\u0016<'S\u0004Xe\u000ez8< \b6n7=t1=gۼ[MJo>\u0019qL\u0010ټv\n;=\u00107==3̸=4Mp<̨_=Y=h]\u0010=\u0017Y</z|Zn<\u0006p:\u001d<oo<(I=黾2F\u0006\r\b<Di<\u0011\u001eu\u001d\u001bR=Q\u000eM=Ƽo2=Yż~3<>=꼳k='$Q<a\u0018֮\u001eL)O\b\t\u001c=ˣD[\"\f=b\r\u000b\u001a<w<T.=@$5==!w@<<&8}\u001dZ!\u0017=:f\u000b=\\pD!=\"\b=\u0016̐l\n<|M=ME;rK\u000e;=\u000e=cPJ.][1=ټ<-i=C?=Y\u0001@%<f\u001a\u0015\u0000=-璻\u0007m7;<\u0004snHc=\\\t<)m<\\͠}:,=xVf߈E;\u0016=<@D=\u0003;==Ɏ)=|z-\u0014L=\u0018\u000f\u0003h\u0001=͙\u001f5뾕=-\u0013=?5;\u0015\u0016<\rY=V\u0019,=z8\u000f=\u0012/D=\to=\u0011=4`\u001d\u0012\fr\u0013;\u0016<1;Ȁ\u0000ud\u0004i<=\u0010Fk<$0\u001a6\u0012=\u001c\r=f=s\r=Igm==B\n\n>y=\u0004\"f&<K\u0003=)@\u0012><g)9\u0014\r\u0004\u000f޼`;m0o<\u0010MS=l5=߻<S\u0014<=d@I=S;<\u0015x=Ml\u0004>+c\u00009\u0018!\u001c\u001e\u001f<\u00144\u00107;\u001f\u001aUk(\u0011^m\u000b\u000f`@b=r!\u0018<o:и<T`<-\u0017<gp\u0018<r}<{͋=fXv1iB_v<l\u0019X;\u0007<>=v\u0004=n7=hK<\u0003\u0005s;w\u0002<m\u000b\u0007dwJx\u0016f<dV<>\u001dQ` !M=\u0001\u0004!=\u001d䟼I(;\b<\u000e\u000e9<5E\u0000gXo?/=w=>_=PLq;THs<_`\u000f\u0015\u0018\u000bLW\fRYdFB׽\u0011#=o\u0006O\u0019\\<^=\u001e=!\u0001>iԻ\u00133B+<x=\u0014\u000e<B \u0011$\u00105=\u000eI\u001d=@=<\u0004e;\u0011 =u\u0017><?\t!R=m`>+'\u0011\u001a=bJa]=${=+0W`\u0010=ׅ\u001fH1\rU10>N=\u000e\u0013<X<\u0013<\u001a=݊<m>:6\u0019L?\u0000Q3\\ܼM*}%3@=(l=6\b<_\u0001>ݲ=u&<BI\u0019T<|\u000fU<\u000b\u0004=\rE\u0019ؑ{%\u001d;<Pm=H.U:Ed\"(hC\r#=p=\u0010мk:8<IA<\u0011#\u0017!=1=\u000b<kܡ<[ҼyBEZ<_RF; \u0005-<o3]]<v=\u0006dɁ<Zu|\n<ρ#}\f==w\u0016\"<h<\u0007ڼk\u001e\f\u000b\u0014UO|Ћ!<,\u001f2\u0003:=\u0018&R\u0011\u0011{]fP\u0007c-5kA\u0016@<WJ<w=/<\u0006;B˝=\u0018<{<:\r<!5FX˼\u001fN\u000fyqt<N=\u000b;\u0014:Ӿ<\u000b|=<Zo߷4q\u0011BX~=@mf\u0007c\u0007\u0015l<p<1\u001aZ<_<Ahzmq\u0018\"!q\u000fb;\u000ek=\t\n0T\tc\u001c\u0002=Fl^v)tX\u000b=D%<\u001bCA6=3=\u0011\u0007s4\u0013~T=E?==\u0004=+\"*<kΧ<MU=\u0002<ep;z\u001d=p\t<k\u0003m=\bZ<jF$\r.<Ss̋\u0013\u001b\u0015\f-ѵ;伎`<9錽Yu\u0006<c\u000f|\u00196\u0017ꎉ<\u0006`!\u001c\u0011\u001e=FǸ<(\u0007=5\u0012=\u0018/=,=$M< M;;4pi;<eE<\u0016\u001d9Z\r=`\n=pҼB@==X\u0001<<?\u0011cӌ2.P[\u001a4`\u0003VeҼ<#\"<\u0007\u0010=X$={ּ\b<3;\u000f$=\\RE:7\"<^E8=\u000b\u001f\u0012҂%eR\";d<JF`ݻv=\u000e\u0007ʖx<Q=\u0003Y<\u0005\u001f1=\u0019&3=r\u001a:u=<\u001d=\u0000='\u001e<F=\n=(<9\u0017=O=vW=K=F<e<{'߼\u0010\u0006*=\u000e^'=F?ܑ<=2fU\u0005\u0013:@2<?u\rG\u0019սpbP\u0012Gd+<\u0003\u000fϻo\f\u0016mM=i#;\u001fzW\f+</1=Ab\u001fT<0`<j,<\u000fV#;\t\u0013=֨N\u000e7\u000f޽Xsܹk<l\u001a;(C\u0003(=iG6_J^=w<\u0014w,;ӌa?)͂'=?\u000f#\r<B՗Hg=}U#NE{\u0002<<'Ȁ\u0007<\u0003\u00012v3B3/Ȅ<\u0000Me3j.\u001cȼf\u0012=;<y\u0003\u000e<\u0018\u0000<G{=\u0019@ّgx\fU=W$\fAʫ;e\u00171Cm<-A=:\u0018\u001bc=I0=\\!ܽʖu5-\nW\u001cbą%{x[uK=\u0014=\u001c ּ\u00195,\u0013\u001e.;\\\u0011+SA0<S<L[=.==`F=ʅd=!<T+\u001eG<.\u001bhY*=QAU߼fS<\\<(0/4P w!~#^=6=i\u0010=#2=a\u0018&I<8\f=8\u0014=>[=\b>\u0011~;7%pz=e<gl\u0003<U\u0000=쓴=J=2,MVu;=\u00185\u000e=[̚=\u0002\u0001=\u0002=)<|+\u001f\u0010=\u0002޶<_\u0017\r=zA<(-=ll<\n\u0018|Ve'=VXx⳼b\u0019\u0018c\u0000༧T<5a<z;}(\u0010\u0003=\u0005;7|#=$\"=\n==8`=:\t~=\u0015\u0004=rO=\u00185\u0017\u0005=\"=@\u000f>\n<U=ӑI<:e=\u0018>JO@e9\fKO#Qʴ=\u0012/=Ɛk=U\u0016==]$[:\u000f<Z=r3<ދM^{<O<\u0012һA:R\u0002T]8R=qn\n`D\u001c0<NG<Df=b2=sbw<\u0016\u0018T=;==ꇍ<\\\bY`=[j1CļHѓ*H\u001e\r=T=M\u001d<\u0013a\u00114(<!g}<<ON<A;0]|4!E;iP<S\u001f=0$=\u0002i=XG.J,\u00145\u0013vΆ7=]z仗\u0014<V\u0018=\nG\u0002\u0012=<<&\u00040e\u001aB<km\u001dz<\u0000J9_\b\u0010-L;n\u0005\u0007\n<\u0000\u0011<]<_<p{m>;Ƭ<N)N=I:`AF=rIQv==o\u0010=$̝=A\u0001=\u000b9/%;K'P;\u000b<l\t<`<Лq:ͭy>ۼQg\u0004\n\u001c<gԽFyh<V=~\r=J\u0017;$\u001f=A}:N<V|=\u0015$=rx\u0003]ļX＾<ܽhf\u0017=L]Gţ>\u00078x,SZ\u000f(7׼ʹa\u001a\u0015=_g=ك=s\u001b/=\u0019\f=sr<q=*\\=;;2\u0017<&{\"\u0013kFR$=+T\"{\u0013\u0018=э/c\u0012[=\u000f6=v\u0017_\u0014=<Z/b;{=\r\t<LGz\u0000\u0013\u0005幜=\u0013c;\r\u001aRe\u0002R\u0006=;==\u0013<'1Kj]=D\u001f=@;=\u0010t\u0010\u0010\u000e=hg/=O=6\u0005<宩=u<e\u000e;nT<\"M<yMl)'½xbQ<\u00153\u0004#\u0005Mv5\u001f<\u001d\u001eO~{\u0011\\\u00157;\u001e\u001dr<$XA\"<\u0019=\\O<`ҩǽDOU,\u00127cf\u001ep=w\u0004e+=;y==\u001f=\n3<!&<G>S\b=\u001cs<Q=\u0016<E\u00120=\u00150=KR;\u0015xiL\u001a<$\":3\u0005G:<9M=*XX:><;'2<ޘpՅ\t\u001e!=\"FB2?=.y\u0004\u001bqH=}#\"\u0000\u001a@mѻ;aI\u0005=.z\t='ļU\u0013<\u000b:FG>#=5lR=Dv<c=}YU=6<ӽ\u001c<y\u0003\\jn\u0014q]ս\"<%K<Rz0]֕';C\u0013\u0005=\"\u0000:\u000b⼛<{\u0006=-\u0013918=V=6\b:\f=髼\u000b=鈽Q\u0001<l=\u0005|=\u001c͉Խɗ<\u001fu|\u000b>c齡aM\u0006==-|j<1Cj;d4E={1='ZvB\u001d< `D=\r9DXϺ\u0018\u001f\u0017<Ni⻉$=r;\u001a=\u0003v ='=$c=b\u000f\\C̼\u0014\u0017+= =U;%伱e[,<fӼ9G=\u0004kHH\u0019\u001d߽R;=~EʻB1\u001b\t\u001b\n\b=꽪\u0012=Gvj8$/Ԡ0J\"<~ǜ<J<j\u0017\u0007\"*;\u000e\u0015<:o2&*pPX<|@=\"0\u001c۽{m\u0019b\u0001<v5\n\u001d\b9<>\t=U߁\u0018\n鼼;\t \t\u0005=N\u0011O\u0002!>8+=c`LXyG<<r\u0006=e\"_\u0010f;<<_R=1=\u0018\"\u0002\u000e=:\u0005=[%e:m\u001c<y=I\"\u0003\u0004\u001a(sē':M\u0006\u0002\u0019厽\u000bT;\u0019c\u0000e<>'<\u0017_\u0007\u001d<;뮢<\u0003D4`e\bF=`e><ι7*Z+=q\\<@Pr9㼤ٽ\r\u001e\u0012=H\u0002q._k_\u0003!(=\u0004<8qs<\u001c\u001a\u0016+c;!\u0013Nu=c림<\r\u0000)ǃ\u0005\u001cD\t|]<wL<f=TO\\\fh\n`d7=־\u0016=2+ =X~ɽ\\:ĩ\t&\u0002=T<gq=@<-=u}=\b\u0004=\u0004\u0002=Ni3=\u0015\u0014=3\u0012\u0005=\u0011\u000b\u001b\u0003:\\\u0006=bӻg\u001f=\u0019\u0018b\\\u0004=b</=s;\u0018<[5:U<\u000e=[<P\u0012=pu\u001a8#ώ;xL=\u0007A=n=.=\u0011=\"\u0002=<=07=\u0017\n<\u0015~-DXy<A\u0005<=z <ce;\n\u0004\"'P\u000buhvL뼼\u0018ʞ#ѽ\u0012k$~\u001c<\"f&\u000b\u0016=Pd\u000e\u0007;*ʼ\u001d(=\u0004(<)jݼ\u000b=Z<Ϛ<\t:ƇZIL\u001dO=R<;Sc=\t{/wp\u0012=\tl:q@׭s<{\u001f<\u001b<?\u001f$\u001e;<\u000ePe?Ͻt_\u0001=\u000eacǽLC\\r:;r཯,nz\u0015ds<14%a\u0007Ҽ̻*=\u000e@\u00068#:,R7jsR<N\u0002=^<K\u0002<\u0012ʼ zE\nFZ;I<<=LD\u0006=[ vƤ<J%cBjK<i4\u0001=\u0007G\u0000K&z_O<J<\u001ayAw\\Q뻽#=\u001e\u0011<.,<\u001b2<+*i\b\u0010\u0010\u0001B!septimbre_amt.encoder.neck.1.biasJ@};k\u0019?`lH=\u0003=c=#\roc1RME=sn<Ut~=&Π=[=,Sһ\u0018xp5*v\b\u0010\u0010\u0001B.septimbre_amt.encoder.res1.0.layer_norm.weightJ@\u0004\u0010|?vao?҇?r??#x?+\r?\u0010\u000f|?-\u0005?s?\t}?m?\u0005\u001fk?W?\\Ѕ??*t\b\u0010\u0010\u0001B,septimbre_amt.encoder.res1.0.layer_norm.biasJ@\u00064=\u0007-\u0004=\u0017=bQ\r\n@\u001aR0\u0006d/=\u0015\u0010>\u001f=ޙ=SF*l\b\u0018\b\u0010\b\u0003\b\u0003\u0010\u0001B#septimbre_amt.encoder.res1.1.weightJl}p=%i<=\u0004pщ'$Ǽ=KQ<מʻ4j<lh6G8<OvPԽ\u0019=\u0007\u0011]͡=\u0007ėФ=Ѫ;4\u0015p=_\u001f\u0014 c\u000b=\u0015_!rV<˗\b<+<xC%`=I\u0004Ƴ\u0000j<<Э=s\u0019=9\u0003\u0014e-Ҽ`+<=;R7\u000fE\nݺ=O/DX>\u0000u2Ÿ9t\b>c=i;\n=F[<߸<{=K*<?<6*\u0018ϸ_?=+i,5MnÃL\u0011\u001c;QC=q\u0002=z)\u0018\u0011<q܇F,\u001a\f<[Ž\u001c<FӼܤ7=i=_m= \u0002<<T\u0013>\u001a<\b=q\u0012>\u0004õ(;<\u001c=)28=(<F\\=)ɼ\fsL?\b>P5<{y=\b=\fB\r\u001aлg>;B[3>\u001e=DSw>2`KE =U{<\u0019=i\u0007=hl!.V<<B`=\u0017<[;\n\t6V=7]\u0010S\u0016==?<;M:9?&<\u001cB;`\u0005<|\u0016}OfNn⽢追ۢ;2|Tۼ;@;9:E=\bP.\"\u0001=ʙ=dF=@= \u0016\u0013:\u0005zfpJ住wK=R\u0000=g\u000f=\b\u0011=!4==\u0015v\u0002=<D1=\u0018\u0004>q\u0001\u00177=z;6$%<wyػDn\u0006\u0016<GUټ`=`\u000e=vWnT:;\u0005=%AΣ\u0012&}>\u0002\u0000u1<\u0004w^=FM\u0003>}5<0HzTb<r<M=*\u0013G=xY\u0003=.<V\u001eֽDټ\u001fCy8p\n<py\u0007\u0017\u001a=n!>[S=$=U<w=)\f,`\u001cѽ$=Y\u0013\u001b87=\tܼ[=u<BAW,P޼ah<\u000e\u000e|\u0011c;a,-{;\u0019\u0006\u0014*RŽ=\u000f\u0019>\u001c>(M\t>x=].\u000f>?&\u000f=m<^N\u0012=\u0014=S\u0006<H\u0004\u0014\u000f\u0006=TN=v\u0011\u0019T߽\u0007\u0019=+U=\u0001Vs<n{^<ٸm=6(!=CO<D\t=\u0010=t=1\u001d=\b\u0001>>=j$>#E=_<$3=f=\nܼH\u0001=W\u001fI<Y:|pW<h?X>Xq<i<\t\u0016d=5=}slt=!f̙=i<\\`ͼF?Eeӯj\\',JbMC=\u0013<0nd$\u001af8\u001a=v\u001e<\b.=\b=D|=9=n&\u000b|\t=\u0010DLz;1=\u001fn}<b_Z<.ࣽ,\u0014\u001e`eg;!5\u0002=a1\u0014\rf;E=7O<\u0001XNgNm˽ѽP+;αȼ=!A=r\u0013잽\u000bY15{<O\f;5\u0013>=};;\u0011\n%u;<\\;N\u0010=Q<6\u0007>\n=Q<\u000ey='<\fkżmǹ;b\u0019\"L\u000b8:U\u0015ؽ+^\u0014}~{;<y$<G<̻\\{ü\u00028S|\u001c*;7n,=yKx;k^\u0002K=ٽ5a<q.\u001d_$͒X=:ϽQ<:[\u001c<D=Ŭ=Ǐ]2m1\u0014߽!ԆKؼ\u0014J\u001a\u0012μVݺ#\u000f* 2𻇋=bR=</\u0001;{p;\u000b=v~\\s\u000br-\u001cR<\r<\u001bQcj9!=\u0004a=<=\\=T<}_Na=\n-\n=<%Mi==v!C=\u00060=\u0016i(ɫǓ\u000f6ɻJO6\u0001&Z\b\n\\RH\u0018<\u0015;l<Ж[&*'mp\u001a߼È\u000b>֢=Bz=<:\u0011L=X\t\u001f\u001bvr`\u0005==?<X9ʈ<v=<Jh=\u0010ϴ=I<\u001c<iǝrEz7P\u001fe=mNr֩S?<\"O;,;\u0007<\u0004ٶ=\t=j\u0011_\u001eq;\u00173;\u0016=J<+5<IOs=p\u000f\u000b8<wK==\u0016<.ļ\u0013=ȗ=\u0006餽wJ|=\u001cT:(V=v=~}=35dX4φ=^:\u0004\u001d:\f==jIb<>󼃪b\u0005\tAEC\u0014=:=\u001e-w\u000f==[=Vb=S3<-q==\u001d\u000fR.W==}\u0018=\u0010\u0003=\u0005t\u0016=u޻7\u000f)K\u0003<(;\u001d<]6Ms#OZ=\u0010#=A\u0001=%\u0003<g0<׆\u0019`\u001d ;\u001b\u0004\\\r<a=Y=\u0001=17=RMm߬=\u0000;\u0002ښ<O\u000f\u001dI=ޙ={K(~<d\u0013t<\u0000=?\nWrKDi\u000bԙB\u000fN\u0002\u0010:w\u0010R|\u00184K\u0017\b̊%={\u00165=}=鼹L}=wL<._\u001f\n\u001fkE\u0010=\u0004;a#6C\u0013 s==/j,=^!=R=, =-=!=wj?=\u0012<<\u0017%f:<\n\u0015-=w<\b\u0015\f:9\f'j=x<ü\u0000\u001aѼu\"g=$ =/=*N\u00150\u001c\u001a=1\u0019J={\"ow9HٽA6\u0019,h\u0001ڧ;[<j1&{Z[\u0005=c\u001b<(r\u0012\u0012t\u0011<\r;&\u001cR=\u00190ҽ]7xp%\u001f\u0001>\u000b\u0018\u0014=\u001e1P>\u0018\"<}U>5@0=Y/=u:(!\"\u0018\u0003*o=ʛX\u0013{2\u001c\u0011A*=Zي\u0004\u000f]_#=!=!ٳ<Y\tq<\"\u0013X_==򫮻c\u001d\u000eaI}=7\u0000\u000f<\u0019=[%T==W\u0018 z\bԴ^;=\u001d=X\u001e\b[=\b\u0016\u0018<}\u0000=Cx辧8\u001d&ný\u0003=T=(\u001f=<󹦽e;gZQ`;L\u0011꽲N}5\u0001\u0003\u0014a J==_=V<5\u0012<d=\u0007<_=|nQh<8qH9;O@\r=\u0012꽐ǽ̩=R\u0007=ּ=pDs==yNjP\u0018U=3Z\u0010\u0006ὼZ\r=\u0017=J=\u0000=S<ASR<\u001dB0C=UO=n===\u000f<Ⱥ<-RwB\u001b\u001akV<\\;<\u0000\u0007>s=aϧ=@S=g=|M\u0003<07==\u0005ad<챏;\u001a]=K<EAS=ۓ6\u001bA;\u0014eBG{<=\u001e;F<\u0013\u001b_»Xץ=#ޜ<c3;s=r=\u0017=đ=˹9*=\u001d\u0014wf\u0000\"<\u001ec=N\b=\r*lQ[o=\u001e\u00079\u0012;q\u0015\u001bx=ݸv<Ž)|M\u0018;<K\u001ezY\u0015=\b\u0012\u0011=\u0005=\u0011uz;!=\t?Lu\f=Z/c\u000b@q\u0011v8=$>@m\b=mh==9\u001c=\\V;k<a!\u00008{̽N|^t\n\u0001..=P\u001c\u0002^F=\u0007=t\u0014DX<X&m>ֽ5=Rt<\u0014==h=Z'Y=8==<6i/i4<\"da~\r\u001c=\\\u001f\u0003=E~ύ=9*\u0015='I\u0003=׉=Z$\u0010>AD\u00072v\u0002B큼*{?\u0017Q\f\u0003=G'<=V=.'0\u0002=\u0007<S<tսnN[\r=}?=t=yZ<C\u0012G]\u0016~C<Wm<Gk==\u001e_Z=\u000e^=\u0004=|=K\u000b`P\u0001=5\u0000|\rt<ٜ=m'\u000f\b =RAb_\f\u0007eŽQ\u0019ƙ<\u0002\\uL<Q\u0015k@=><8j=q0QV2\u000f=<wb_VqO\u0004_!<?<=4\b:M;@=^+<k߇fR\u001f\tG\r?+;cL<D\u001e=!\\\u001302=rjq\u0019;力V=,F\u0001:\u000f\u0016`#o=s,==<7\u001d>=\u001f'=7Vp\u0017\u0002R\u0014===>7h= t<'\b=YY2g\u0002=\u000eJ=m<\u001c\u0003\u0011\u000e\u001c=S\u0018=q<\n_Q:\u0014Bȼ\u0006\u0018;=@\u0010\u0015z==\\=ݡl=V= 5\u0000=ze=:=fȼظk=ղhyr\u00033=G=\u0004`;T=w$=zɻdn;\u001bżp=^=\u0002t<XŮ¼\u0019U<Xl=2=\u0006>A4\"<T=\r,=w=Z\u0002F=\u0015\u0016\u0006>a=e%<Ɣ\u001f='u=HMf@\u000f{9<\u000b'\u0007=T\u0016\u0016̽VռԒ9M<R|Ö;ZU\u001aiT\u0007=\u0013#\u0015\u0010\u0016\u0000\u0000\u0016!\u000fs\u001b:b<M\u0019ѽ|\"wi\u0010=ׯ<?\u0000=;\u0010<qT=-<̰-I;V?\n L=\u0017K\u0000;\u0017<kӼ\u0007uB8<]n3'?<q=<cExOm=#=J=)`=<ǽ;|^,<\u0018<C==\u0012(\r<\u0014=tL<0=\u0017SXVf< |r<=<\u0016o=Y\u0006:Ae=y\u0013\u0011K=\\o<\u0019B=<y=|.;}6=ɇ=3=)=߿=P\u0002=K\u001c\f\u0005=|=W)\u0014T<\u001f.߼\rF}=$<_*=%<A]\u0004\u0006\u001d\u0001>\u001dDQ\u0011&c'\u0014\u00172=,iнOm=`Aj<\u0014=q<t\u0017\u0011A_:]=\u00036=Of.n\u0000Խ\u001b \u0001h=<\bwܼ_==t;X< =eh=v\u0015=\u0016|c卵_\u0001Ώjz\u001dܽp<dֽ:|۽v;؄\u0010>==r\bY\u001f\u0014]\u0006>KB~W]M\u001c?q=\u0012\u0011\u000e=~lወ<2\t=q=[r\u001c;2ڏ<d<\u001cؼ\u0017<)<.x\bQ`=Wj!f:z6=u*=\u0004=\u000fX|֡ŽDuvnq;\b=6=O\n\u0002;+&XlO>;q=)\u001a=Q!f<\u000b-b\u0019=1=ql[Ѽ\"\u0017;\u0007S\b\u001e=1LƼ<g౽Z;W^5=ռ:֛ڼ\u0000Siމ|=w\u0014w\u0005<q=ɇ˼\u0018#==-l \u0016;At9E\u0014*a\u0012f=w\nG=T=d=z8<\u001a[a\u001c\u000b;q\f\u0000=h5R=}[~\u0000j=j\"\u0011<\u0019`/>\u0016<[z<#Am<=\nfC=\u0000-\u0010>Y=+=\u0004L=i;\u0007\u0019W@\u001f\b\\=\u001bʽ\u001cѽ<j<N=FDK=%=1.km㽪<dO1\u000f\b<;.=\u0003~[\t=\u0000i=Ty\t;˫P8Bq=H=\u0004\u001a=E\";;&a\u001fm\u0012Ɣm=i<\u001b@$m.\u0014<Ǚ=:;,\u001f7\n\f\u0019=NO'TbKtB\u001f񏉽'=Α\t\u0011\n<x[1\u0000\u0007y\t>x<?L\u0011/='Z<F =3)\u0003=,}2=V\u0007=Oq:Kd$=\u0010(=\u001b4<\u000eb=fD<54\u0005\n:9=՝)!_{6\b\n)J\t=v<؜ٛLɽq\u000e<\u001e)0=QaO\b3k\rF:u\"<dc<\rlh=\u0014ǽS0\u0018܆Y=\u001f$<\u001bdN'\u001f]=@?\u000e0=X==!>x/0<\u0007=Eڽ=v=a7>)0z=Gt==Ѻ=\u000f\u000f=oh<%f=rQ*J'=\u000e2=848=\u0017\u000f\u001c\u0003m\u0001=VX.n<*<+m֙=<=/婼k\\=\u001b=oU=\u0006\u0001 =%=\u0006U=5aO$\"\b\"=0=1DA#=\u0015<[擼8E\u0013==}\u0016aQ\nZ<A盺<\u0014v=oı<H2=#I=l8\u0002\u001aI\u001by\u0005\u001c<=`g<R<l\u0014ڤ<=^=m_\u0001i{)\u0001O=6=C==g+9\u0006\u0012\u001d\u0007~;ʡ\u0007heǼ:\u0013Ѻ== hM<b=زQ=Q\u0013ڽRɽԽ󍺽Qn<o7~\n\u000f?\u0011\u00155ma\f\u0002<߄<[\u0019\tdf<D~<n~!\u000b/-)#<)\u0011Ƚ<.\"\u0017C=DM5\u0015wX\fr\u001f\u0001\u0001<=\u0010\u001b=\u001cL\u001a\u001dhY\u0003ü)N)Ooa=Zו`\u0017>\rO\u000b\u001f=\u00133<̽+:=̖!>\u00006YM=q >T~/a=s;*㼶W=Ox=u׀\u0018<\u001e\n=\t(=\r\u001e<xM=\u001f\u0003\u0015Z6<\u001d=ePDfF,S\u0007P/<wsicǽD~nt\u0005=9f5Î7=C\r\u0016\u0005=I=\"ٽM==\u0004<#\u0007;i=w=,SBuY㭖< .=4= <{=R)k6==랒@?\u0005:<\"<ҽk<h=7<:\r>1%=5=\u000f=\u00147a=&L=M><\u00029p~=\u001ba<j=\u0007½y=4\u0018>ӥ\"=%=Qd=7\u0015;g 0:<q\u0011\u0003Y\u001dL<d͕:+s\u000f\u0006~RZ \u0018\f\u0002W%ƽ9~C\u0013(=\u0017=˗<Z5=8=p)==G=n=ټő<7\u0002;\u0013όT<=\u0019\u0016XF?\f?\u0014G\u000eu=S\u0012̧=\"*u=\u0017>۽%:\u0010\u001c佮OWwq\u000e:!L\"=ۼq\nP7X=\rB^)ĉۼ;8߽½\u0013p\u0012G:7ˋ\u00059Oy\u0006mgVn3\u0016===\u001f`=~<$\rt\u001e\u0014=\u0006\u00129;#b\u0017=qf;<<a;3\u001c9<&=\u001fV\u001dX.J=T<=˼BV.=J\u0012atw]*j\u0013=1U\f;[;Я¼<Hz<`NûCOݳ=$\u0001wb=x=F$=H?-%e<r\u0005c<\\y@=sM=\u001djk\u0017=\"=<irn=N̻R L==E\f=n\u0013=\u001aL\u0003\r\r)<\u0007\u0004=\u0010<7=\r=<H\u0016;Jh=<\u0003U=K=%)=|=Lȅ=ĳ=\u001f\u001b3=o=|6\u000e\u0013S;'=BݻR=\u0012-<>\u0015\u0004=ș~w=.\u001eu=Ϥ==oºRIL;SJnd\u0019&?\u0013G\b=EV;A\u001fû,`1\u0017Լ)\u00137efl\u0012=&&\"qZ\u0017t\"P\u0005\u0001ת)R\u000exj\u001c\\\u0013=e\t=^\u0006<<@/y\u0003U`H{\u0017?\u0017=(7<;=P\u0018==7\u001e=6=@{K=\u0010z=\u0018S{;2+6\u000e=ϼ\u0005\u001f`\u0003=:<\u0003և=Ƶs=!g=\u0013T༯\u001348==W\u0016B\u0019/<-x'/I\u0013\u0012>RV=\u0014=\f<1g<\u0017<Ѽ\u0010\u0013\u0003<\u000f_,=@I;?=enl=\u0014(9=:}<٭<\u001a);E9f^=7⎽bR˱9FQ\b\u00037@5\nWt9q\b>=2h@\u0002\u0010,=0\u000b=$\u0002<\bK<>=[A^~<:\u000f<S>=\u0003V<Kp=\u001b\u000b<lĻ\rX:}<?t=u\t\r{ڽLݼ;^Ep]?=\u0007g;\u000es;ƨ=u=3=}*C=\u0002\\Q<\u0000~=g\u0005`=u==\u0014\u0004^<zNH$¼\u0004$':Q<?==*I<\u001f|F2#<Q\nB=:=\u001c5tI~z\u0013<\u0017s:懽4\u0015L(\t\u000b\u0004P(Z=H\u00040Y*Q<g'_W=tR=[<_=\n=|\u001dFѺ<2<=\u0018E,<2S=X?%=\bv<,c\u001f\r\"-7\u001f=*; r'et<;gRac»1\b\u001f|禼\u0001ɻ-鼶}\u001a=T\u0017\u0002>9}t=j=\u0003h<=r\u0017?>|=\u000b=$Y\u0000\u0013;Z<:`W<4<L=><Ƹz\u0010\u0007QC<f|\u0015q<C@=L\r*cŽ4;==tb\u0003KNNBc\u0016=Ɖ=\u0012\u000bB\u0013^=^R=u==R2=c(=l=މ<\\^=\u001a<ڽ<\u0013UX\u0019\u0007<\t==@#=\u00139=E ӼR<Tأ=Q0\r=$»ź=\u0019\u000b=\u0000\u0016=oi<=疍=gꂼd0=0tpC\\\u0010=@\u0013MNO޽h^\u001e\u001bk=d|V@sג<?\u0004:D6(?<\u000f\u0002\b1<u(\u001ao<|\u000e\u0018ȢY1Z̼m%a߼Yq=\u000b>/Oc=\u001d<j\u0005ϼX=k=G?2m=w={C(\u0004>\u0000=㎸<&'\u0015=\f7<o?V8=\u0017\u0011lX-Ҽ:'Ờ:+eQ;wս\u0001=^Ӽ\u0006=jYx<7=j\u001e<=~(=s9=\u00058pl o;,ݮ<\\-=I4=t9=5=V~{wQ\u0017%\u0017&<ߦ;w#\"<X\u0005\u0010=s@<C\u001a=ѱ#<\u001d=\u0015==&qRi<ZǬWQt\u0015\u001c\u0013=V4\u0016<=\u0011>\u0012ꬣi2\u0003\u000f;A(&\u0011=\u0013\u0004\u001a=\f=Ĵ\u0005=zA=j=\\n<ȝ<ĽV\f='{<\u0004=\nv=Bq}<k7<~\n=At=j\u001d;\u001bϽXp<`\u0019\u0007=ʽ:^:y;fr<}=^J'\u0011O=\u0017Up=\u0016xC<k#{\\[e=Vz{SCz4t\u000e=R\u0017<\u001cQ<Z=\u001f\u000f>\u0013\u0017<8Rg=C=iy\"kt3\u0013\t>\u0000E&\u0013F#\r)/<\u0012\u000e\"mއ\u0003!>(;FƎ\u0017=;[<=5\r>4=!<)%4X\fA\b=\u0017л{=%EźM]\u0010u\u0017`HiOcv;9=:vZ=3<=\u0014z;2=sU_==\bcnCac=Rc5x<Ph<<\u0000x*<r;}%\n>\u0014t=p<f<%=U2='~$=򟣻{3Wڐ9<ʧVoS:,-n\u0002_<.\u0011Q\u0001\nzj!]̽T{c5E=I<ogL;;=d-=C%l<C\u0018YE='7<\u0017=.<$f)V=Bj!<\u001c\u0003H=~b\b;A*US@\u0018\u001c<_\u0018Կ0=f\u0017\u0006#=)\u001d=+I{h\u000e=/Ev\rO+<}\u0010ڻ!\r\u001cG`cB⽺w=<<\u0018\u001e\u0004==S=Z<g<6=%Ͻ\u0017\u0015By`r;3\u001amE'֋\u0017=Je\u0019;];=*\u0015\u0007\u0018=A_=\u001a=;\u001bȪ\u0000=\u0003<\u00149uw=vR=\u001a\u0001\u0018\u001c\u001b\u0011EK=*:5W\u001fA=Ɂ=AzGJ\u0012`7\u0005ay#==;==沼#=_\u001a<d=1U1W<:$=s\u001c\u0005=\u0017<,\fo=7\u0010=i<̭\u001e7˽Z<Nݼi3;*<fG\u001c\u000e]$=X\u001ba\f\u001c=H\t=>K<\u0005<o=Sӽ\u001b\n0$\u000b=c？L;6\f۟]i\u001erQl:ֲXv\u0011`?<\u000e=@\u001d0\u0010=u|\u0001I==Oϼ\u0018i=pY<ΰ\u0000>@/=FA=Pʼ\u000e<C\u0012\u0003<\b=\u00196=X=pBQ=U$\u0018D~hU%;l0ޚ=v\u000f=4*M=q=~4W=Jn=\u0019=<\u0016<=UlM<*\rF'=[=4=^==C)=\u0011=m=G\u0010λ~XƧH;\u0003R=P\u0015=G<\u000e%=\\=/<\u001c\u0013\u0005L\u0011=Y:P-e˻@^<\u0006'U<\u0006\u0016d1\u0001e=d\t=\u001aFbB_::%<v*½ixdg8cT\u0010=lo<nɶ=zȼ,<&ɼ:\u0003q<\\\f=L:e=ŚSq\u000bƋ~K=;\n:@ʂ;hZ<\r\u001a~=*\b=={\u000eY\u0015Ĭ6\u000e׽䞗v\"P$=׳=-=?|=;h,=AD=\u0003̝=\u0018p;=¦='>;tohW\tP3$=<\u001d<\u001el;)A_Wd<=\n\u001dV0=\u001fp!KqmǺ\u0013x<04b2:\"L===J<\f\u0001j\u0017\u001fü^.ӻ}=P+Ff\u0016<>6\u0019ԟx=ǃ=q_=\u000e<b<><A;]Y=`F=\u0001e髽+\u0002^#$4Am3º\u0005\u001c}ǽ\u0002s)sgG<_3=\u000eIv!\t=ㅽ\u001f\u0012\u000fxKK=\u0017=<\u0005T=\u0018{J~!0=K[Ε\u00156Vݛ\u000e=\u0001<==ҹ䣯8<JK0νH<B=ּ=ޯ<>zx&8\r\u0019l.=-\fA؟\u0013>Q罯мP0Dvp;=.\\:gk\u0015s\u001bk<sW=\u0016=pe\u0017>l;H=xT\u0000)=\b2<E6@\u001c=\u0019\u0015;+8=\u0003>`ͣ==S\u0018=\u0007»<\u0011D0[\u001e2ep<%UŽ\u001b?9 <0==U1BǲW\u0002z<<5=#(.Y#<Qړd\u0014\u0016\u0007P\u0004d\u0018=Q=\u0017=Mw=&˂Ea_\u000f\u0002>=\u0011=AL=+P==\u001a=(=Z\u0000ZDEc\u0011\nёBw=V̽O\u0003>#CqB\u0017#=a\\hF;<\u0006@V<ɈZoK\u0000=&]\u000bj=G=<vd)\r+P<齢<cXR5\u000eTlt}4=䴻uмHX,\u001a=\u0018-VA\u0019_j=z*=\r.=Yv.چ<1\u001f=9\u001b<ܷܼ_1<*ѻ<1]=c=B)=K=\u001c:<1=r=ٔ<}V=\u001du<н=s<V̱<<;Ew==TU=~\r<4=O\u001cv=\u0019>u6:\u0007=~\u00104c\u0002'=<ŖV=O<\r<^=y<A:#\u0010=\"ẽ\u0012=\u0006Ja\b\u0014n=\u0013\u001d=4\r>7<aZb%\u0002xiż\u0002,*Qu\\<1\"S`{='=s5<ﻖ\u0004^\u0018]=|q;-ѽ^_ٽB=Gf=9[+K=<H+\re<\bͽR=͟92Hcdw\u001eRX?{\u0003>/j\t<\u0010\\M=L=(`=y=s\u001eY{<\u0006:=\u001e=6;\u0013\f<;t+8ܻcV~\u0006\u0014ԁ;\u000e=\t;6b= ywv=0m=\u0011\u0002=>=\u0006N\u0016=D=\u0015\t;Lp;\u0000>\u000f-\r=w< \u0019J51z=̼\u0016\t\u0015<oi$uY_=jx&>,<\u001cNI=~N\tH\u000f\b==o\u0010> =מ=}<\u000e8\u000b=\u000e>\u0015=jǬ-Bȼ}弟\u0017̪ۧ<\u0018=\u0003\u0004<\f=\u0011[<=%<PC3F+=!=ɒ\bQV<Z罹P!z=BǼ\u000b\u0002^T\u001e\u000f<\u0019<T+s<<:GZ<t\u0011^g=\"\u0004=ҊWU\u0005=i=$T\b=T\f==I=YCd=v\u0006P\u0015=\u0004A>4\bs7=9p=\u00079=<\u0015)Y=?\u0016=9\u0001=\u0006=E;?=08=\u0002A1=\rộ\u000e){<ц!q3c<Ѩ\u001e\u0018ֽ?m\u0018?e\u001f\"Qob߽눽\u001fG͢|$꨽r\u0014\u00130=ÑZS\f71=_\u0018<@ٽ\\\u001f;S\n\u0006.ؽ\u001e`@\u0004=m<<\b^\u0004=6;\u001dQ\u0003/DbI\u0005c{\u001b8T,=ʻ8\u0000/[}==ai\u0007\u0006<j5XR\u0013^=\u001eR<\tpu}=6ނ=֕\u0015<o\u001e<=C(=)\u0003$=\u001am=\u001e׻Z\fJ\u001d==/;t\u0006І=n=s\u000f\u000e-L\r9=2+\u0002lBAƼULü`Uc<j\u001ei\\=k=\\a<b<\fD=M\u0017#\bMZv?/<fz%\n07M<\u0013=<sͯ<\u001bwW乩y]Ϋ<\u001b=&`=ƾ<ZB=fA\t\u0014=<%;7=rg,\u000bc=\u0003=\u001cD?f=\n<a={=\b\u001f\u0006==p!>==Bք7=e1\f=)]\u0007=~\u0012>L&'5=`yu滵&޽\u000e³W׼\r=;R\u0003<5\u0001m>W =g;3\u0016\u0000-=\u0005\"\u0005=\u0014\u0012={\u0016κ\f?\t=\u0014͞׽;E<zL=`\u001b=\u0006\u001e=!=;3\u0013=;6U<./F{3\u0011<8\u001eK'\u0015|`\b=qE<\u000e<;_v\u001a=䘓=YBb=X<H\u0013z=̽h=Q<=ُ\u00138<]=DǱ8^<\u0011%=z\u0014#ʩJmk8=_=|i1pG=5r/>\u0015\u0019>ӯ=Ό\u0004=ہ<\u0002B\u0005>@\b=,\u001d;se=g<T =/7@<[<L=O&x=O8q=I<j=׎b=\u0004>-V=3\t-wɽ;D;-n(:_<\u0013<%N=Ϥ\u0007=<ݼO<\u0010:@$&\fRX6P)=<\u0001g<,\u001c<fC@Kk= <\u0016ȼJ\b<o=\u0000=|<c\npW#\u0005'<\t=,=X=g=!j[<vK<ϼ\u0016)=@;\u001bY\u0018C;\u0018\n<j=Abg`gn1@*<吩=(\u001a=1\u0013;(=\u0000/=>==p;=_dqi,\nd=\rqLcqL\u0015\u0018nʼ-<=z=.\r=*\u0001\b\u0018\u0010\u0001B!septimbre_amt.encoder.res1.1.biasJ`.1^>%<\u0011,(\t>xý\u0019X=BzkQ=T+:d=hؿdż]-μ\u001b?\u0004\t=]?@O<@E41*l\b\u0010\b\u0018\b\u0003\b\u0003\u0010\u0001B#septimbre_amt.encoder.res1.3.weightJly)=^='D=\u0017=\u0006\b;&;Rl<!\u001e\\~;qz\u000e\u0014j ;1=D\t><\u000b>O3K蜹D3<U\u0006>H5\u001c>S\u001e>V<?c\b<<M'=;Aj(=MM=缑=}<a#$35<\n9^;;s\b=j\u0011ֽ໋W\u0004\u0018򙖽\u001c 1\u001f<1\u0013E8<Z׼p\u0003օL=:=դrh=n0нE$\u0000<km\u0006<\u0014$\t\u0000u滭;*<\u000eWmtqHj\u0018\u001c26<Z\u001d=xZl=\u0002yt=0/<BkT=YJ=pbC\f伸E<!=C\u0018<\u0010j\u0002ʼ-vWɹ\u0002@*='\fy<-򼦋>\u001f<%k,\u0010C,K;`ZF=5\u000f=n=*n\bH2;<\u001cؼ}F\u0019\u0017y'\u001ciJc\u000f6ۉ\u0013=q\u000eּ(=\fK\u0005=j\u000b=vY=;#T=߹=\u0005=f\t>%Ȼ=\u0002ʼ\ri= ==O<<<+m<N<+Gu=<@!\u0016X<|==x=-=1=m\u0007>9=먽\u001f;P=Q\u0000Ze<!<aJ6Ow2\u000f]<DM='\u0000{;A<\u0005<\\\fP[<[R`==s=,<C=@=+\u0003dC~\u0013:ҽ\u0006Sѽd<\u000b;|<K\u0017\\q<W<\u0007^y߼z\u0007=\n\f:\u0002=4Ｐ\b\u0011?<J\u0010=h=@͂\u0006GɽZ\u001e=6#\u0011PD^܁ѣNz\u0015;b)y_I\u000ed`=\u001e\u0012~=Fw=\u001b6\t^1=A\u0011\u0016ν3=\u0018;=ӺA\u0003\u0011 x=P\u001c;hAн<\u0000<~<[\u0003$u0}⼱\\<Rk<,C<\r=4\bFּ+H\u001eBڽ^bjQRF\u0002˅=g2>\u0000<[ K=żr<o=_=\u0017(<=Pۼ=\u000bw=\u001d{\u0010=:N:sl<7r<2Y3e6<\u001d=;T\t=U=E\u000b=Iv==ŷ=l#ӐSm=\u0007;<d\u001e8<\\\u00157<\u001e\u001b<yע=}\u0012<.\u001a{\u000b<^ѽ?S\u0004E<\u0010=\\i==G\u001d*\u0001SRF\u0001.b@\u0014=\b=\bX=N+*\u0016<^>N<zRmȼ5N<\u001cS=\u001f==\u0004y\u000b=\u0013><\rw)\u000f\f=\u0003=q\u001bH\u001e2I[L=<iB\u0010\u000b擾>F\u0017(\r1\u001a|]i=4\u000eq<ZN4<ԑV\u0014;2\u0011<q5:r\u0013Ts?ּ\u001dF=\u0010jC=(i\u000f=LO={>=ڼQ<\u0006컻P\b2\u001a&=(F=t;yFq=%E=\u001b;c{\u000bX88\u0001ۻ/=5=d<JG<p<\\IP=D\u001bfg-t\u0017M<N\u0011\\\u0011\u0010s\u001bwj<#'<q}jL<(\u001c\f=myӽ$%Y\u0013\tE2V<t#ysW(\bE\f\u0001K;_<UՐHǼ_\u0001\u0013\u0006\u0002\u0004=d\u0019=t=\u0015<˴=\u001a<\u0001\u0012\u0005@9^<~\u0018{i(:p.c=m5<tM=O2H~\u001a\u001fo\n<ǎ\u0011ϝ<G\n<4RB\u0016ؼ<r\f=ƽ]\n<=\u0011W\u0006\bm=b[=a\u001fkٽ>8!O\u001e=Cv=K\u0007\u0006јt\u0019<5=4\u0001{;܌¼\u001dk.c*::\\\u001e\"7<\u0019\r\t=\u000f\u001c=@= CI.\t;G;œ<yrfl;=->w*6`<𐼶B=j<{P=Z\"\u001f<D<-=\u001f<m`m;SU\u000eV\\};\u0002d\\\u0016?o⩽:PK\u001a,\u0005=;i;ݼ:H;Dٻ:\u0012=Y<6b%=(@<楽\u000e<TIQE=\u001b\u0005=\n=%=`\u0002񻊆b4=<9\u001d&g\u0019=\u001a<̨<ҧ\n=:^\u001c=<Dٽ\fe&J{G\u000b]=\u0012O=\u0018*====Tϼ_ce=\u000f~\u001f=޸cm \u0017\u001f=\u000fd\fw\u0015y#U|=\u0006<2<P =\u001dnp=<I#)W\fW\u0010<D뼜Q<K뼾\u001f;\"`xl4=\u0014I;B<8,=h\u001eG;\\\n<\u0004=\u0007м\u0010<,1=\u001e)5\u0019\"s<\fnJ%><<^\nļ\u001bip=%\u000bcy=<\u0010^\u001bPEer%\u000e<{CMåL\u0007@\u0007n\bZs;\u0006=\u0004<2\u001b7<Eۜc/\u0012=H</<x\u0017\u001dtu=t=23N=R=#\u0003ȟ*=ƽD#⃽)PüEu\u0013׺5\t(<;;㋼,%<\u0017P=T=#a<\u0013D{<+<G\u001e=\u0011=y\u000fKT<Dr^;\u0015=h7.=.;\u0006<M-\u0011ϼ*\u0016ͻt㏽¦<U;8\u0006ڼ3޼\u0003\u0004\u0019=\u0011bu<J6;\u001fE\\lH~vAؼ2+Gͻ9\u0010\u0003=\u000e-=\u000eT=0x!={B=$\u0011#>o=9(=p|<}\u001e @Eѽ\u000f>wO\u000b\u001f\u0011=&=\u0007ҽb4\u001dk;Xy/<$<+i=\u0007}U==m\u0015h=WͻO=~=\"üX=-^=/N=85Ժws=\u001e=~O\u0011\u0017M\u001bM*\u001eY4=Fz(\u0011M\u0004?5\u0001F\u0004N\u0013$`<\u00015[==)ƅ=H~=Q=f[=\u0006=$=u=L6X=\u001a\u000b=oOq=\u0017\u000e\u0003==\u0007\u0019=\u001f>\u0019>N\u0005=\u0004\u0003=\u0012\u0010>\r=M>=!\u000b>QPy=\u0002[=2m=@VۼF3(<9\u0006F짽v?<\u0004#;w޼\u0010ڸ\u0002|DMn̄w\u0016t^<\u0014q\u0002:\u001fH=g<ڸ}\u0011=r=\b3\u0004\u001e=Fw:\u0006ɼx=i=\u0010~=;/)=Ńೠ\u0001<=\u0015)+==zA:j\u000e\u001b$M\u000e̼B.WB\u0001\u001c\u0012:Ѫ9;:\u0013=~軋\u0006=udg=\u0019D/q<N=P`[C;x\u00169؄`I<]a=C<M\"=D3=5Jvޯ<:=\u000e\u0016>L.0=<od'\u0017\u000eɽ7Nк\u0011fA=6<lO\u0010=Ġ\\=\u001b<3B>%=z\u0016#eżAN=-Za)/\u0004\b(\u0010=ʚv==#==<vLG_a2E&B5#\u0015$<x 1=ٰ-N=η=<\u0000=\f\f>A9=\u0006>2R=[g\u0003,=9CtEu[[Z躼\u001f)J=Ⱥ<OatS\u00040\f#=wϣ,ku{y\t\u000b=\b.P\u001b=v=<>%V={=^=[)=)8=<g鼕l=軗<æ<\t=(eeB=!\u001a4=\u0019ڽxEZ\u0014漝Jf@*#tҽR*潋\u0012\u0005Ƚ\u0005\u0007k<x$GK>\"=7\u0004̇\u00032='R0vfH.U^;օ[\u0016ʺ\u000bo=g\u0004\u000b<H\r:\nE=Š =J=H\u0017Q-%o9Z7^$=q/B<u;+n@nfKTɼ4;ٞuO: ýs_N7=Q\u0004a=ܷ(%0\"<n=G=n==2>Hl\nM`I6ǻ4coA=tǗ+<l=j=V=\u001e=\bf56h}}%\u0014=QIט=w=\u0017;\u000eo'\"=\u001d<<b:=P;Q?k5ϭ>=K\u0016і c9\u000eڽ.{靽u/;\u001b%\u0013o$9m<S<gp\u0010\u001a/\u0001Q#O=}MAy=/+\nA!=P\u0004\u001f=r+<?1tOIU_=nS\b=\n\u0018=gy=\u0002\u000eH=;ݼ3<P=\b\u0010_\u0005=t;:=<#\u001b\u000e=Hb=\u0015\u0012=[\u0007<p\u001c=~w<=>=\u0002\u0018\u0010<z\u0004=<ڳ\u0007=\b==<77><bo<<\r*B=MЮ<\u00184\u000e>9\u0001>\u0003o=='\u0014A\u0003r0ȽYfH\n=ּ҈=\u0002P=a<\u0018\u00104\b=\f\u0004=\u00119z\u0017.=\u0001:d:\u001dS@P\n6\u0003\nx\u001a8\n6M%=(=1%<6u=\u001cf<gBF=\r1d<*\\\u001c{\u001a<2\u0004=QgKЅ;>\fQ}9\u001b*#Kļ\u001a*<\u0019;5\t}Zh>#=߷=$I=\u0003#==ɑ=\u001e\u0010wjV=\u001f2=\u0000=[±<C<8~;P/=%ă\u0016n=ANG~<SjW</\u001b=r<^?<H@g##=|=-\u0012< :=\t$<\u0002\u0006=;[R$:=%\u001ag><i-߉\u0007<k<\u0002>5]\u0007#׽\u0015<o9R<<Q\u0006\u001e<\u0013\u001aP<F\u001fp<\u0002ɼ{\u0001oB\u0000/^<\u0004=ǈ\u0001\b'ͼx|<z;ȶp=&<dлhb\b<y4C=\u001c\u0001<\bUږL\u0011\u001b\u001dQ<S.]pX<OG=C=x<amt<3==s<ICƎ=u;]=};\u0019Eq=D\f/=:=_=1{w<\u0010\u0007=]1<=\u001f==A=\u001090= \b=\"\u0004==A;Y=<ʥYÄ<\u0010׽/\u001aU(7=\u0004<ۉ<MY;H\u0016=:\u0003YY=vz+jrNS.|;뼤-O:ʼ-\u0007&-q\u001e<ӥ|ܮ\u001e<\u0007`\f\u0016҆[==&=&;T<\u000e=Rh\tYo=/yd},IӼ\u0006릸PKb8\r=f3?=뾽IFq\u0014v=h\n\u001e<L~;\t\t>$-Q=M==\u000b:<<\u001e=\u0007B\t= -\u0011>5i=\u0003=}} =\u0015>\u001d=`=։=F\u0003>ӬU\u001f\u0002=D<1\u0006*<\u0002\r>`n<&==j\u00035=v\u0010/=rQ\u0011Jd<\u0011p<O<ť=(g%=\u00133i8f_\u0004uIB»di<\u0006<\u001c*\u0002\u0010<bW=d&=\u0011=\rE=s<Nk.Ƽ\r{C\t以:̻\u000bZ>\u000bϋ\u000b:+=\u0017`\u001d=_!==}=-a<+=Dg;!:<<Ga:-iJ`(\u001e:^79]bL娽^۽sm<Eӌ=<h<J<$ޚ\u001c%=c4w$<m0\u000b\u001e<\u0004D\t(\u0006=1FА>\u0017VW=\u0004\u0019}F\u0019<b=%\u0002d\bn]׆6<p[=<\b;}BI\n\u0003<\u000btϽO\\k;k@\f=݉\u001f>0\u0003;\u0011>:s]=\t<=7=\\Y=.\u0019I=\u0004=H<ᨽΘ<Z\u0015a\tQQ[`F\u0016&:궼b\u0004\u0012&~/<j\u00041=,r\u001c\u001d=ݮ=$===\t˻=\"n=\u0019=\u0004=\u001bG<Z=0\u0007<7_̓vy\bc=U[ʺt\u001c;й\u000e׷q<,8=_=m?=J/~\u001899w=Y*\u0014ϼ\u0011<qa<L<ga;\u0007dΪ!=\u000eD=O\u0002X==\u0017cn!ļ\u0018Eqg`¼'\u0007\u0002<\u0001%`Bzvgn*!\u001fㆽ<5\u000bͼ\u0011콼\u0002tзy\\V/bS8\u0004\t\u0004(\r<$<0w:W\u0007=\u0002B<B\u0017=ޜVm=X<=RD=n80<YY=\u0000\u0011\u001cE5=\u001e-*f=2\"Đ(=ҹR<ɜ\u001d=1=\u0018<bQ=s05;E<\"\u0012<_==O=_<3rUmY<[=*\u0002.D=F;\u0006\u0002?=\u0005_=!c=d5<*7湔;\u0014\u0015\u0017h3U\u0010r=\u0005\u0005K=\\j\u0019=N*\u0011=eg=m߻\u0005<H==@ǼUM\u001c]=-f\b><d<\u0015:N=MxB=\u001b(\n>-[=s=o;U=S:\u0014<1Q:G=\u0017s=>J\t\r-=e=؀==<\u001f=\u0013{?=@\u0012<iS=+/==,Ľ쩼\u0017p=\rw$^喽ZE=ʛ=Dj==5<[=\u0018=Q4m<=.=&j<\u0010\u001b=8\u0000<ޛ7m;1 \u001f\u0007=\t\u0005\u0002US$='c\u001aP?WEZ \u0012,?f\u001e \"޽5\b\u001e*c\u0006?B\rM\u0005\u001c<&Ǹc4<aFúx?3&\u0003\n\u0019=<<Y̼P׺L=5Z#u=hpR=\"=kX\u0000=k\b`\t=/;=3zܚ\u000bB9\bb<ƒ<LE\"E\u0013\u0004=E<U\u001d<l=p=-<3L<˼\nć{\u001a>=\u0010wK=U!\u0013NG)IŒ=ּ7\u001d;ͥt==0\u0002\u0013 =7\u0002=Cg˼J%< =\u0019k=d/=#Fr 9\u001b뀱I\u0003@t}\u001f\n=I._A\u0003ۜ;+\u0002=m=D=)V=l\nE伡sFP`&=ؗ:(\n,h;3<\u0001%==do9<\u001d=/>D\f?\u0007i<\u0004\u0002,<5ԉa\\<s񽖄=,==\u0012ջ\r|;Ҏ4\u000b\u001fTQЕ<(>P=|ʜ===f=\n;|3bx=;=VL=jE@=NW\u0010=\u0006\u0001<\u0004<\u0004+=S<{.<)UӼ0VM<CQ0)v-8;M\u000f\u00138;<\u0014lĽULh\n\u0018-<%uw\u0019\u0007ntm<1\u0012I=`y=Psʜ\u0012=EG=\"P<<\u0011X2'E\u0004詽y<;l<]DϼH;T4D:\u0005<\u0019\\;\f8&<\\\u0019zgqP<9.׼;M=\u0005\u0007=\u0000\bB_5=3{=p<\t<6\u000e\r<NG#=\u0002N=c\u001bYK\u0016V20>ݼɒ<YD/\u0014=g(_\\\f=((\rL\u0004<|<%\u000e\b\u0014=E\u0014$\"U=A<2\u0014===A=\nVK`ğ=ⲁ-=ꖼ֩;c=!Խǽ\u0013ZБ-\u0006W\u0004\\@=!\u0015<\"Vf=<P\u0004=t}=7;3\u001a=\\F={[<\u000e.K;a><s=p7\u0002<\u001f=\u0002KM<vf>QU4<Ln<<[:S\u000f?λȽ}7)=o[m=\u0005=\u0006=Á<a<=$\u0015==<===2&=I\u0007żz[\u0007=0E?y@z\\#;z=\u0018%+ G\"\u0015R8\u0016<>X\u0016=P\u0012B4Z_=Y\b\n<W4=&W\u0007=A<b3=V=C\"=J<E\u001e<\nm\r=Ϻ<+={o</=\tѽh+μ$Ἇ;l0P=d,=\f=ϟ;7C\u001a=\u0016W\u0011=q=B$m=!=\u0006<e\u000e=\u001d=[@=\u0006\u0003>\u000fһ\"&9<$*=?<7x\u0011;>\u001e<9,=\u0002\u0005=\u001e\f;j_\u0004<\u0014y#\u0019<\u0018$}N<ہ;ն<\u000e\u0011\u0011<ab=m\u000f}$\f=\f><v&<{\\m<hlm\u0000<\u001e|v<tb<\u000bD<3=\u000e^=\u0017\u000e>=%qV;ͼ>=4=V\u0012Ç<H\\u\u0017]3g<\u0007u+=;G7ѩ>6㚽`\u0015)<񧳻K6XZ=?:+\u001fuH;\bF=_׆=4\u0007=⊩8\u0017˙(=i);p\\arC4ѣ<\f\u0019\u001c=w=(b<!=M=\u0002z=oi\u0010>I=\u000b;WU=\u0011=6,<:9<RF&L\u0001<\ncHƁ<.#DA)=\u0010󺘽<h<R<ís/=Xt=v=\u001a;@׼u.ppTY+%<\tY'kJS9\f14i;5<\u0015XfQ9u=\u0019j!i\u0006ZFw<w<-r<=h;<\u0000)=\u000eu<\t\u001a'=8\u0018\u001a*Ľ=\u0007;I+;g=\u0002\u0016\u001b\u0019=۸=>=\tc=w\u0006齳\u0001;Y|\u001c\u0013\u0000=6\u001b\u0016ּ^G\ny\u0007\u000fX\u001d޽v\r<\u001f»(@<=Qf=$;?\u0014\u0015\u0019=Bu׻\u000fE~AꭻUN\u0000;(%&Iv=.\u000b=Ƈ;m;h\u001b=<9$\u0016\"=<\u000f^YsrּԽU,N\"\u000e?\u0016\u0001~\n\u000f!U/4+=<ƪ\u0006zQ2y\rs\u001eYf,ri\u0011\u001d+\u000f=ڃ\\<7뗽}c\u0013\u0012͉\u0011aNVG<q\u0004<8;o<jT<<鲤\u0006m=-={ֻ̼=An=\u0004\u000fFT8_\u0006q<u9\u001esV=r\\\u001f^=MA<'c\u0007)U)\u0010\u0012Qؼ\u0002<r\u001a\u0006<e\u0011%=9(=?\u0013]=Y<\u0018={y<=<mo\u001c;=;\u000e>ܠǽS<[6=W#8=%\u0013=i^p\u0015MML\u001a\u001d9\u00006\n=MԵ<U\u001a<\u0014\u0016=ʑE=1\nN=.H\u0004=\u001f:;pb/\u001atx?<8j=L<5q<.=\u001b\u0000><>\r%Ṟ=<2==\u0001\u0006<ɑ\u001f<F;|\u0010eBY.?8==b@=\u0005=\u001f<7\u0011\u0005=%j=fѼ#>6=\u001b/=\u0012=⪼<:\u0010=A5廇-Z <og==\u001fd=YƄ@\u0003ռ\ri\u0016A4JK)d<X\u0014;=\u0005\u000ec=ߎ=\u0003AT6=\u0010=l4=V=d<L\u001e40=|Z\u0003X=h˼Aj\u0015=L嫻\u0006$=E<~\u001b\"=7=*\u001c=<Y^g\u0014\u000esW\u0015\u0019\t\u001c\u001d<}|ZOC;jQȼZ|\t_\u001a <⵼\u0006v=Q\u001bO=Ȅ\u000bt=\u0014=B=U==\u0005\u0018=\u000f<)t=\u0000=Nɴh=\u000e\u0018\u0012<.-=k/>?<CzF|Ǵ\u0000a\u0010=;\u000b2\u0004>I\b=\n=D\u0011ػ\t\u000e=Ĵ=cT=U%m=`=e]=\"f\bw\u0012x\u000b=\u001d\u000f=$p\u001a=\u0007:B\bOl03Xz\tK_\u0012\\R%\t<h\u0001_\u0013<-\u0006Wc\u0016 \u000f=bd<y}=Ma=S&=;&\u000b\u0014=q\u0017=v;<+<Tp\u001eλ(F<p==\u0004=S@=r=\u000f\u001c=\\=n>#\u0002<K=e\u0003x<zý\u000e%<y<2{'\u0001G\u0019\u001e>(V*==s=\f=\r9|=ДqF/K6\r4@;쁊z\u0017=a\u0019<s#U=|=\u0012*<\r=kİL\u0012Q\\ =\u0001/q\rB=\u0000\u0004=k\u0016W*\u001foJ¦8\bDp:@_|\u0016[K.S<&:|=_=h\u001ao\u0013켸ĽJ\u001a޽\u001d[=N<e\"InP)!5׽(<.h=\tp=\u0018~\u001e<\n-\u0004\u0010=(\u0017<Jx,7_\u0017=\u0007L=\u000e\u0000kHjR\n-ʽJ\"f;Yn\u001b{iWɽ\u000eOqi땼!oٽ\u001b *T9H/\u0012֋N=o(>=~\u0013OUD=;f\n>\u0019)%vIl<\u0015\n* 4D<dc\u0001!ъɅ꼧yp%Lsk=\u0005=\u0003=\u000e\u001b=l<j~\u0014;\u0005<^\t׼_j\u0014\u0007;,F=O=\u001fؽ\u0015S;nݼ\u0013\t<ޯ[=i[%\u001f;މ=wh=;<m^l=;^\u0019=uz\u0001ϻhw<\u0006-sl;\u0013-\u001f<\u0005\u0010u;Ѽz\u001b<m;yb<\u001dѽ=\u0014X' =\u0003\u001fd=\u0017⍼p\u0018E<Q<a=$%Q=D\rG=#\u0017gV(<=\u0006`\u001b=pܻlm=C-Ч%=<M;=R#t<7=X<zw>W`ѼڒI<=f=i\u0015J=\u001e쳻<jռv\u0017L\u0010\u0005\u001f\fV5/=\u0000F6<03;VC\u0015K\u0017<\"óXm\u000128ga\u0003C95==$><M\u0019\n<r=_\u0004ڽ<Ǥ<N7Q@{<ae|B4=\u0014\u0019nB\u0012\n7'='\u0005b<UY껌\u0002\u0019<\u001d\u001e(<pŦ=u=Rd<H=G=,.=Qo;OƔ=\u0011u=3WIh^0Hv\\+o.,e=!\"\u001c\u0016\u000eU=\u0015ӽ޽P'v<.\u0007\u000e\u0014a\"t\u0003\f=bhXɔ\u0000'ȥ\u0004J)J/Pk&»Rؼ\\>һ+ =\u000f[=n=\bړ=~]<>?\u0017K<\\=\u0013\bw=\t=C\b<;\u001c<*Kv=L\u000b6\u0013=\u0001W=om=ѻn=.= Pp\u000e\u0001=rAд.\u0004m\u0011\u00011_\u00119mۦ<s\u0012\u001f5<Җ=\u0006c<cK=ދ<qּw]~<\u001ds<&{M\trM=\u0001\u0013Fͻ<==#\u0015BH7Q=H\u0016@2=\f<}Y\u0003=_i=t;\u0006RyA=j=ʶ=\rrZ<ڜ<{\n=dj=yL=\u0010==\u0003\u001f<\u0011<\u0015=\u001dTr=\u0018\u0017=\u0004\u0000=q\r.=\u001b=t=7B=:9=a'\r=ₙ\u0010ʂؼ\u0019g=ܭ==t=>;=50\u0003=AjX;=-<TD=:E;\b\u001c\u001b\u001aؼؼ<{ix8ռf===\u000e\u0015<G5=<T㼼Y޹Gr\u000b\u0016v'==S6=1\u0018=~U=Og=\u0017=-=0=XQ=NK;&ȱ!LB='|I\u0015Q\u0016ռf<<\týn/MO$=aE<wV\u0010pG\u0001\u0018 =|;=\r;6<F<\u0015\u0019<9ja-\u0019=\u0015檽ҽvϽ3S\u0014=\u0019R\u000f=숽I<\r<ZvF\u0013;4G<;<\b&\u0003HR(=tՊ9\u001b<\u0011>U==L\"m!\u001d<nU@\b<H\u0016L\t[d/=\u0014\u0018N<ճ<<Bu=\u00199&\u0003@R=\u0007U=\u0019䈽d<\u001f<\fw<ɳe=U\u0018><JX;9z\u001a=8\u0011<\u000bE;+<BS*ZD\t=TK=,U=fS\u0013W:\u0004Q\u0018f=\u001f=(tJ-=(=\u0019'4yKQ\u0016\u0005\u0006<[J=\u001c\u0006U=>(\r.=2r8=\u0006%=;A^=oT=R=D=GV=Yn={\u0004<w=\u0012\\B;kK=\u001d r<'=D8\u00028=Q=n=sK<'F\u0010;\u0019Q;\r=<_\f~мO\u0017<\u001fˬ<c\u0004= \u0018=W=h<\u0014<\u0013=|S=PlWvl|A\u0015Уa\u0001\u00001U}=\u0016=F\u0007k=\u000782==i=?B=i+<\u0012\u001f(\u0004mL\u0007c+/\\\u000f(i_<@\u001aWA~E;/<\n<\r\u0011\b=P<=\b\nPaۼf<\u00111\u000e9ǽ\f6nU)=T<NN<\u00074$|\u0019\u001dN]!<pcS\u000ei<o[e\u0004=叕fV)3=5\u001f\u0005\u000ex0>\u0011\nr:H\njb=\b'=\u0007#=/m8=;?I;V=A=s\u001e3_{=U\u0010fL\u0019\u0018@Eb7<BJ˼f<=U\u0004l=y/=Q<a=I䘺E=\ra</v=/<\u0006=wY\u0001\u0001OcqνG^=o=ɦڼ<\u00046<vO\u000e'ø4\u0005\f\u0000\u000b=\rL<|\u0014)I;10=\\\u000ba=\u0018<̽\u0012<i岈\tq)|%r\u0010P;i׽O;\u0005hi*y6I=G=5D=qQ=]c= +>\u0014l=s8=,ө\u001b{\u001br蟽vm\u001e<T;w[==Qޒ=*3q40\u0000\f^\u0001Ƚʽ2?Nҏ'¼Am8i'<bd<^\u0014V<5!=:\u0014t;=\nVKl%\u0005Wӽ8hd폽\u0016=8qڅ<\u001bt?=\u0007===Wm=i1\r=Y=c,;E!\u001d=+d\u0006>D\t=Q= .=W *I3=\\<sӼ\u0002$1L6\n~9\u000b;\u001e=\u0018q=!3_=\t=$Ҽ/<%[v<$q'=<;\u0012H=\u000f\u001drxVlͦqjvf=卽z9\u0016=׉<\fr=\u0001]11~<9\u0003MH\u0000N=\u0007\u001c^<\u0013s=E=);$-<^=4\nq=]q=\u0001===]=\u001a\u0018=S;\u0018 ӧ<.;\u000f  ür^'=6f1f=\u0017{c=Cd\\M;\u0003=\u0014$=G[=\u0001=\u0018l<b<p|<û{<\u0007=<<\u0006罜\u0015\u0000䃽~ѽ!\u0003\r߅ \bt<3*Wwְ\u0014-1D+\u0014M\u0007\r`\u0002\u0001ܽ}R=뀊=\\\u001bs󦵼7\u001b\u00174QB\u0007<\nTK?'a=.=\u0001>0=\u0010a=m=\";ٙ\f=\u001f<>R<\u0011\\\u0004;\u0013ѩ@\u0006\b<\u0004n<'=\u001fa;'2<|\u0014Ľ<vq;7=\"f=݉=^\u000f-\f=9o\u001c.=$<k\r#=\u0015\u0003#J2ҋI1u:\u001c,<ܽ~\u0016B\u0001H\u0011df6\u001758-Q\"wѐ|\u0007(պ1E\u001c=:\u0007sH=X=!G=x<=><Cؼ<u\u0017<(=\u0001;x<x4=6#;<&a\u00139d<c=\u000b=)MۻHQ<IG\"wKI<ࢼrA\u0013m<Z<W]\u0010RBʱ=\u001dt=)l=g=ʔ\"\u000ez<*T\u0013=B<\u001f\r<':\u0016=>=;t4=̎=pk=oG=\\T\t=_;fɺ\u0003=^ʽ㝡\u0003ݍ'G\n=z=5R5<ut9O\u0006;?T==\u000fb<=?\u001f!\u00077L;К\b<\u001a=^;/Ejن<,н|q\u001f?c;@=\b>ۻ޽*i\b\u0010\u0010\u0001B!septimbre_amt.encoder.res1.3.biasJ@\u001cͽܙaT3=R7Y3&R\u0015=(ȻE=\fEؽ\u00107<?^=.=_<틵<ۼ*k\b\u0001\b\u0010\b\u0001\b\u0001\u0010\u0001B\u001dseptimbre_amt.encoder.emb.0.kJ@os?x?\rAy?y,k?3Vk?:e?Yt?)4?j?;p?\\[f?Z?\u0004c?@Zs?)k?p_?*Z\b\f\b\u0010\b\u0003\b\u0005\u0010\u0001B\"septimbre_amt.encoder.emb.1.weightJZ\u001fAa<V\u0014_]\u0007\u001e=r;eU=\u0012\u001aǜżY\u0004\u0013>(=@4,=Њ<q%=V-\n>\u0005)\u0016,\u00021/8Ȍd)9#ջ<4J\fI =z\n=\u0019\\\u0015\u0015rХ}\u000b.\u0000=&-\u001e֌;jRO\u000f@;9\u0017T;\u0017O<R5\u0013>q\u0012fYs;޼<2p<]t;\u0017h\rȀ\u0013߉*ڃRV=,q\u001b<<n;%e\u0019[!j\u0015\n)=O<;<o\u001e=&\u0007*=νz/1\u0018=H\"\u0016=\u000e<\u0002ɪ<\u001c;rj\u001e=<\tX<0\u00040\u00166{<{<\u001dH\u0017\u001ax=m\u0010<i$<Io\u0010=sK=Aa\u0005@)!B}=&=ב=<=<=b۽Fν\u0010\nXj:F\u001bP;G\u000b=O\u0013>\u0014=\u0002!f===~\u0001>e<XK<c=S\u0016=\n\u0004*:\u0011'=';=\u0000=0=M,\u0016\u0015=9<мMhý\u0010\u0017;6zЁ\u0015K<\u001c2\u0000\u001c?ƽt\u001c\u0003x<\\$e:yH\u001c\u001c$<:&+_.=t.3=V%H\u0003=\u0014=_<H=72~<~<E<1%<\\<\u0012}5=Q\"\u0000tnE8\u0014p7輋\u0005\b<\u0012<\u0010<\u00017;bjڈ.\u000eT8\u0002\u0017VۼJ;X\u0000\u0001=\u00120\u0006<;\u000f*=\u0019(<\u0001>!|\u0010>2@y_７$>\u001c>q4& K<'=uM=\u0018?\u001b=6\u0010<v91=\u0019=4z<K\u0018\u0016t.<\u0005<\u001d<5<HYcH!u*2[JzbFd\\<\u0005̽мǖ<n77qi\f<\rl\u0005<~<R6=\u00161;=\u0019k=(;\u001c7g<FZw輻\u0016༧u=؅R=*=G;8=\u0011D=jL\f\u0004;-=r\u001f<\u001c=h\u0017<r*\n5=~V=?+X\u001f;˻\u001e=\u0010bƻc\u0004[,<Ԅ=8=/</\\W<1W<=IꭼLt\u0012%=B.}̺/ |rHWa(}|=\n_\u0007c=\u001d7dtQJ\u001e:;@E\u0018<|28ջ<F\u0019ACy^n8oK\fwdOѢI9b\u000e:\u000b\u001c=k:E\u0007=s=l3<a\u0012\u000fG<Bj=\u0003<\u0006$[<%識&=I =M\u0004V\u0004<^<\u000e!=>y<T/<?X\u0003>Txջq\u0015<\u0004\u0001%</ԼKz¼\fƼǀ\u001cf\u00002d{&<`1=w<ڄ\u0017T<\u0016\u001d=<\u000eU\u0017=*\u0007=:\u001a=w\u000exhmwƘ<-=l\bӀ(=| <=\u000bhӺC\u001d\u001eJ蓑\u0002`Q=>\u001c2=#<`\u0016=g8/=y=D\u0000=u4=:=f=\u0019 [?O\u0007㼪k$zK8\u0015U;U;\u0002f5(Z@A\u0003yK!$à\u0002/=V'=@`<0MY=\u00112=м\u0017\u000e=K2=n;\u0000\b\u0015|\u0003@;\u001aʽGA\u0016-t(Un\f;/0#;\u0005ĽE\u0013\u0004<Sh<c\u001dCV\rf<f<_I<<+<7D^5=\u0012=\u000e=߼@<<\u001d;=S=\u000bx:<!+=E\u001b[\u0012d<$T;.@;彯<pK<\u000f\b~=j<a=sC\u001f=\\[\\XI<hH@ō܃;\u0010G\u000e=\u0004=\u001aм\u0005<\\3YLd\u000fP=Hƪ=`L9=\u0000\r<\u0007=(޼1w&Δ=+:]\b\u0007Q\u0018(ZPgS,J\u0011ʥjӞ,N$ZսM\u0012=ei%0H:9wD=-<T\u001d=D<$;<$\u0018=UL=3\rg۽/1۽F\u0004\u0019 :D_ȍ\fZ=\r\f|\u001f=hn<\u001b_=L2\u0014>\u000e<J2<\u0010\u0018<Ƽ^}u{DS9$:\\|ޤ)񉽔Ԉ\u0015\u001c.9\t\u0001<<p\u0005+<\u0010Cn=\u001d<o*C<ٸ:D9=@\u0014y`\u00033\u0016<邏<DaT--(ǻQG=^\u000e\u0018_yCͽ#\u0006Iv<G\u0011\u0010<\u0014cNn\rFd;S\u000e<OA<\u0014׊D<ۧ\r=\u0003\u000fR;\u0004o`<ǽL\u001fW{<zA <\u0002<\u0017U;\u0018d3=<:p=B2\u000e=\u001cm=k\\C>U멽\u0018(qI($!`ݚ};f\t=qB\u0001\u0003G<J(=#A=c\t=Z!=Tj=\n^<1R=Qy-=\u0018g=W\u0000\u0006Z*31<:\t\u0002<\r=w;\rs=9~;i)޼C\\_;4\u0005=!L\u0015U\f=\u0006P2$[\u001eYNVT<҇j7<G\u0015\u0007=|\u0004<%\u0000#=7\ru9=T-E}<1)\u00101֊w?j<D4ڼ\u0018d<v4k=\u0002=\u0007J<1>/==|<y\u0019=5x=];F\t=|I;8(}<9<\n1 \u0010#=r\n<=&<<bȼa<2o\u0012<5`X;\r\u0014y/<Z=\u000bG\u0014=,<\u001c\u0000O|.<\u0011:;]Ayr:i<'\bQ\u0000=㼩#\u0001\u0004\u001d=\u001e\f7=\u0006D=X=1\u0000@=V=\u0014<D=&\u001f={!Z4<\b\nz<\fW\u0015<J塼`2{<\u0004<[~\u0001~\u0016e\u0012+\u001eݽ\u001d0=i&=%+<P^<6\u0011>*FO\u001eʗ\u0019G\u0003**gX<=Y-=t8<\u001bD=t%==V-\u0003=).=C=r;\u001bc<c=s=\u0002>Q;\u0002=`;U+>@=R<ͫ!<I\rZ>\u000bx=E\u0006= L\u0014=ˍ\u0010>\u0011\u0015;h\n˼%=cǉ<\r=~=O8=\u001ex0=PԮ6B+ds3=\u0016c}=\u00180\u000f,\u0012uԼ >\u0006\u0012ܭk=A\u0015|\u001aơ,=fAZ<Y=I25<K\u0010NU<\u000e==:=\u001f\u0006=P!\u0019>^<bW:\fZ;\u00165=BR\u001f8|\rj5VI/<\u0018=/M<#QO\"ǰ\u0016;\u001e\u0017\f!'\u00169{\u0013V<\u0018<:<Iɼ;=U%y=-=\u0018<.ʦ;\u0010gv=t2.SV4׆<[E*-T;-];|=f;jy<̫ \u000e%Au=i=n<\u0004w<\u0019RMQy&=\nS\\\u0000*=\u001a\u001a=;d؋hG߼<d\u0013(<;%o=\u0010-\u00112&={;&T<ї̺>YJ\ft(W\u0011\u001eK.:\u0000T$N$ÛU\u0006%<Ym=$l.J=[~\n\u001dO<\u0019\u000e=\u000b<;Y<\u00019@\u0003=})k-<ê=bm\u0006\u000b΀Լ@%ӽ0:< =>Fr?O`ۼU<P<ɅǥQ<W;\u0007)@\u0010q.ཱུ<\u001e<ĽHj(INԼh8Gb;\u0019L%V=\u0011<\u0003=\u0005a` '%<7\u001e;_Ľ>^-\u0004=>\u0017\\ʎ^\\8#=@;8=H<k@a\u0001=q&<5\r\u000e=3<<\u0018=Mo\u0018\u0016=U\u0005<\u0013A<=\r<,d:\u0003{=\u0000=]}h\u0016\u0019\u0016/\t<<@S=\u0010<s\f\u0014EN\u001a\u0004\u0006l<~0\u0011K;;<:*G;v}<\u0016?<7=<<L\u0012<E\u0000;>=(̼<rm\u0004<V`oUs<\u0007:~ۓ<L<\u0006\u0019=\n-=<em<<\u0001O\u0017q\u001eQ;0ռ\u0012zS\u001c;ý|\u000e;~CqӽHY\u0006\\E;\u000b<`<ߩ)0=v)\u001a=<{)=\u0016\b<\u0005=) 弘q9\u001b;-V%z<=GkwAR%\\\u0007\"vQ;^pN=.m<\\:k<5ɎXR<-D=~<~%7=w<U\u00039$\u0013߻_<\u0013bzi\u0014=k%b\u00153K¥<Ѻ<l\u0010<\u001d>;8><߿m/N٣;<'=\u0005=^\u001d;U[2x\u0015uǽ>\b\b\u0007Ae\u0011}^>~\u0016=Dƻ-\u0014o=\u000f>=S\u001b\u0019<K\r!=<\u0007<\u0012=g\u000eݛ=\u0007ӌ=:==\u0001<C<\u0015=\u0003\u0012廐4<P>=<(=<\u0010=\u001e=1<1`\u0006\f>ՠ=\u0002F\\=@=)&\u0012=H1*=>)\u0000 yUQm,=C$\u0001=\u0014Z\u0007Ȇah^ҷ<n\n\u0017<Gs\"<0N;4<d\u000b-Y\u0007<[3;$ҽi4'\r<3<id\u000bI'^лQAD=&F<̯=N^<\u00047R<]'<\u001dz<@:=Z3$=Ĵħ3\r\b?=ʡj«;w<S\u0016:7;:\u0004;<\u001e=X<u\b}(c4~g<+0=-<3<?[,=!i<7i5\u0004\u0004<Gd= ;W{<\u0013/\u0007<<\u001fn-4%\r~u<<׼7<q\u0007=[pf=~\u001a;{m9\u0014\"ļP\u0000\u001f?fg=yRDA=@-\u0012`<8q<'!5OJqK\u0015T-9=i8\u0017\u001c\u0007=#<\f<(LU\u0000n<٨<8=ޗ<\n*a&=R=|@B=FcMR4W= t;r:<cK\u0016<\u0002=\u0007@<I<Qbƈ\u00025\"sA]<z}\u0019;o:.%=?W=2X\u0006P`缙\u0013<\u0003غG\u0006\u0003b6=\u001eތ\u000f\\];\u0015=r+켟&=:=ߖL\u0015&<)518=\u0003]W<;\u0001=\u001a5=)\u0000!N=\u0012<&\u001b\u0003<\u0001ͻ\u0012!=Ǫ<JS3g=\u001f;4~\u0005:<\u0011R!\u0018zZ,\u000b;1\b՟O`\"<N6;á(\fPm<*\u001d=}@I=+ў([6ҩy)1z;;\u0011v<9\u001a=\"5<G5\u0012=XbW\u0006;eBh;=,Ci\u0010<JHü\u0004X\u001d\u0012ؽ\\\u0002p\"<\u001b8\u0006,JYe<B4=\u001a9˼̓w2;qHR;\u001e>`ג8\u000f\\:kT\u0006ؽ+r=\u000f-|<8\\\u0005\u0019<\u001d\u0013f坽}Ӽ\u0018i\u0007\u0018<ݺ==\u0006i=\r6=bk\f>*h4<\u0018\u0010[\"=\"mV\r=\u0002A<?J\u0001+;<N\b=\u0002<N<!g=-\u000fjy\f&׆<\u000fʽ\u00166<(<(C=x\u0014\u0016Y\u0004\"B$<\u0005=<מ.&f~=\n=]~\u0005čAݣo]#\u0001\u00041\u0006\u0019S[\u0017=-d<\b=e ~<y&9q#=<Or@\u000b*\u0005\u0018\n-w<:\u0006n\u001f<Ͷ=Ⓖ\u001e\u000f\u001b=<\u0007\u000b>n\u000e\u000b.<Ea\u0005F|O<\u000f'}[K:\u0016H\ti8X=#\u001e2~»\u0016\u0003\b \u0018<?\b\u001diȽ>=tH;\u000e;ݫz\u0005\u0017\u0000j<V\u001a\u0000xJ=^\u0019;\t\u0018=Kw=t=Xw\bQ=i\u0013;4\u000e@{MJ1\fnڼnsP/h\ra?:;\u0013\u0016dByM<V}\u0005tQ<5\"}x)\u0006=`23g;4\"=(rR>sƼ><L]b䅽CĶu^<<d\u0011$zι\u001b!}N;&^\u0018CY9<br\f'<\u0003͑<_5<\u0018\u001c=\u001cgi\u0002FGM\u000b`ca<\u000bq<M3\u0018\u00052<\u0013G,\n\u0005RTu\u001eS=Ԙ(=\u0011\u001f=BO1=}=>\u001f\u0014=2h:=9=;\u001f\u0007>w8qzg;S\u0006\u0000;v<\u00051\u001cևH\u000b}Y;\u0019<_<9qm=2=c<ڱ>=sd=B<L+˼\u000fW;t<\u0002<?ܺVy=k=Nř<;n\b<؊={|=m\twX\u0019=K\u0000>=֮e\u0002]0e\u0003z\b;\"<l\u0014ü\u0007Lt)veؽꁽx;n><l@py<CT:'mK^#\"=\u0015\u000f$\u0014=V{/<U#;m\u0019y:5?Q't=_1=ց߻K;\u001ea)=4u:)8<#3\u000b=Ҽ\u0011V\n<\u0006K=6<=q<7=|;<~l<\u0014\u0000<\u0010D<5 \u0007\u0003&Z\u0016\u0010ĽW\"d\u00105\tj=Щ=:<=<\r+=>=\u0016F\f>\r:.\u0012<J=1=ꓳ\u0015\t_ʼ\u0018\u0012V=ʟh==\u0016#=\u000e<0͕\u0013=a\u001d<\u0001;\\7*=\u0018q@4ぽtX\u0002\u0010\nb\b<nռSt<\u0018(=\u0015t.żҽ%\\*<g<\n24\u001bB;\f,x\u001c=C1g=^\u001eż\u0012<7<A9q\u0002z<\u0007⼝ޤ<8<3;Xy\u0014P<\u0011-9\u001a\\<xc<[Z=ȿi+<N\u001a\u0003<9սx;(z\u0013VEIaD<K\u0004=\b<\u0000n\u0005Lc}$m4y=r\t=N<a;C\u000f=Zs=BӼV(;UӼcǼ\\޽)iJ<\u0003\u000e\u0002޽ü-X.R\bݽѽh<=\u0016/<7Ƚ<\u0000\t=Y<>;oB\u001cc<\"WY<X=ý\u0001=HG9E4IO3\u0019퉼n\u0003e\t6<\u0015>\u0014\u001bo\u000e\u0015n<ǶUr9sWD,*=G\u0005<V+<o<GDyI\u001d<\u001f籽\rg/(<f6\u0006<OwN\u000fL$\u0007i5<tv=*=wҲTzݬ}=<\u0019u<t\u0000=Jy\u0001=\u0011=GV\u00130=k0\"={e$\u000f<jO=%!U<4&=\u0007=\u001a=f:e<j;$S==\u0012\u0003k;)h=N;}){\u0017ﰔ\u0013\u0019=È=]<~?<U/==<(ּό< ;s_cVI齓GZt\\=\u0000Aʊ\u001a=`\u001cfϼ;lb\u0010<8nmwC$y;|\u0001x55\u001bż\t:\u001a=#\u00158<X\u0001D\u001clo\u0019<'=/\u0015R\u0019E\b\u001d.<,a<@䑽\u001d'O<ʳ:`\u0001<:\u0014<x+:uV<8iwT<o:I<\b\n+\n6h<\u0003$<I><:\u0001=85*c\u001d\u001f3ה1\"j<\u000e=z2\u0002Ȇ2<\u000e\u0019q}\rs\u0015ߙaΙ<I;3q\u0019|\u0014\u000f\u0001PpT<g;#T<Kꝼ#r=!Y$=;߂=}a۳1<\u0006\u001cFzJ1\u0013k;;&u=o<c1;n=M0n=h<>o<\u0011\u0000=<X(=ya<hE=<.\u0019=^<=[=\u0001*:B=+=0;-u;8nVt=R=.\u001e$(2=7;)</<3\u001f=9\r=a\u0001>_\u0014Ǽx<\u001fB<_\u0013=*rX<B\u0014\u001d=\u00194J\u0000wθ=Nc<\u001f9;\u0015=X>=>\u0003;<17<9Ɉ\u001d\u0003<Ss=\u0015<\u0000\u0013;X<Z#@6=o'=?<y=lֻHhM\u0005uv\u0016==<.'Ľɿ7愽#\u001e\u000f\u0015'6H<3ZY`g%ȻD֔<;,P=ؼ3+\u001a\u0010\u0019\u001a==]\"L<lB\u0006q\u0001SӨض=R<<b6L;ţ<Dp\u0017;g\\=:\f8Pԑ=e\r=:\u0000!j\u0005=$h}=< 43{wu=U$=<a;KB*;\u0011 ΰ\u000b{\u0004|<؆\u0004\u000e@S\u0003=pJ<ԅV=\u000f:<䊞<$O=\t9p<X=\u001c\f\u000b=K+O<.ɻV15<e\b޾j=A;:_1<T<[<J\u001d=\u001b<껬q=Q=n=4=:=j\u001f=\u001e+<c)=W\u0013<l\u0004>\u001c\u000b=ܶKxdNI<m=2;1@<d^\u0017=\u000b=\u000f<e\"V6C5Eɼ,\u0004\"<򃐻=iB=6B<y=H\n*=-\u0014Z;F\u000bӽy`Q;:\u001dvƼ1\u001f\u001a<\"1R=vS\u0018}x=P_=T=Go\u0005==\u0014JQ=<\u001c.I;1<D\nk=:;\u000f<9;\u000eW4[$=\u001f&\u0010=UeN\bX\u0003\u0003=\u0007$G==U\u0001\bTTLW=\u0005 z̓\u0013%Ni|P4QUFW\u001a;\u0015H)GMϽm\u0017̽\t4%`<\u001d\u0000匽f\u0012{\u000ed'eݽ$\r@={tҼQ\f<H<#<6\u000fnM\u0001\u000e\u0000<\u0002<\u0016(<D<çrt@O;^ƔR@BG<,V\u00157ν*g\u001d\u000fĿ===ܳ =\u0005=A=\u0016=\u0016$I<\u0000b=\u0002<=]y=G\u0011\u0015=\u0012G\u0005=8=󵧻\u0010\u0019=)r\nŮ\\R=\u0012\u0015rh\u001a\u0016<{;.2n<;ҭ=bH=:=X\u001bZq<\u001dt==pϽ`vHdӅ?K\u0011s\t!a=\u000bL}5 V֕;\u0004<~\u00124=:>*=<[~Y<\u001f`\ruXR翼WLw\u0018y\u0005ݔ4Yg\n\u001b<%|/L2\u0011<\u000b#h6=\u0015\u0000\u0014(Ը\u00075=ތNB=Y}<~\\[{\u0010\u001c<\u0013\u0006=;\u001b\u0004e\u001e-<Q;y\u001c\u0016=l-׸8\f\u0004!ɱƻ?:OI<kℼV\u0019<\u0001=OT<\f/\u0016\u0007;o\u001c=\u001bx=g=o\t\u0000=Ӽd=(x<\f>Ԓ8\"&<)@(c\u0004=h#\u0000\r\u000b\n;ܨ<5G<\u001e}V\u0015hxм\u0010f4Cػ&UX3=9<$<=%=A\u0000≽\u001a9\u0019h=Zq<\u0002Vh;FLG\u000eR:<{\"\u0007f<\u0013ICUA\\\u0001_<C\u0001\u0013.9'\\3\u0011Qܼ0;L\u00035/D\u0017Tbh\u000b=lܼb;PRúg<W(ļ8'0;JK:KX;2]}=\f<\u001c.<\u001a;=Of@C{&Đ(<\u000e\ba0Kcޛ<9O\u0003r<\"\u0005N>\u0001\u000f\u001f=\u000br\u001em4=_n̼\u001f#;\u0013<\u0003\u0012<<e95=ڎ\u001e<Mm\u0012\t3=Q[աǰ<\u0006\u0001H==\u001d=\u0012\u0019<2<;< <0x<_<<n~=7\u0015\u0012=R=Ʀ<=e=V=\u001eY=g=T=Z\t=sr^\u001aJ<\u001fe<\f\u0007ļ$\tս9I\u0015;\u001b'+0!nF9\tA\u000b2Ҩ\u001f*\f<\u001e\u0007;%#<\u001f3_<0<\u000ea@@\u00066\u0007'1\">oͽ2D&Ե<֧o<<iyQjʹ\u001c=c\u0011|=0<e?rq<\u00071ӄ!\u0000Fj;u3\u000eYJ<\u0013c5='=}h=s<<<\u0006@=u\u0013ɽ\tgikK<\u0014\u000f\nc1!<\u0006<\u000e.=)\u0002v<F\u0015=Z'Uü'<+J\u0001;Eծ'ѻ@!Ǽ$·=x(<!p\u0010;`;OM{ @h:[F\u001fO\"\u0011A\u0011\u001d=B}<oQ<\u0013#==\u0016<\u001b=~\u0010<<<\u0002y\u001cL<?^:q_<\u0000eG&Ke\u0014<1_;i=q\u0000<f\u0015<<y=\u0006$-TY OEә=[=f=\t\u0018;+N<m\f=oڻ,;\u000e<w\u0014GM\u0001ȼ\u001fռ5t=ʇR5ݻ+;\\\u0010=\u000f\t+eW=\u0018YYD=<O<YY=\u0013=A;aO===p\u001b=Jg;s<H=<F =p=&==N1<0,\t<;:=}<g8w<^\u0018J%t=\u0014e=<&x\u0012=<6=g\u0002`=Zg <ΐCy]4<ۻ'Q<\rQ?+!\f\b-F{<\non$׽ϼ\u0012Fj<v \u0004<\u000e==ʙ\u0013=<ʼ~\u0005T\u0002^R@9<k4SY =d;0k\u0018톽S\u001b;\\0\n}Խ;޿\u0012=}bѼy\u001b\u0018p|;Sh\u0000\u0015GB4΂\u0014\u001b.=?1=W\u000bk =\u0012A;m2e<^'S<\u0002\f@f)\u001a\u0019;\u0007;\u0006Z<I<7]=n====\u001eW<+]@ꚼ\u0007r<R\"gm\\\u0019ʏH%?%fG\u0012\b䭽4Լ$)\u0014A2\u0004OG9@_\u0006\u000f=函G?\u0005<;{kۏTn#!<3\r>z-=ʻ=\u0004O\u000e>Q$8=\u001a<+oߜ9jC;\u0010\"\u0012\u0018BC<\u0012-ֽ}P?\u0014;jKPe\u001dǽ\u0000C\u0016<\u0012\u001dD=\u0018\u0007<Ջ\u0000<Z\u0011s;@;;+Sv<\"Xռ\u0005]vs\u000f4F<kN=XLf=A\u001c\u0013\u00111Υ\u001cE\u0011H]M<#;P~'x;ӹA\b\tr<v\u0015zEP=M\u0004\u001a\u0001\u0004/\u001a߈g<f=[׼\f_#3x87\u0006\u001e\u001f뭼h\u0003&\u000fză<\u0007i;k\fv=e<̻>;iv\u0015\u0000V\u0013\u0006vBJ<?r\"w3=\u00016=><\t=V+=sio<\u0001;\u0018|L\u000b<$;:Ia<m'<\u000b<5<?w;R=\u001bo=Z}\u0010=bڹDq=B6^$<\u0015=#\u0011h)EŖ=Я<6\u001b~==? >s\u0004+<15<_[{7<?+=M_Ҽh<\u0002=ƼP-;:>\"<DS!v_»7<~'=\u0010\u000b<y\u0005=JS=\u0019<-̅<;:*X\b\f\u0010\u0001B septimbre_amt.encoder.emb.1.biasJ0:ϰT;1a\u000e<|=>dM=\u0012:p.<ˏdfQ)>j*\u0016\b\u0001\u0010\u0007B\u0006val_25J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0016\b\u0001\u0010\u0007B\u0006val_29J\b*\u0016\b\u0001\u0010\u0007B\u0006val_33J\b\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000*.\b\u0004\u0010\u0007B\u0006val_47J \u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000$\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_353J\b\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0011\u0010\u0001B\u0007val_369J\u0004\u0000\u0000?*/\b\u0004\u0010\u0007B\u0007val_379J \u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_398J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_483J\b$\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_484J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_632J\b\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_686J\b9\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_741J\b\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_773J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_795J\bH\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_850J\b\u0005\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_882J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_904J\bT\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_959J\b\u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0017\b\u0001\u0010\u0007B\u0007val_991J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0018\b\u0001\u0010\u0007B\bval_1013J\b]\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0018\b\u0001\u0010\u0007B\bval_1068J\b\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0018\b\u0001\u0010\u0007B\bval_1100J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0018\b\u0001\u0010\u0007B\bval_1122J\be\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0018\b\u0001\u0010\u0007B\bval_1177J\b\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0018\b\u0001\u0010\u0007B\bval_1209J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000*(\b\u0003\u0010\u0007B\bval_1253J\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000* \b\u0004\u0010\u0001B\bval_1257J\u0010\u0000\u0000?\u0000\u0000?\u0000\u0000?\u0000\u0000?* \b\u0004\u0010\u0001B\bval_1260J\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000*T\b\u0010\b\u0001\b\u0001\u0010\u0001B\bval_1269J@#t?Eϡ??1?\u0000/?.?G?\u0015|?[\u001f?8?F{?S?N*?\u0018?fɘ???*T\b\u0010\b\u0001\b\u0001\u0010\u0001B\bval_1271J@b*\u0015o=\u000fOGF\u0013\b<&yt\u0010}\u0018\u001fe?m-\u0004{^Ѽѽ<tB<uE>E=*(\b\u0003\u0010\u0007B\bval_1275J\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0018\b\u0002\u0010\u0001B\bval_1279J\b\u0000\u0000?\u0000\u0000?*\u0018\b\u0002\u0010\u0001B\bval_1282J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000*4\b\b\b\u0001\b\u0001\u0010\u0001B\bval_1291J zP?\u000bx?a?T?d?b}i?V:l?.ra?*4\b\b\b\u0001\b\u0001\u0010\u0001B\bval_1293J g<ȭۮo=+W<\u001e=\u001a*\u001a\b\u0001\b\u0001\b\u0001\b\u0001\u0010\u0001B\bval_1295J\u0004q>* \b\u0002\u0010\u0007B\bval_1300J\u0010*0\b\u0004\u0010\u0007B\bval_1320J \u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0012\u0010\u0001B\bval_1327J\u0004̼+*T\b\u0010\u0010\u0001B\fadd_824_biasJ@\u0000>\u001c\u0001\u0006Usf)?*?.\u0018>>\nپj=1=,O>6\u0014>ᾤ죝Q.*Q\b\u0010\u0010\u0001B\trelu_biasJ@r[1\u0007>>G?fW{?NZ\u001f>\u00021=z$>\u0010>\u0011\u001e\u001a>jb>7\u0019>*/\b\u0007\u0010\u0001B\u000brelu_1_biasJ\u001c8W^+?ɒ=\u001c@\u0013=9=*\u0015\b\u0001\u0010\u0007B\u0005val_9J\b*\u0016\b\u0001\u0010\u0007B\u0006val_10J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0014\u0010\u0007B\u0006val_22J\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0014\u0010\u0007B\u0006val_30J\b\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0011\u0010\u0001B\u0007val_349J\u0004\u0000\u0000\u0000@*\u0011\u0010\u0001B\u0007val_382J\u0004E-2*\u0015\u0010\u0007B\u0007val_383J\b\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0015\u0010\u0007B\u0007val_384J\b*\u0011\u0010\u0001B\u0007val_385J\u0004\u0000\u0000\u0000\u0000* \b\u0002\u0010\u0007B\bval_1301J\u0010\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0018\b\u0001\u0010\u0007B\bval_1330J\b\f\u0000\u0000\u0000\u0000\u0000\u0000\u0000Z\u0001\n\u0005audio\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0006\u0012\u0004time\"=\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\nUSER_INPUT\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"&\n!pkg.torch.onnx.original_node_name\u0012\u0001xb\u0002\n\u0005onset\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\"?\n0pkg.torch.export.graph_signature.OutputSpec.kind\u0012\u000bUSER_OUTPUT\".\n!pkg.torch.onnx.original_node_name\u0012\tsqueeze_2b\u0002\n\u0005frame\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\"?\n0pkg.torch.export.graph_signature.OutputSpec.kind\u0012\u000bUSER_OUTPUT\".\n!pkg.torch.onnx.original_node_name\u0012\tsqueeze_3b\u0002\n\tembedding\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\f\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\"?\n0pkg.torch.export.graph_signature.OutputSpec.kind\u0012\u000bUSER_OUTPUT\"*\n!pkg.torch.onnx.original_node_name\u0012\u0005div_1j\u0001\n\u001dseptimbre_amt.cqt.cqt_kernels\u0012\u0013\n\u0011\b\u0001\u0012\r\n\u0002\bH\n\u0002\b\u0001\n\u0003\b\u0002\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"D\n!pkg.torch.onnx.original_node_name\u0012\u001fp_septimbre_amt_cqt_cqt_kernelsj\u0001\n\u001eseptimbre_amt.cqt.filtfilt.fir\u0012\u0012\n\u0010\b\u0001\u0012\f\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b!\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"E\n!pkg.torch.onnx.original_node_name\u0012 p_septimbre_amt_cqt_filtfilt_firj\u0001\n\u001bseptimbre_amt.note_branch.k\u0012\u0006\n\u0004\b\u0001\u0012\u0000\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"B\n!pkg.torch.onnx.original_node_name\u0012\u001dp_septimbre_amt_note_branch_kj\u0001\n\u001bseptimbre_amt.note_branch.b\u0012\u0006\n\u0004\b\u0001\u0012\u0000\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"B\n!pkg.torch.onnx.original_node_name\u0012\u001dp_septimbre_amt_note_branch_bjL\n2septimbre_amt.note_branch.early_conv.0.conv.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0010\n\u0002\b\b\n\u0002\b\u0005\n\u0002\b\u0005jG\n-septimbre_amt.note_branch.early_conv.1.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\b\n\u0002\b\u0010\n\u0002\b\u0019\n\u0002\b\u0003j9\n+septimbre_amt.note_branch.early_conv.1.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\bjD\n*septimbre_amt.note_branch.neck.conv.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0010\n\u0002\b\b\n\u0002\b\u0005\n\u0002\b\u0005j\u0002\n*septimbre_amt.note_branch.conv_yn.0.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0010\n\u0002\b\u0005\n\u0002\b\u0005\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"Q\n!pkg.torch.onnx.original_node_name\u0012,p_septimbre_amt_note_branch_conv_yn_0_weightj\u0002\n(septimbre_amt.note_branch.conv_yn.0.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0001\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"O\n!pkg.torch.onnx.original_node_name\u0012*p_septimbre_amt_note_branch_conv_yn_0_biasjH\n.septimbre_amt.note_branch.conv_yo1.conv.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0007\n\u0002\b\u0010\n\u0002\b\u0007\n\u0002\b\u0003j\u0002\n+septimbre_amt.note_branch.conv_yo2.0.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\b\n\u0002\b\u0003\n\u0002\b\u0005\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"R\n!pkg.torch.onnx.original_node_name\u0012-p_septimbre_amt_note_branch_conv_yo2_0_weightj\u0002\n)septimbre_amt.note_branch.conv_yo2.0.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0001\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"P\n!pkg.torch.onnx.original_node_name\u0012+p_septimbre_amt_note_branch_conv_yo2_0_biasj\u0001\n\u0017septimbre_amt.encoder.k\u0012\u0006\n\u0004\b\u0001\u0012\u0000\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\">\n!pkg.torch.onnx.original_node_name\u0012\u0019p_septimbre_amt_encoder_kj\u0001\n\u0017septimbre_amt.encoder.b\u0012\u0006\n\u0004\b\u0001\u0012\u0000\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\">\n!pkg.torch.onnx.original_node_name\u0012\u0019p_septimbre_amt_encoder_bj\u0002\n)septimbre_amt.encoder.early_conv.0.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0010\n\u0002\b\b\n\u0002\b\u0005\n\u0002\b\u0005\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"P\n!pkg.torch.onnx.original_node_name\u0012+p_septimbre_amt_encoder_early_conv_0_weightj\u0002\n'septimbre_amt.encoder.early_conv.0.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0010\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"N\n!pkg.torch.onnx.original_node_name\u0012)p_septimbre_amt_encoder_early_conv_0_biasj\u0002\n)septimbre_amt.encoder.early_conv.3.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\b\n\u0002\b\u0010\n\u0002\b\u0019\n\u0002\b\u0003\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"P\n!pkg.torch.onnx.original_node_name\u0012+p_septimbre_amt_encoder_early_conv_3_weightj\u0002\n'septimbre_amt.encoder.early_conv.3.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\b\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"N\n!pkg.torch.onnx.original_node_name\u0012)p_septimbre_amt_encoder_early_conv_3_biasj\u0002\n#septimbre_amt.encoder.neck.1.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0010\n\u0002\b\b\n\u0002\b\u0005\n\u0002\b\u0005\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"J\n!pkg.torch.onnx.original_node_name\u0012%p_septimbre_amt_encoder_neck_1_weightj\u0001\n!septimbre_amt.encoder.neck.1.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0010\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"H\n!pkg.torch.onnx.original_node_name\u0012#p_septimbre_amt_encoder_neck_1_biasj\u0002\n.septimbre_amt.encoder.res1.0.layer_norm.weight\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0010\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"U\n!pkg.torch.onnx.original_node_name\u00120p_septimbre_amt_encoder_res1_0_layer_norm_weightj\u0002\n,septimbre_amt.encoder.res1.0.layer_norm.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0010\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"S\n!pkg.torch.onnx.original_node_name\u0012.p_septimbre_amt_encoder_res1_0_layer_norm_biasj\u0002\n#septimbre_amt.encoder.res1.1.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0018\n\u0002\b\u0010\n\u0002\b\u0003\n\u0002\b\u0003\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"J\n!pkg.torch.onnx.original_node_name\u0012%p_septimbre_amt_encoder_res1_1_weightj\u0001\n!septimbre_amt.encoder.res1.1.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0018\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"H\n!pkg.torch.onnx.original_node_name\u0012#p_septimbre_amt_encoder_res1_1_biasj\u0002\n#septimbre_amt.encoder.res1.3.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0010\n\u0002\b\u0018\n\u0002\b\u0003\n\u0002\b\u0003\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"J\n!pkg.torch.onnx.original_node_name\u0012%p_septimbre_amt_encoder_res1_3_weightj\u0001\n!septimbre_amt.encoder.res1.3.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0010\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"H\n!pkg.torch.onnx.original_node_name\u0012#p_septimbre_amt_encoder_res1_3_biasj\u0001\n\u001dseptimbre_amt.encoder.emb.0.k\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0010\n\u0002\b\u0001\n\u0002\b\u0001\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"D\n!pkg.torch.onnx.original_node_name\u0012\u001fp_septimbre_amt_encoder_emb_0_kj\u0002\n\"septimbre_amt.encoder.emb.1.weight\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\f\n\u0002\b\u0010\n\u0002\b\u0003\n\u0002\b\u0005\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"I\n!pkg.torch.onnx.original_node_name\u0012$p_septimbre_amt_encoder_emb_1_weightj\u0001\n septimbre_amt.encoder.emb.1.bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\f\"<\n/pkg.torch.export.graph_signature.InputSpec.kind\u0012\tPARAMETER\"=\n5pkg.torch.export.graph_signature.InputSpec.persistent\u0012\u0004None\"G\n!pkg.torch.onnx.original_node_name\u0012\"p_septimbre_amt_encoder_emb_1_biasj\\\n\u0006val_25\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"F\n$pkg.onnxscript.optimizer.folded_from\u0012\u001e['val_22', 'val_23', 'val_24']j\\\n\u0006val_29\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"F\n$pkg.onnxscript.optimizer.folded_from\u0012\u001e['val_26', 'val_27', 'val_28']j\\\n\u0006val_33\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"F\n$pkg.onnxscript.optimizer.folded_from\u0012\u001e['val_30', 'val_31', 'val_32']jf\n\u0006val_47\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004\"P\n$pkg.onnxscript.optimizer.folded_from\u0012(['val_43', 'val_44', 'val_45', 'val_46']j`\n\u0007val_353\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"I\n$pkg.onnxscript.optimizer.folded_from\u0012!['val_350', 'val_351', 'val_352']jF\n\u0007val_369\u0012\u0006\n\u0004\b\u0001\u0012\u0000\"3\n$pkg.onnxscript.optimizer.folded_from\u0012\u000b['val_368']j\u0001\n\u0007val_379\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004\"\u0001\n$pkg.onnxscript.optimizer.folded_from\u0012_['val_371', 'val_372', 'val_373', 'val_374', 'val_375', 'val_376', 'val_377', 'val_378', 'var']j`\n\u0007val_398\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"I\n$pkg.onnxscript.optimizer.folded_from\u0012!['val_395', 'val_396', 'val_397']jU\n\u0007val_483\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\">\n$pkg.onnxscript.optimizer.folded_from\u0012\u0016['val_424', 'val_479']jU\n\u0007val_484\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\">\n$pkg.onnxscript.optimizer.folded_from\u0012\u0016['val_428', 'val_479']j`\n\u0007val_632\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"I\n$pkg.onnxscript.optimizer.folded_from\u0012!['val_409', 'val_630', 'val_631']j`\n\u0007val_686\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"I\n$pkg.onnxscript.optimizer.folded_from\u0012!['val_683', 'val_684', 'val_685']j`\n\u0007val_741\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"I\n$pkg.onnxscript.optimizer.folded_from\u0012!['val_707', 'val_739', 'val_740']jU\n\u0007val_773\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\">\n$pkg.onnxscript.optimizer.folded_from\u0012\u0016['val_718', 'val_768']j`\n\u0007val_795\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"I\n$pkg.onnxscript.optimizer.folded_from\u0012!['val_792', 'val_793', 'val_794']j`\n\u0007val_850\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"I\n$pkg.onnxscript.optimizer.folded_from\u0012!['val_816', 'val_848', 'val_849']jU\n\u0007val_882\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\">\n$pkg.onnxscript.optimizer.folded_from\u0012\u0016['val_827', 'val_877']j`\n\u0007val_904\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"I\n$pkg.onnxscript.optimizer.folded_from\u0012!['val_901', 'val_902', 'val_903']j`\n\u0007val_959\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"I\n$pkg.onnxscript.optimizer.folded_from\u0012!['val_925', 'val_957', 'val_958']jU\n\u0007val_991\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\">\n$pkg.onnxscript.optimizer.folded_from\u0012\u0016['val_936', 'val_986']jd\n\bval_1013\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"L\n$pkg.onnxscript.optimizer.folded_from\u0012$['val_1010', 'val_1011', 'val_1012']jd\n\bval_1068\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"L\n$pkg.onnxscript.optimizer.folded_from\u0012$['val_1034', 'val_1066', 'val_1067']jX\n\bval_1100\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"@\n$pkg.onnxscript.optimizer.folded_from\u0012\u0018['val_1045', 'val_1095']jd\n\bval_1122\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"L\n$pkg.onnxscript.optimizer.folded_from\u0012$['val_1119', 'val_1120', 'val_1121']jd\n\bval_1177\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"L\n$pkg.onnxscript.optimizer.folded_from\u0012$['val_1143', 'val_1175', 'val_1176']jX\n\bval_1209\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001\"@\n$pkg.onnxscript.optimizer.folded_from\u0012\u0018['val_1154', 'val_1204']jo\n\bval_1253\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0003\"W\n$pkg.onnxscript.optimizer.folded_from\u0012/['val_1250', 'val_1251', 'val_1252', 'val_707']j{\n\bval_1257\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0004\"c\n$pkg.onnxscript.optimizer.folded_from\u0012;['val_1250', 'val_1251', 'val_1255', 'val_1256', 'val_707']j{\n\bval_1260\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0004\"c\n$pkg.onnxscript.optimizer.folded_from\u0012;['val_1250', 'val_1251', 'val_1258', 'val_1259', 'val_707']j\u0001\n\bval_1269\u0012\u0012\n\u0010\b\u0001\u0012\f\n\u0002\b\u0010\n\u0002\b\u0001\n\u0002\b\u0001\"\u0001\n$pkg.onnxscript.optimizer.folded_from\u0012h['septimbre_amt.encoder.early_conv.1.weight', 'val_1264', 'val_1265', 'val_1266', 'val_1267', 'val_707']j\u0001\n\bval_1271\u0012\u0012\n\u0010\b\u0001\u0012\f\n\u0002\b\u0010\n\u0002\b\u0001\n\u0002\b\u0001\"\u0001\n$pkg.onnxscript.optimizer.folded_from\u0012f['septimbre_amt.encoder.early_conv.1.bias', 'val_1264', 'val_1265', 'val_1266', 'val_1268', 'val_707']jn\n\bval_1275\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0003\"V\n$pkg.onnxscript.optimizer.folded_from\u0012.['val_1272', 'val_1273', 'val_1274', 'val_30']jz\n\bval_1279\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0002\"b\n$pkg.onnxscript.optimizer.folded_from\u0012:['val_1272', 'val_1273', 'val_1277', 'val_1278', 'val_30']jz\n\bval_1282\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0002\"b\n$pkg.onnxscript.optimizer.folded_from\u0012:['val_1272', 'val_1273', 'val_1280', 'val_1281', 'val_30']j\u0001\n\bval_1291\u0012\u0012\n\u0010\b\u0001\u0012\f\n\u0002\b\b\n\u0002\b\u0001\n\u0002\b\u0001\"\u0001\n$pkg.onnxscript.optimizer.folded_from\u0012b['septimbre_amt.encoder.neck.0.weight', 'val_1286', 'val_1287', 'val_1288', 'val_1289', 'val_707']j\u0001\n\bval_1293\u0012\u0012\n\u0010\b\u0001\u0012\f\n\u0002\b\b\n\u0002\b\u0001\n\u0002\b\u0001\"\u0001\n$pkg.onnxscript.optimizer.folded_from\u0012`['septimbre_amt.encoder.neck.0.bias', 'val_1286', 'val_1287', 'val_1288', 'val_1290', 'val_707']j\n\bval_1295\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\"[\n$pkg.onnxscript.optimizer.folded_from\u00123['septimbre_amt.encoder.neck.2.weight', 'val_1294']jX\n\bval_1300\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0002\"@\n$pkg.onnxscript.optimizer.folded_from\u0012\u0018['val_1298', 'val_1299']j\u0001\n\bval_1320\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004\"\u0001\n$pkg.onnxscript.optimizer.folded_from\u0012]['val_1313', 'val_1314', 'val_1315', 'val_1316', 'val_1317', 'val_1318', 'val_1319', 'var_1']jH\n\bval_1327\u0012\u0006\n\u0004\b\u0001\u0012\u0000\"4\n$pkg.onnxscript.optimizer.folded_from\u0012\f['val_1326']j\u001a\n\fadd_824_bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0010j\u0017\n\trelu_bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0010j\u0019\n\u000brelu_1_bias\u0012\n\n\b\b\u0001\u0012\u0004\n\u0002\b\u0007j\u0013\n\u0005val_9\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001j\u0014\n\u0006val_10\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001j\u0010\n\u0006val_22\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0010\n\u0006val_30\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007val_349\u0012\u0006\n\u0004\b\u0001\u0012\u0000j\u0011\n\u0007val_382\u0012\u0006\n\u0004\b\u0001\u0012\u0000j\u0011\n\u0007val_383\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007val_384\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007val_385\u0012\u0006\n\u0004\b\u0001\u0012\u0000j\u0016\n\bval_1301\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0002j\u0016\n\bval_1330\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001j\u0013\n\u0005val_0\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001j\u0019\n\u000fsym_size_int_85\u0012\u0006\n\u0004\b\u0007\u0012\u0000j \n\u0006conv1d\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0006\u0012\u0004timej\u001e\n\u0004flip\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0006\u0012\u0004timej\"\n\bconv1d_1\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0006\u0012\u0004timej \n\u0006flip_1\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0006\u0012\u0004timej,\n\u0007slice_1\u0012!\n\u001f\b\u0001\u0012\u001b\n\u0002\b\u0001\n\u0002\b\u0001\n\u0011\u0012\u000f((time + 1)//2)jB\n\bconv1d_2\u00126\n4\b\u0001\u00120\n\u0002\b\u0001\n\u0002\bH\n&\u0012$((((((time + 1)//2)) - 1)//256)) + 1jB\n\u0004view\u0012:\n8\b\u0001\u00124\n\u0002\b\u0001\n\u0002\b\u0002\n\u0002\b$\n&\u0012$((((((time + 1)//2)) - 1)//256)) + 1j-\n\bconv1d_3\u0012!\n\u001f\b\u0001\u0012\u001b\n\u0002\b\u0001\n\u0002\b\u0001\n\u0011\u0012\u000f((time + 1)//2)j+\n\u0006flip_2\u0012!\n\u001f\b\u0001\u0012\u001b\n\u0002\b\u0001\n\u0002\b\u0001\n\u0011\u0012\u000f((time + 1)//2)j-\n\bconv1d_4\u0012!\n\u001f\b\u0001\u0012\u001b\n\u0002\b\u0001\n\u0002\b\u0001\n\u0011\u0012\u000f((time + 1)//2)j+\n\u0006flip_3\u0012!\n\u001f\b\u0001\u0012\u001b\n\u0002\b\u0001\n\u0002\b\u0001\n\u0011\u0012\u000f((time + 1)//2)j9\n\u0007slice_2\u0012.\n,\b\u0001\u0012(\n\u0002\b\u0001\n\u0002\b\u0001\n\u001e\u0012\u001c(((((time + 1)//2)) + 1)//2)jO\n\bconv1d_5\u0012C\nA\b\u0001\u0012=\n\u0002\b\u0001\n\u0002\bH\n3\u00121(((((((((time + 1)//2)) + 1)//2)) - 1)//128)) + 1jQ\n\u0006view_1\u0012G\nE\b\u0001\u0012A\n\u0002\b\u0001\n\u0002\b\u0002\n\u0002\b$\n3\u00121(((((((((time + 1)//2)) + 1)//2)) - 1)//128)) + 1j:\n\bconv1d_6\u0012.\n,\b\u0001\u0012(\n\u0002\b\u0001\n\u0002\b\u0001\n\u001e\u0012\u001c(((((time + 1)//2)) + 1)//2)j8\n\u0006flip_4\u0012.\n,\b\u0001\u0012(\n\u0002\b\u0001\n\u0002\b\u0001\n\u001e\u0012\u001c(((((time + 1)//2)) + 1)//2)j:\n\bconv1d_7\u0012.\n,\b\u0001\u0012(\n\u0002\b\u0001\n\u0002\b\u0001\n\u001e\u0012\u001c(((((time + 1)//2)) + 1)//2)j8\n\u0006flip_5\u0012.\n,\b\u0001\u0012(\n\u0002\b\u0001\n\u0002\b\u0001\n\u001e\u0012\u001c(((((time + 1)//2)) + 1)//2)jF\n\u0007slice_3\u0012;\n9\b\u0001\u00125\n\u0002\b\u0001\n\u0002\b\u0001\n+\u0012)((((((((time + 1)//2)) + 1)//2)) + 1)//2)j[\n\bconv1d_8\u0012O\nM\b\u0001\u0012I\n\u0002\b\u0001\n\u0002\bH\n?\u0012=((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) - 1)//64)) + 1j]\n\u0006view_2\u0012S\nQ\b\u0001\u0012M\n\u0002\b\u0001\n\u0002\b\u0002\n\u0002\b$\n?\u0012=((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) - 1)//64)) + 1jG\n\bconv1d_9\u0012;\n9\b\u0001\u00125\n\u0002\b\u0001\n\u0002\b\u0001\n+\u0012)((((((((time + 1)//2)) + 1)//2)) + 1)//2)jE\n\u0006flip_6\u0012;\n9\b\u0001\u00125\n\u0002\b\u0001\n\u0002\b\u0001\n+\u0012)((((((((time + 1)//2)) + 1)//2)) + 1)//2)jH\n\tconv1d_10\u0012;\n9\b\u0001\u00125\n\u0002\b\u0001\n\u0002\b\u0001\n+\u0012)((((((((time + 1)//2)) + 1)//2)) + 1)//2)jE\n\u0006flip_7\u0012;\n9\b\u0001\u00125\n\u0002\b\u0001\n\u0002\b\u0001\n+\u0012)((((((((time + 1)//2)) + 1)//2)) + 1)//2)jS\n\u0007slice_4\u0012H\nF\b\u0001\u0012B\n\u0002\b\u0001\n\u0002\b\u0001\n8\u00126(((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)ji\n\tconv1d_11\u0012\\\nZ\b\u0001\u0012V\n\u0002\b\u0001\n\u0002\bH\nL\u0012J(((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//32)) + 1jj\n\u0006view_3\u0012`\n^\b\u0001\u0012Z\n\u0002\b\u0001\n\u0002\b\u0002\n\u0002\b$\nL\u0012J(((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//32)) + 1jU\n\tconv1d_12\u0012H\nF\b\u0001\u0012B\n\u0002\b\u0001\n\u0002\b\u0001\n8\u00126(((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jR\n\u0006flip_8\u0012H\nF\b\u0001\u0012B\n\u0002\b\u0001\n\u0002\b\u0001\n8\u00126(((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jU\n\tconv1d_13\u0012H\nF\b\u0001\u0012B\n\u0002\b\u0001\n\u0002\b\u0001\n8\u00126(((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jR\n\u0006flip_9\u0012H\nF\b\u0001\u0012B\n\u0002\b\u0001\n\u0002\b\u0001\n8\u00126(((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)j`\n\u0007slice_5\u0012U\nS\b\u0001\u0012O\n\u0002\b\u0001\n\u0002\b\u0001\nE\u0012C((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jv\n\tconv1d_14\u0012i\ng\b\u0001\u0012c\n\u0002\b\u0001\n\u0002\bH\nY\u0012W((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//16)) + 1jw\n\u0006view_4\u0012m\nk\b\u0001\u0012g\n\u0002\b\u0001\n\u0002\b\u0002\n\u0002\b$\nY\u0012W((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//16)) + 1jb\n\tconv1d_15\u0012U\nS\b\u0001\u0012O\n\u0002\b\u0001\n\u0002\b\u0001\nE\u0012C((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)j`\n\u0007flip_10\u0012U\nS\b\u0001\u0012O\n\u0002\b\u0001\n\u0002\b\u0001\nE\u0012C((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jb\n\tconv1d_16\u0012U\nS\b\u0001\u0012O\n\u0002\b\u0001\n\u0002\b\u0001\nE\u0012C((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)j`\n\u0007flip_11\u0012U\nS\b\u0001\u0012O\n\u0002\b\u0001\n\u0002\b\u0001\nE\u0012C((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jm\n\u0007slice_6\u0012b\n`\b\u0001\u0012\\\n\u0002\b\u0001\n\u0002\b\u0001\nR\u0012P(((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)j\u0001\n\tconv1d_17\u0012u\ns\b\u0001\u0012o\n\u0002\b\u0001\n\u0002\bH\ne\u0012c(((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//8)) + 1j\u0001\n\u0006view_5\u0012y\nw\b\u0001\u0012s\n\u0002\b\u0001\n\u0002\b\u0002\n\u0002\b$\ne\u0012c(((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//8)) + 1jo\n\tconv1d_18\u0012b\n`\b\u0001\u0012\\\n\u0002\b\u0001\n\u0002\b\u0001\nR\u0012P(((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jm\n\u0007flip_12\u0012b\n`\b\u0001\u0012\\\n\u0002\b\u0001\n\u0002\b\u0001\nR\u0012P(((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jo\n\tconv1d_19\u0012b\n`\b\u0001\u0012\\\n\u0002\b\u0001\n\u0002\b\u0001\nR\u0012P(((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jm\n\u0007flip_13\u0012b\n`\b\u0001\u0012\\\n\u0002\b\u0001\n\u0002\b\u0001\nR\u0012P(((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jz\n\u0007slice_7\u0012o\nm\b\u0001\u0012i\n\u0002\b\u0001\n\u0002\b\u0001\n_\u0012]((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)j\u0001\n\tconv1d_20\u0012\u0001\n\u0001\b\u0001\u0012|\n\u0002\b\u0001\n\u0002\bH\nr\u0012p((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//4)) + 1j\u0001\n\u0006view_6\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0002\n\u0002\b$\nr\u0012p((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//4)) + 1j|\n\tconv1d_21\u0012o\nm\b\u0001\u0012i\n\u0002\b\u0001\n\u0002\b\u0001\n_\u0012]((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jz\n\u0007flip_14\u0012o\nm\b\u0001\u0012i\n\u0002\b\u0001\n\u0002\b\u0001\n_\u0012]((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)j|\n\tconv1d_22\u0012o\nm\b\u0001\u0012i\n\u0002\b\u0001\n\u0002\b\u0001\n_\u0012]((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)jz\n\u0007flip_15\u0012o\nm\b\u0001\u0012i\n\u0002\b\u0001\n\u0002\b\u0001\n_\u0012]((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)j\u0001\n\u0007slice_8\u0012|\nz\b\u0001\u0012v\n\u0002\b\u0001\n\u0002\b\u0001\nl\u0012j(((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)j\u0001\n\tconv1d_23\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\bH\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0006view_7\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0002\n\u0002\b$\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0005cat_8\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0002\n\u0003\b\u0002\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0005pow_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0002\n\u0003\b\u0002\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0005sum_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0002\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0005sum_2\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j!\n\u0007val_359\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001j\u0001\n\u0007val_360\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_361\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u001d\n\u0007val_362\u0012\u0012\n\u0010\b\u0001\u0012\f\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001j\u0015\n\u0007val_363\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0015\n\u0007val_364\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001j\u0011\n\u0007val_365\u0012\u0006\n\u0004\b\u0007\u0012\u0000jO\n\u0007val_366\u0012\u0006\n\u0004\b\u0001\u0012\u0000\"<\n$pkg.onnxscript.optimizer.folded_from\u0012\u0014['sum_2', 'val_365']j\u001d\n\u0007val_367\u0012\u0012\n\u0010\b\u0001\u0012\f\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001j\u0011\n\u0007val_370\u0012\u0006\n\u0004\b\u0001\u0012\u0000j\u0019\n\u0003var\u0012\u0012\n\u0010\b\u0001\u0012\f\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001j!\n\u0007val_380\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001j\u001e\n\u0004sqrt\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001j\u0001\n\u0007add_607\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0002\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0003log\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0002\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u001f\n\u0005log_1\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001j\u0001\n\u0006sub_94\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0002\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0011\n\u0007add_617\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0016\n\ffloordiv_359\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007add_618\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0016\n\ffloordiv_360\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007add_619\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0016\n\ffloordiv_361\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007add_620\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0016\n\ffloordiv_362\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007add_621\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0016\n\ffloordiv_363\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007add_622\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0016\n\ffloordiv_364\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007add_623\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0016\n\ffloordiv_365\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007add_624\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0016\n\ffloordiv_366\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007add_625\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0016\n\ffloordiv_367\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0011\n\u0007add_626\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0015\n\u0007val_390\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0001j\u0015\n\u0007val_391\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0001\n\u0005zeros\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007slice_9\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_14\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_476\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0001\n\u0007val_478\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0015\n\u0007val_480\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_481\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_482\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_486\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_487\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_488\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_489\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_490\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0015\n\u0007val_492\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_493\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_494\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_498\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_499\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_500\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_501\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_502\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u000fslice_scatter_2\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_19\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_562\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0001\n\u0007val_564\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0015\n\u0007val_566\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_567\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_568\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_572\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_573\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_574\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_575\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_576\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u000fslice_scatter_4\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_28\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_36\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_656\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0001\n\u0007val_658\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0015\n\u0007val_660\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_661\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_662\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_666\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_667\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_668\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_669\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_670\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0015\n\u0007val_672\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_673\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_674\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_678\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_679\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_680\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_681\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_682\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u000fslice_scatter_7\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_41\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_49\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_765\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0001\n\u0007val_767\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0015\n\u0007val_769\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_770\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_771\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_775\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_776\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_777\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_778\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_779\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0015\n\u0007val_781\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_782\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_783\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_787\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_788\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_789\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_790\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_791\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0010slice_scatter_10\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_54\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_62\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_874\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0001\n\u0007val_876\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0015\n\u0007val_878\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_879\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_880\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_884\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_885\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_886\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_887\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_888\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0015\n\u0007val_890\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_891\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_892\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_896\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_897\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_898\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_899\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_900\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0010slice_scatter_13\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_67\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_75\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_983\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0001\n\u0007val_985\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0015\n\u0007val_987\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0011\n\u0007val_988\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0013\n\u0007val_989\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0013\n\u0007val_993\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0017\n\u0007val_994\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\u0007val_995\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_996\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007val_997\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0015\n\u0007val_999\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0012\n\bval_1000\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0014\n\bval_1001\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0014\n\bval_1005\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0018\n\bval_1006\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\bval_1007\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1008\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1009\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0010slice_scatter_16\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_80\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_88\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1092\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0001\n\bval_1094\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0016\n\bval_1096\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0012\n\bval_1097\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0014\n\bval_1098\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0014\n\bval_1102\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0018\n\bval_1103\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\bval_1104\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1105\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1106\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0016\n\bval_1108\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0012\n\bval_1109\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0014\n\bval_1110\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0014\n\bval_1114\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0018\n\bval_1115\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\bval_1116\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1117\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1118\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0010slice_scatter_19\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bslice_93\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\tslice_101\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1201\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0001\n\bval_1203\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0001\n\u0003\b\u0001\n\u0002\b\u0001j\u0016\n\bval_1205\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0012\n\bval_1206\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0014\n\bval_1207\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0014\n\bval_1211\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0018\n\bval_1212\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\bval_1213\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1214\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1215\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0003\b\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0016\n\bval_1217\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0012\n\bval_1218\u0012\u0006\n\u0004\b\u0007\u0012\u0000j\u0014\n\bval_1219\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0014\n\bval_1223\u0012\b\n\u0006\b\u0007\u0012\u0002\n\u0000j\u0018\n\bval_1224\u0012\f\n\n\b\u0007\u0012\u0006\n\u0000\n\u0002\b\u0001j\u0001\n\bval_1225\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1226\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1227\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\b\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0010slice_scatter_22\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007mul_595\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007add_824\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007getitem\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\nleaky_relu\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\tgetitem_3\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007add_856\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0004relu\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\tgetitem_6\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0006relu_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bconv2d_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007sigmoid\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\tgetitem_9\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0007\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0006relu_2\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0007\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0006concat\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\rconvolution_2\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\tsigmoid_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007squeeze\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\tsqueeze_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007mul_740\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007add_927\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\rconvolution_3\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u001c\n\bval_1254\u0012\u0010\n\u000e\b\u0001\u0012\n\n\u0002\b\u0001\n\u0002\b\u0004\n\u0000j\u001c\n\bval_1261\u0012\u0010\n\u000e\b\u0001\u0012\n\n\u0002\b\u0001\n\u0002\b\u0004\n\u0000j\u0016\n\bval_1262\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u001a\n\bval_1263\u0012\u000e\n\f\b\u0001\u0012\b\n\u0000\n\u0000\n\u0000\n\u0000j\u001c\n\bval_1270\u0012\u0010\n\u000e\b\u0001\u0012\n\n\u0000\n\u0002\b\u0010\n\u0000\n\u0000j\u0001\n\ngroup_norm\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\fleaky_relu_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bconv2d_3\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007add_955\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u001c\n\bval_1276\u0012\u0010\n\u000e\b\u0001\u0012\n\n\u0002\b\u0001\n\u0002\b\u0002\n\u0000j\u001c\n\bval_1283\u0012\u0010\n\u000e\b\u0001\u0012\n\n\u0002\b\u0001\n\u0002\b\u0002\n\u0000j\u0016\n\bval_1284\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u001a\n\bval_1285\u0012\u000e\n\f\b\u0001\u0012\b\n\u0000\n\u0000\n\u0000\n\u0000j\u001c\n\bval_1292\u0012\u0010\n\u000e\b\u0001\u0012\n\n\u0000\n\u0002\b\b\n\u0000\n\u0000j\u0001\n\fgroup_norm_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\b\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\rconvolution_4\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0005prelu\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007permute\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0010j\u0001\n\nlayer_norm\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\n\u0002\b\u0010j\u0001\n\tpermute_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\rconvolution_5\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0018\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0006relu_3\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0018\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\rconvolution_6\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007add_995\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u001e\n\u0004mean\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0010\n\u0002\b\u0001\n\u0002\b\u0001j\"\n\bval_1302\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0010\n\u0002\b\u0001\n\u0002\b\u0001j\u0001\n\bval_1303\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bval_1304\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u001a\n\bval_1305\u0012\u000e\n\f\b\u0001\u0012\b\n\u0002\b\u0001\n\u0002\b\u0010j\u0016\n\bval_1306\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0016\n\bval_1307\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0002j\u0012\n\bval_1308\u0012\u0006\n\u0004\b\u0007\u0012\u0000jS\n\bval_1309\u0012\u0006\n\u0004\b\u0001\u0012\u0000\"?\n$pkg.onnxscript.optimizer.folded_from\u0012\u0017['add_995', 'val_1308']j\u001a\n\bval_1310\u0012\u000e\n\f\b\u0001\u0012\b\n\u0002\b\u0001\n\u0002\b\u0010j\u0012\n\bval_1312\u0012\u0006\n\u0004\b\u0001\u0012\u0000j\u0017\n\u0005var_1\u0012\u000e\n\f\b\u0001\u0012\b\n\u0002\b\u0001\n\u0002\b\u0010j\"\n\bval_1321\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0010\n\u0002\b\u0001\n\u0002\b\u0001j \n\u0006sqrt_1\u0012\u0016\n\u0014\b\u0001\u0012\u0010\n\u0002\b\u0001\n\u0002\b\u0010\n\u0002\b\u0001\n\u0002\b\u0001j\u0001\n\u0007sub_205\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0003div\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0007mul_863\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0010\n\u0003\b\u0001\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\bconv2d_4\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\f\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u0012linalg_vector_norm\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\tclamp_min\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0016\n\bval_1333\u0012\n\n\b\b\u0007\u0012\u0004\n\u0002\b\u0004j\u0001\n\u0006expand\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\f\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u000f\n\u0005max_1\u0012\u0006\n\u0004\b\u0001\u0012\u0000j\u0001\n\u0005div_2\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\tunsqueeze\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u000f\n\u0005max_2\u0012\u0006\n\u0004\b\u0001\u0012\u0000j\u0001\n\u0005div_3\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1j\u0001\n\u000bunsqueeze_1\u0012\u0001\n\u0001\b\u0001\u0012\u0001\n\u0002\b\u0001\n\u0002\b\u0001\n\u0002\bT\n\u0012}(((((((((((((((((((((((((((time + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) + 1)//2)) - 1)//2)) + 1\u0001/\n0pkg.torch.export.ExportedProgram.graph_signature\u0012/\n# inputs\np_septimbre_amt_cqt_cqt_kernels: PARAMETER target='septimbre_amt.cqt.cqt_kernels'\np_septimbre_amt_cqt_filtfilt_fir: PARAMETER target='septimbre_amt.cqt.filtfilt.fir'\np_septimbre_amt_note_branch_k: PARAMETER target='septimbre_amt.note_branch.k'\np_septimbre_amt_note_branch_b: PARAMETER target='septimbre_amt.note_branch.b'\np_septimbre_amt_note_branch_early_conv_0_conv_weight: PARAMETER target='septimbre_amt.note_branch.early_conv.0.conv.weight'\np_septimbre_amt_note_branch_early_conv_0_bn_weight: PARAMETER target='septimbre_amt.note_branch.early_conv.0.bn.weight'\np_septimbre_amt_note_branch_early_conv_0_bn_bias: PARAMETER target='septimbre_amt.note_branch.early_conv.0.bn.bias'\np_septimbre_amt_note_branch_early_conv_1_weight: PARAMETER target='septimbre_amt.note_branch.early_conv.1.weight'\np_septimbre_amt_note_branch_early_conv_1_bias: PARAMETER target='septimbre_amt.note_branch.early_conv.1.bias'\np_septimbre_amt_note_branch_early_conv_2_weight: PARAMETER target='septimbre_amt.note_branch.early_conv.2.weight'\np_septimbre_amt_note_branch_early_conv_2_bias: PARAMETER target='septimbre_amt.note_branch.early_conv.2.bias'\np_septimbre_amt_note_branch_neck_conv_weight: PARAMETER target='septimbre_amt.note_branch.neck.conv.weight'\np_septimbre_amt_note_branch_neck_bn_weight: PARAMETER target='septimbre_amt.note_branch.neck.bn.weight'\np_septimbre_amt_note_branch_neck_bn_bias: PARAMETER target='septimbre_amt.note_branch.neck.bn.bias'\np_septimbre_amt_note_branch_conv_yn_0_weight: PARAMETER target='septimbre_amt.note_branch.conv_yn.0.weight'\np_septimbre_amt_note_branch_conv_yn_0_bias: PARAMETER target='septimbre_amt.note_branch.conv_yn.0.bias'\np_septimbre_amt_note_branch_conv_yo1_conv_weight: PARAMETER target='septimbre_amt.note_branch.conv_yo1.conv.weight'\np_septimbre_amt_note_branch_conv_yo1_bn_weight: PARAMETER target='septimbre_amt.note_branch.conv_yo1.bn.weight'\np_septimbre_amt_note_branch_conv_yo1_bn_bias: PARAMETER target='septimbre_amt.note_branch.conv_yo1.bn.bias'\np_septimbre_amt_note_branch_conv_yo2_0_weight: PARAMETER target='septimbre_amt.note_branch.conv_yo2.0.weight'\np_septimbre_amt_note_branch_conv_yo2_0_bias: PARAMETER target='septimbre_amt.note_branch.conv_yo2.0.bias'\np_septimbre_amt_encoder_k: PARAMETER target='septimbre_amt.encoder.k'\np_septimbre_amt_encoder_b: PARAMETER target='septimbre_amt.encoder.b'\np_septimbre_amt_encoder_early_conv_0_weight: PARAMETER target='septimbre_amt.encoder.early_conv.0.weight'\np_septimbre_amt_encoder_early_conv_0_bias: PARAMETER target='septimbre_amt.encoder.early_conv.0.bias'\np_septimbre_amt_encoder_early_conv_1_weight: PARAMETER target='septimbre_amt.encoder.early_conv.1.weight'\np_septimbre_amt_encoder_early_conv_1_bias: PARAMETER target='septimbre_amt.encoder.early_conv.1.bias'\np_septimbre_amt_encoder_early_conv_3_weight: PARAMETER target='septimbre_amt.encoder.early_conv.3.weight'\np_septimbre_amt_encoder_early_conv_3_bias: PARAMETER target='septimbre_amt.encoder.early_conv.3.bias'\np_septimbre_amt_encoder_neck_0_weight: PARAMETER target='septimbre_amt.encoder.neck.0.weight'\np_septimbre_amt_encoder_neck_0_bias: PARAMETER target='septimbre_amt.encoder.neck.0.bias'\np_septimbre_amt_encoder_neck_1_weight: PARAMETER target='septimbre_amt.encoder.neck.1.weight'\np_septimbre_amt_encoder_neck_1_bias: PARAMETER target='septimbre_amt.encoder.neck.1.bias'\np_septimbre_amt_encoder_neck_2_weight: PARAMETER target='septimbre_amt.encoder.neck.2.weight'\np_septimbre_amt_encoder_res1_0_layer_norm_weight: PARAMETER target='septimbre_amt.encoder.res1.0.layer_norm.weight'\np_septimbre_amt_encoder_res1_0_layer_norm_bias: PARAMETER target='septimbre_amt.encoder.res1.0.layer_norm.bias'\np_septimbre_amt_encoder_res1_1_weight: PARAMETER target='septimbre_amt.encoder.res1.1.weight'\np_septimbre_amt_encoder_res1_1_bias: PARAMETER target='septimbre_amt.encoder.res1.1.bias'\np_septimbre_amt_encoder_res1_3_weight: PARAMETER target='septimbre_amt.encoder.res1.3.weight'\np_septimbre_amt_encoder_res1_3_bias: PARAMETER target='septimbre_amt.encoder.res1.3.bias'\np_septimbre_amt_encoder_emb_0_k: PARAMETER target='septimbre_amt.encoder.emb.0.k'\np_septimbre_amt_encoder_emb_1_weight: PARAMETER target='septimbre_amt.encoder.emb.1.weight'\np_septimbre_amt_encoder_emb_1_bias: PARAMETER target='septimbre_amt.encoder.emb.1.bias'\nb_septimbre_amt_note_branch_early_conv_0_bn_running_mean: BUFFER target='septimbre_amt.note_branch.early_conv.0.bn.running_mean' persistent=True\nb_septimbre_amt_note_branch_early_conv_0_bn_running_var: BUFFER target='septimbre_amt.note_branch.early_conv.0.bn.running_var' persistent=True\nb_septimbre_amt_note_branch_early_conv_0_bn_num_batches_tracked: BUFFER target='septimbre_amt.note_branch.early_conv.0.bn.num_batches_tracked' persistent=True\nb_septimbre_amt_note_branch_early_conv_2_running_mean: BUFFER target='septimbre_amt.note_branch.early_conv.2.running_mean' persistent=True\nb_septimbre_amt_note_branch_early_conv_2_running_var: BUFFER target='septimbre_amt.note_branch.early_conv.2.running_var' persistent=True\nb_septimbre_amt_note_branch_early_conv_2_num_batches_tracked: BUFFER target='septimbre_amt.note_branch.early_conv.2.num_batches_tracked' persistent=True\nb_septimbre_amt_note_branch_neck_bn_running_mean: BUFFER target='septimbre_amt.note_branch.neck.bn.running_mean' persistent=True\nb_septimbre_amt_note_branch_neck_bn_running_var: BUFFER target='septimbre_amt.note_branch.neck.bn.running_var' persistent=True\nb_septimbre_amt_note_branch_neck_bn_num_batches_tracked: BUFFER target='septimbre_amt.note_branch.neck.bn.num_batches_tracked' persistent=True\nb_septimbre_amt_note_branch_conv_yo1_bn_running_mean: BUFFER target='septimbre_amt.note_branch.conv_yo1.bn.running_mean' persistent=True\nb_septimbre_amt_note_branch_conv_yo1_bn_running_var: BUFFER target='septimbre_amt.note_branch.conv_yo1.bn.running_var' persistent=True\nb_septimbre_amt_note_branch_conv_yo1_bn_num_batches_tracked: BUFFER target='septimbre_amt.note_branch.conv_yo1.bn.num_batches_tracked' persistent=True\nx: USER_INPUT\n\n# outputs\nsqueeze_2: USER_OUTPUT\nsqueeze_3: USER_OUTPUT\ndiv_1: USER_OUTPUT\n\u0001J\n2pkg.torch.export.ExportedProgram.range_constraints\u0012\u0014{s53: VR[0, int_oo]}B\u0004\n\u0000\u0010\u0014"
  },
  {
    "path": "dataProcess/AI/septimbre_worker.js",
    "content": "// const ort_folder = 'https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/';\n// self.importScripts(ort_folder + 'ort.wasm.min.js');\n// ort.env.wasm.wasmPaths = ort_folder;\nself.importScripts('./postprocess.js');\nself.importScripts('./SpectralClustering.js');\nself.importScripts('./dist/bundle.min.js')\nort.env.wasm.wasmPaths = './dist/'\n\nconst model = ort.InferenceSession.create(\n    './septimbre_44100.onnx',\n    { executionProviders: ['wasm'] }\n);\n\nself.onmessage = function ({data}) {\n    if (typeof data === 'number') {\n        // 接收到的是k\n        self.k = data;\n        return;\n    }\n    const tensorInput = new ort.Tensor('float32', data, [1, 1, data.length]);\n    model.then((m) => {\n        return m.run({ audio: tensorInput });\n    }).then((results) => {\n        const note_events = createNotes(\n            results.onset, results.frame,\n            0.31, 0.35\n        );\n        console.time('clusterNotes');\n        const clustered_notes = clusterNotes(\n            note_events,\n            results.embedding,\n            results.frame,\n            self.k || 2\n        );\n        console.timeEnd('clusterNotes');\n        self.postMessage(clustered_notes);\n    }).catch((e) => {\n        // promise中的报错不会触发worker.onerror回调，即使这里throw了。所以只能用onmessage\n        self.postMessage({ type: 'error', message: e.message });\n    });\n};\n\n\nfunction clusterNotes(note_events, embTensor, frameTensor, k=2) {\n    // 模型中已经对onset和frame进行归一化了\n    const raw_frameData = frameTensor.cpuData;\n    const frameDim = frameTensor.dims;  // [1, 84, frames]\n    const raw_embData = embTensor.cpuData;\n    const embDim = embTensor.dims;  // [1, 12, 84, frames]\n\n    const frameNum = frameDim[2];\n    const noteNum = frameDim[1];\n\n    const frameData = Array(noteNum);\n    for (let i = 0; i < noteNum; i++) {\n        // 和raw共享内存\n        frameData[i] = new Float32Array(raw_frameData.buffer, i * frameNum * 4, frameNum);\n    }\n\n    const spaceSize = noteNum * frameNum;\n    function getEmbedding(note, time, emb) {\n        // embDim: [1, 12, 84, frames]\n        // raw_embData: Float32Array\n        for (let i = 0; i < embDim[1]; i++) {\n            // 计算在一维数组中的索引\n            // 索引 = i * noteNum * frameNum + note * frameNum + time\n            emb[i] = raw_embData[\n                i * spaceSize + note * frameNum + time\n            ];\n        }\n        return emb;\n    }\n\n    const embeddings = [];\n    const buffer = new Float32Array(embDim[1]);\n    for (const note_event of note_events) {\n        const { onset, offset, note } = note_event;\n        const emb = new Float32Array(embDim[1]);\n        // 取音符中间的embedding\n        for (let t = onset; t < offset; t++) {\n            const e = getEmbedding(note - 24, t, buffer);\n            const frame = frameData[note - 24][t];\n            const w = frame * frame;  // 用frame的值作为权重\n            for (let i = 0; i < embDim[1]; i++) {\n                emb[i] += e[i] * w;\n            }\n        }\n        let norm = 0.0;\n        for (let i = 0; i < embDim[1]; i++) norm += emb[i] * emb[i];\n        norm = Math.sqrt(norm);\n        for (let i = 0; i < embDim[1]; i++) emb[i] /= norm;\n        embeddings.push(emb);\n    }\n\n    const labels = SpectralClustering(embeddings, k);\n    const clustered_notes = Array.from({ length: k }, () => []);\n    for (let i = 0; i < note_events.length; i++) {\n        clustered_notes[labels[i]].push(note_events[i]);\n    }\n    return clustered_notes;\n}"
  },
  {
    "path": "dataProcess/ANA.js",
    "content": "/**\n * @file ANA.js (auto note alignment)\n * @abstract 融合HMM和DTW的音符自动对齐\n * @description\n * ## 记法\n * 从左到右——时频谱从开始到结尾\n * 从上到下——音符序列从开始到结尾\n * 起点：左上角；终点：右下角\n * \n * ## 转移规则:\n * 从左到右从上到下计算\n * 仅有当前格为-1时才能计算向下扩散，向下扩散不使用状态转移概率(实际还是用了，提高切换的门槛)\n * 其余都只能向右和右下扩散\n * 计算第t列仅能使用第(t-1)列，需要乘上状态转移概率\n * \n * P(s_{t}=-1 | s_{t-1}=-1) = 0.32\n * P(s_{t}!=-1 | s_{t-1}=-1) = 0.68\n * \n * P(s_{t}=-1 | s_{t-1}!=-1) = 0.2\n * P(s_{t}=s_{t-1} | s_{t-1}!=-1) = 0.8\n * \n * ## 激发概率\n * 取可能遇到的bin的max，以此为边界缩放，并小值补偿（开根号），记为当前bin存在音符的概率\n */\n\n/**\n * HMM 进行自动音符-音频对齐 规则见上\n * @param {Array<number>} noteSeq 音符序列，已经插入了间隔-1\n * @param {Array<Float32Array>} spectrum 时频谱 第一维是时间\n * @param {number} minLen 建议的音符最小长度 可为小数\n * @returns {Array<Array<number>>} 全局最优路径 [[n, s], [n2, s2], ...]\n */\nfunction autoNoteAlign(noteSeq, spectrum, minLen = 2) {\n    class AlignInfo {\n        constructor(v = -Infinity, k = 0) {\n            this.value = v; // 指向上一帧的某个bin\n            this.keep = k;  // 音符长度\n        }\n    };\n\n    /**\n     * 找到可能的最大最小值，返回线性归一化函数\n     * @param {Set<number>} noteSet \n     * @param {Array<Float32Array>} spectrum \n     * @returns {Function(number)} 归一化函数\n     */\n    function _getNormalizeFN(noteSet, spectrum) {\n        let max = -Infinity;\n        let min = Infinity;\n        for (const s of spectrum) {\n            for (const bin of noteSet) {\n                if (s[bin] > max) max = s[bin];\n                if (s[bin] < min) min = s[bin];\n            }\n        }\n        const len = max - min;\n        return (x) => (x - min) / len;\n    }\n\n    const fn = _getNormalizeFN(new Set(noteSeq), spectrum);\n    let buffer_curr = Array(noteSeq.length);\n    let buffer_prev = Array(noteSeq.length);\n    for (let i = 0; i < noteSeq.length; i++) {\n        buffer_curr[i] = new AlignInfo();\n        buffer_prev[i] = new AlignInfo();\n    }\n    buffer_prev[0].value = 0;\n\n    const k = 0.52; // 由于大值很少，0很多，因此要提高对小值的敏感度\n\n    const P = Array(spectrum.length);\n    for (let frame = 0; frame < spectrum.length; frame++) {\n        const from = P[frame] = new Uint16Array(noteSeq.length).fill(-1);\n        const frameSpectrum = spectrum[frame];\n        // 先向右和右下扩散\n        for (let i = 0; i < noteSeq.length; ++i) {\n            const root = buffer_prev[i];\n            // 由于路径限制，并不是每个位置都能到达，可以跳过\n            if (root.value === -Infinity) break;\n            if (noteSeq[i] === -1) {\n                if (i + 1 < noteSeq.length) {\n                    const hasNote = Math.pow(fn(frameSpectrum[noteSeq[i + 1]]), k);\n                    // 以下的概率和不为1...然而强制缩放为1效果很差，不如就这样，可解释性还高\n                    const keepP = 0.32;\n                    // 保持空状态\n                    const right = root.value + Math.log(Math.max((1 - hasNote) * keepP, 1e-12));\n                    if (buffer_curr[i].value < right) {\n                        buffer_curr[i].value = right;\n                        from[i] = i;\n                        buffer_curr[i].keep = root.keep + 1;\n                    }\n                    // 切换为音符\n                    const rightdown = root.value + Math.log(Math.max(hasNote * (1 - keepP), 1e-12));\n                    if (buffer_curr[i + 1].value < rightdown) {\n                        buffer_curr[i + 1].value = rightdown;\n                        from[i + 1] = i;\n                        buffer_curr[i + 1].keep = 0;\n                    }\n                } else {    // 没有下一个了 保持较小速率降低\n                    const p = root.value - 1;\n                    if (buffer_curr[i].value < p) {\n                        buffer_curr[i].value = p;\n                        from[i] = i;\n                        buffer_curr[i].keep = root.keep + 1;\n                    }\n                }\n            } else {    // 是音符\n                const hasNote = Math.pow(fn(frameSpectrum[noteSeq[i]]), k);\n                let keepP = 0.8;\n                if (root.keep < minLen) {\n                    // 初始概率必须大 不然高时间分辨率频谱下容易出现很碎的音\n                    keepP = 0.999 - 0.09 * (root.keep / minLen);\n                }\n                // 保持音符\n                const right = root.value + Math.log(Math.max(hasNote * keepP, 1e-12));\n                if (buffer_curr[i].value < right) {\n                    buffer_curr[i].value = right;\n                    from[i] = i;\n                    buffer_curr[i].keep = root.keep + 1;\n                }\n                // 暂停\n                const rightdown = root.value + Math.log(Math.max((1 - hasNote) * (1 - keepP), 1e-12));\n                if (buffer_curr[i + 1].value < rightdown) {\n                    buffer_curr[i + 1].value = rightdown;\n                    from[i + 1] = i;\n                    buffer_curr[i + 1].keep = 0;\n                }\n            }\n        }\n        // 再处理纵向扩散 第一位永远是-1可以跳过\n        for (let i = 1; i < noteSeq.length; ++i) {\n            if (buffer_curr[i - 1].value === -Infinity) break;\n            if (noteSeq[i - 1] === -1) {\n                const hasNote = Math.pow(fn(frameSpectrum[noteSeq[i]]), k);\n                const down = buffer_curr[i - 1].value + Math.log(Math.max(hasNote * 0.8, 1e-12));\n                if (buffer_curr[i].value < down) {\n                    buffer_curr[i].value = down;\n                    from[i] = from[i - 1];\n                    buffer_curr[i].keep = 0;\n                }\n            }\n        }\n        // 交换位置并复原\n        [buffer_curr, buffer_prev] = [buffer_prev, buffer_curr];\n        for (const i of buffer_curr) {\n            i.keep = 0;\n            i.value = -Infinity;\n        }\n    }\n    // 寻路\n    const path = [];\n    let noteidx = noteSeq.length - 1;\n    for (let frame = P.length - 1; frame >= 0; frame--) {\n        path.push([noteidx, frame]);\n        noteidx = P[frame][noteidx];\n    }\n    path.reverse();\n    return path;\n}"
  },
  {
    "path": "dataProcess/CQT/cqt.js",
    "content": "// 开启CQT的Worker线程，因为CQT是耗时操作，所以放在Worker线程中\nfunction cqt(channels, tNum, fmin, useGPU = false) {\n    return new Promise((resolve, reject) => {\n        const worker = new Worker(\"./dataProcess/CQT/cqt_worker.js\");\n        worker.onerror = (e) => {\n            reject(e);\n            worker.terminate();\n        };\n        worker.onmessage = ({ data }) => {\n            resolve(data);\n            worker.terminate();\n        };\n        worker.postMessage({\n            audioChannel: channels,\n            sampleRate: channels.sampleRate,\n            hop: Math.round(channels.sampleRate / tNum),\n            fmin,\n            useGPU\n        }, channels.map(x => x.buffer));\n    });\n}"
  },
  {
    "path": "dataProcess/CQT/cqt_worker.js",
    "content": "/**\n * 用定义计算CQT，时间复杂度很高，但是分析效果好\n */\nclass CQT {\n    /**\n     * 创建窗函数 幅度加起来为1\n     * @param {number} N \n     * @returns {Float32Array} 窗幅度\n     */\n    static blackmanHarris(N) {\n        let w = new Float32Array(N);\n        const temp = 2 * Math.PI / (N - 1);\n        let sum = 0;\n        for (let n = 0; n < N; n++) {\n            w[n] = 0.35875\n                - 0.48829 * Math.cos(temp * n)\n                + 0.14128 * Math.cos(temp * n * 2)\n                - 0.01168 * Math.cos(temp * n * 3);\n            sum += w[n];\n        }\n        // 归一化（幅度归一化，和矩形窗FFT除以N的效果一样）\n        for (let n = 0; n < N; n++) w[n] /= sum;\n        return w;\n    }\n\n    /**\n     * 预计算CQT参数\n     * @param {number} fs 采样率\n     * @param {number} fmin 最低的频率(最低八度的C) 默认为C1\n     * @param {number} octaves 要分析几个八度\n     * @param {number} bins_per_octave 几平均律\n     * @param {number} filter_scale Q的缩放倍数 越大频率选择性越好\n     */\n    constructor(fs, fmin = 32.70319566257483, octaves = 7, bins_per_octave = 12, filter_scale = 1) {\n        this.fmin = fmin;\n        this.bins_per_octave = bins_per_octave;\n        this.bins = bins_per_octave * octaves;\n        const Q = filter_scale / (Math.pow(2, 1 / bins_per_octave) - 1);\n        [this.kernel_r, this.kernel_i] = CQT.iniKernel(\n            Q, fs, fmin, bins_per_octave, this.bins\n        );\n    }\n    /**\n     * 得到CQT kernel 时域数据\n     * @param {number} Q \n     * @param {number} fs 采样率\n     * @param {number} fmin 最低音\n     * @param {number} bins_per_octave 八度内的频率个数\n     * @param {number} binNum 一共多少个频率\n     * @returns {Array<Float32Array>} [kernel_r, kernel_i]\n     */\n    static iniKernel(Q, fs, fmin, bins_per_octave = 12, binNum = 84) {\n        const kernel_r = Array(binNum);\n        const kernel_i = Array(binNum);\n        for (let i = 0; i < binNum; i++) {\n            const freq = fmin * Math.pow(2, i / bins_per_octave);\n            const len = Math.ceil(Q * fs / freq);\n            const tmp_kernel = new Float32Array(len << 1);\n            const tmp_kernel_r = kernel_r[i] = tmp_kernel.subarray(0, len);\n            const tmp_kernel_i = kernel_i[i] = tmp_kernel.subarray(len, len << 1);\n            const window = CQT.blackmanHarris(len);\n            const omega = 2 * Math.PI * freq / fs;\n            const half_len = len >> 1;\n            for (let j = 0; j < len; j++) {\n                const angle = omega * (j - half_len);   // 中心的相位为0\n                tmp_kernel_r[j] = Math.cos(angle) * window[j];\n                tmp_kernel_i[j] = -Math.sin(angle) * window[j];\n                // 而且CQT1992继承自本类，用正相位增加的旋转因子可以让频域带宽在正频率上\n            }\n        } return [kernel_r, kernel_i];\n    }\n    /**\n     * 计算CQT\n     * @param {Float32Array} x 输入实数时序信号\n     * @param {number} hop 步长\n     * @param {Float32Array} raw 可选的输出数组 如果提供了就用它来存储能量(累加) 否则新建一个\n     * @returns {Array<Float32Array>} 第一维是时间，第二维是频率\n     */\n    cqt(x, hop, raw = null) {\n        let offset = hop >> 1;\n        const output_length = (x.length - offset) / hop | 1;\n        const output = Array(output_length);\n        output.raw = raw ??= new Float32Array(output_length * this.bins);\n        for (let p = 0, pointer = 0; offset <= x.length; offset += hop, pointer++) {\n            const nextp = p + this.bins;\n            const energy = output[pointer] = raw.subarray(p, nextp);\n            p = nextp;\n            for (let b = 0; b < this.bins; b++) {    // 每个频率\n                const kernel_r = this.kernel_r[b];\n                const kernel_i = this.kernel_i[b];\n                let real = 0, imag = 0;\n                const left = offset - (kernel_r.length >> 1);\n                const right = Math.min(kernel_r.length, x.length - left);\n                for (let i = left >= 0 ? 0 : -left; i < right; i++) {\n                    const index = left + i;\n                    real += x[index] * kernel_r[i];\n                    imag += x[index] * kernel_i[i];\n                } energy[b] += real * real + imag * imag;\n            }\n        } return output;\n    }\n\n    // 能量谱归一化为幅度谱\n    static norm(s) {\n        let count = 0, mean = 0, M2 = 0;\n        for (const e of s) {\n            count++;\n            let d = e - mean;\n            mean += d / count;\n            let d2 = e - mean;\n            M2 += d * d2;\n        }\n        let invSigma = Math.sqrt(count / M2);\n        for (let i = 0; i < s.length; i++) s[i] = Math.sqrt(s[i] * invSigma);\n    }\n\n    /**\n     * 初始化 GPU kernel 缓冲区和管线\n     * 管线结果为能量和相位\n     * 增加的属性:\n     * this.adapter\n     * this.device\n     * this.workgroupsize\n     * this.kernelBuffer\n     * this.kernelInfoBuffer\n     * this.configBuffer\n     * this.CQTpipeline\n     * @param {number} workgroupsize 线程数\n     */\n    async initWebGPU(workgroupsize = 256) {\n        if (!navigator.gpu) throw new Error(\"WebGPU not supported.\");\n        const adapter = this.adapter ??= await navigator.gpu.requestAdapter();\n        if (!adapter) throw new Error(\"No GPUAdapter found.\");\n        const device = this.device ??= await adapter.requestDevice({\n            requiredLimits: {\n                maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,\n                maxBufferSize: adapter.limits.maxBufferSize,\n            }\n        });\n        this.workgroupsize = workgroupsize;\n\n        // --- kernel 缓冲区创建 ---\n        const numBins = this.bins;\n        const kernel_r = this.kernel_r;;\n        const kernel_i = this.kernel_i;\n        let totalKernelsLength = 0; // 总大小\n        for (let i = 0; i < numBins; i++)\n            totalKernelsLength += kernel_r[i].length << 1;\n        // 创建一个在创建时即映射的 GPU 缓冲区\n        const allKernelsBuffer = this.kernelBuffer ??= device.createBuffer({\n            label: \"All Kernels\",\n            size: totalKernelsLength * Float32Array.BYTES_PER_ELEMENT,\n            usage: GPUBufferUsage.STORAGE,\n            mappedAtCreation: true,\n        });\n        const mappedKernelsRange = allKernelsBuffer.getMappedRange();\n        const mappedKernelsArray = new Float32Array(mappedKernelsRange);\n        const kernelInfoData = new Uint32Array(numBins * 3);    // 每个卷积核3个信息：实部偏移、虚部偏移、长度\n        for (let i = 0, currentOffset = 0; i < numBins; i++) {\n            const infoBaseIndex = i * 3;\n            const len = kernelInfoData[infoBaseIndex + 2] = kernel_r[i].length;\n            mappedKernelsArray.set(kernel_r[i], currentOffset);\n            kernelInfoData[infoBaseIndex] = currentOffset;\n            currentOffset += len;\n            mappedKernelsArray.set(kernel_i[i], currentOffset);\n            kernelInfoData[infoBaseIndex + 1] = currentOffset;\n            currentOffset += len;\n        } allKernelsBuffer.unmap(); // 以后不能改了\n\n        // --- Kernel Info Buffer ---\n        const kernelInfoBuffer = this.kernelInfoBuffer ??= device.createBuffer({\n            label: \"Kernel Info\",\n            size: kernelInfoData.byteLength,\n            usage: GPUBufferUsage.STORAGE,\n            mappedAtCreation: true,\n        });\n        new Uint32Array(kernelInfoBuffer.getMappedRange()).set(kernelInfoData);\n        kernelInfoBuffer.unmap();\n\n        this.configBuffer = device.createBuffer({\n            label: \"Config Buffer\",\n            size: 4 * Uint32Array.BYTES_PER_ELEMENT,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n        });\n\n        // --- CQT代码 ---\n        const shaderModule = device.createShaderModule({\n            label: 'CQT Energy Compute Shader',\n            code: /* wgsl */`\nstruct KernelInfo {\n    real_offset: u32,\n    imag_offset: u32,\n    length: u32,\n};\nstruct Config {\n    hop: u32,\n    num_samples: u32,\n    num_frames: u32,\n    first_frame_center_offset: u32,\n};\n@group(0) @binding(0) var<storage, read> all_kernels: array<f32>;\n@group(0) @binding(1) var<storage, read> kernel_infos: array<KernelInfo>;\n@group(0) @binding(2) var<storage, read> config: Config;\n@group(0) @binding(3) var<storage, read> audio: array<f32>;\n@group(0) @binding(4) var<storage, read_write> output: array<f32>;\n// 共享内存 用于协作加载 kernel 能提速6%\nvar<workgroup> s_kernel_r: array<f32, ${workgroupsize}>;\nvar<workgroup> s_kernel_i: array<f32, ${workgroupsize}>;\n\n// 一次计算一个频点的workgroupsize个时间帧 使得负载均匀\n@compute @workgroup_size(${workgroupsize})\nfn main(\n    @builtin(workgroup_id) workgroup_id: vec3<u32>, // (numBins, blocks, 1)\n    @builtin(local_invocation_id) local_id: vec3<u32>\n) {\n    let frame = workgroup_id.y * ${workgroupsize}u + local_id.x;\n    let bin_idx = workgroup_id.x;\n    let info = kernel_infos[bin_idx];\n    let klen = info.length;\n    // 计算当前帧对应的音频起始位置\n    let frame_center_pos = i32(config.first_frame_center_offset + frame * config.hop);\n    let left = frame_center_pos - i32(klen >> 1u);\n    let num_samples_i32 = i32(config.num_samples);\n\n    var real: f32 = 0.0;\n    var imag: f32 = 0.0;\n    for (var base_k: u32 = 0u; base_k < klen; base_k = base_k + ${workgroupsize}u) {\n        let t_idx = local_id.x;\n        let load_k_idx = base_k + t_idx;\n        // 超出kernel长度的填0 (对于最后一块tile很重要)\n        let valid = load_k_idx < klen;\n        s_kernel_r[t_idx] = select(0.0, all_kernels[info.real_offset + load_k_idx], valid);\n        s_kernel_i[t_idx] = select(0.0, all_kernels[info.imag_offset + load_k_idx], valid);\n        workgroupBarrier();\n        if (frame < config.num_frames) {\n            let current_block_size = min(${workgroupsize}u, klen - base_k);\n            for (var j: u32 = 0u; j < current_block_size; j = j + 1u) {\n                let audio_idx = left + i32(base_k + j);\n                // 边界检查 在音频两端补零\n                if (audio_idx >= 0 && audio_idx < num_samples_i32) {\n                    let audioSample = audio[u32(audio_idx)];\n                    real = fma(audioSample, s_kernel_r[j], real);\n                    imag = fma(audioSample, s_kernel_i[j], imag);\n                }\n            }\n        } workgroupBarrier();\n    }\n    if (frame >= config.num_frames) { return; }\n    // 频率优先存储\n    let out_index = ${this.bins} * frame + bin_idx;\n    output[out_index] = output[out_index] + real * real + imag * imag;  // 如果多通道会累加\n}`\n        });\n        this.CQTpipeline ??= device.createComputePipeline({\n            label: 'CQT Full Compute Pipeline', layout: 'auto',\n            compute: { module: shaderModule, entryPoint: 'main' },\n        });\n    }\n\n    /**\n     * 使用GPU计算CQT 需要先调用 initWebGPU\n     * 第一次传入的音频数据会被视为尺寸用于后续所有计算\n     * @param {Float32Array} audioData \n     * @param {number} hop \n     */\n    cqt_GPU(audioData, hop) {\n        const device = this.device;\n        const numBins = this.bins;\n\n        // 配置\n        const offset0 = hop >> 1;\n        const numFrames = 1 + (audioData.length - offset0 - 1) / hop | 0;\n        device.queue.writeBuffer(this.configBuffer, 0, new Uint32Array([hop, audioData.length, numFrames, offset0]));\n        // 输入\n        this.inputAudioBuffer ??= device.createBuffer({\n            label: \"Full Audio Buffer\",\n            size: audioData.byteLength,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n        });\n        device.queue.writeBuffer(this.inputAudioBuffer, 0, audioData);\n        // 输出\n        const totalValues = numFrames * numBins;\n        const outputBufferSize = totalValues * Float32Array.BYTES_PER_ELEMENT;\n        this.outputBuffer ??= device.createBuffer({\n            label: \"CQT Output Buffer\",\n            size: outputBufferSize,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n        });\n\n        const bindGroup = device.createBindGroup({\n            label: 'CQT Bind Group', layout: this.CQTpipeline.getBindGroupLayout(0),\n            entries: [\n                { binding: 0, resource: { buffer: this.kernelBuffer } },\n                { binding: 1, resource: { buffer: this.kernelInfoBuffer } },\n                { binding: 2, resource: { buffer: this.configBuffer } },\n                { binding: 3, resource: { buffer: this.inputAudioBuffer } },\n                { binding: 4, resource: { buffer: this.outputBuffer } },\n            ],\n        });\n\n        const encoder = device.createCommandEncoder();\n        const pass = encoder.beginComputePass();\n        pass.setPipeline(this.CQTpipeline);\n        pass.setBindGroup(0, bindGroup);\n        pass.dispatchWorkgroups(numBins, Math.ceil(numFrames / this.workgroupsize));\n        pass.end();\n        device.queue.submit([encoder.finish()]);\n        return numFrames;\n    }\n\n    /**\n     * 提取GPU数据并用CPU归一化\n     * @param {GPUBuffer} buffer 要归一化的\n     * @param {number} numFrames 帧数\n     * @returns {Array<Float32Array>} 归一化后的幅度谱矩阵\n     */\n    async norm_CPU(buffer, numFrames) {\n        const device = this.device;\n        const readBuffer = device.createBuffer({\n            label: \"Read CQT Buffer\",\n            size: buffer.size,\n            usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n        });\n        const encoder = device.createCommandEncoder();\n        encoder.copyBufferToBuffer(buffer, 0, readBuffer, 0, buffer.size);\n        device.queue.submit([encoder.finish()]);\n        await readBuffer.mapAsync(GPUMapMode.READ);\n        const ampMatrix = Array(numFrames);\n        const raw = ampMatrix.raw = new Float32Array(readBuffer.getMappedRange()).slice();\n        readBuffer.destroy();\n        CQT.norm(raw);\n        for (let t = 0, offset = 0; t < numFrames; t++) {\n            const next = offset + this.bins;\n            ampMatrix[t] = raw.subarray(offset, next);\n            offset = next;\n        } return ampMatrix;\n    }\n\n    freeGPU() {\n        this.kernelBuffer?.destroy();\n        this.kernelInfoBuffer?.destroy();\n        this.configBuffer?.destroy();\n        this.inputAudioBuffer?.destroy();\n        this.outputBuffer?.destroy();\n        this.freqParamArray?.destroy();\n        this.kernelBuffer = null;\n        this.kernelInfoBuffer = null;\n        this.configBuffer = null;\n        this.inputAudioBuffer = null;\n        this.outputBuffer = null;\n        this.freqParamArray = null;\n        this.CQTpipeline = this.device = this.adapter = null;\n    }\n}\n\nself.onmessage = async ({ data }) => {\n    let { audioChannel, sampleRate, hop, fmin, useGPU } = data;\n    const cqt = new CQT(sampleRate, fmin, 7, 12, 2.8);\n    let cqtData;\n    try {\n        if (useGPU === false) throw new Error(\"强制使用CPU计算\");\n        await cqt.initWebGPU(256);\n        console.log(\"WebGPU初始化成功,使用GPU计算CQT\");\n        const numFrames = cqt.cqt_GPU(audioChannel[0], hop);\n        for (let i = 1; i < audioChannel.length; i++) {\n            // 开启其他通道的计算 会累加到cqt.outputBuffer\n            cqt.cqt_GPU(audioChannel[i], hop);\n        }\n        cqtData = await cqt.norm_CPU(cqt.outputBuffer, numFrames);\n        cqt.freeGPU();\n    } catch (e) {\n        console.log(\"使用CPU计算CQT\\n原因:\", e.message);\n        cqtData = cqt.cqt(audioChannel[0], hop);\n        for (let i = 1; i < audioChannel.length; i++) {\n            // 开启其他通道的计算 会累加到cqtData.raw\n            cqt.cqt(audioChannel[i], hop, cqtData.raw);\n        } CQT.norm(cqtData.raw);\n    }\n    // 要求cqtData都是一整块\n    self.postMessage(cqtData, [cqtData.raw.buffer, ...audioChannel.map(x => x.buffer)]);\n    self.close();\n};\n"
  },
  {
    "path": "dataProcess/NNLS.js",
    "content": "/**\n * 为密集计算设计的高性能非负最小二乘求解器\n */\nclass NNLSSolver {\n    /**\n     * @param {number} K 个数\n     * @param {number} M 维度\n     * @param {number} lambda 正则化参数 防止不稳定\n     * @param {Float32Array|null} buffer_r 可选的外部残差缓冲区，长度应为M\n     */\n    constructor(K, M, lambda = 1e-4, buffer_r = null) {\n        this.K = K;\n        this.M = M;\n        this.lambda = lambda;\n        // 预分配内存\n        this.c = new Float32Array(K);         // 最终系数 (K)\n        this.s = new Float32Array(K);         // 候选系数 (K)\n        this.w = new Float32Array(K);         // 梯度 (K)\n        this.residual = buffer_r ?? new Float32Array(M);  // 增量残差 (M)\n        this.matM = new Float32Array(M * M);  // 正规方程矩阵 (M*M)\n        this.rhsM = new Float32Array(M);      // 正规方程右侧向量 (M)\n        this.L = new Float32Array(M * M);     // Cholesky 分解矩阵 (M*M)\n        this.z = new Float32Array(M);         // 临时连续解向量 (M)\n        this.isP = new Uint8Array(K);         \n        this.pIdx = new Int32Array(M);        \n    }\n\n    /**\n     * 求解非负最小二乘问题 min ||Ax - b||_2^2 s.t. x >= 0\n     * @param {Float32Array} A 每M个数为一组，一共K组\n     * @param {Float32Array} b 长M\n     * @returns {Float32Array} 长K的非负系数向量x 是this.c的引用\n     */\n    solve(A, b) {\n        const { K, M, c, s, w, residual, isP, pIdx } = this;\n        c.fill(0);\n        isP.fill(0);\n        residual.set(b); \n        let pCount = 0;\n        const tol = 1e-7 * M; // 根据维度动态调整容差\n        for (let iter = 0, maxIter = K << 1; iter < maxIter; iter++) {\n            // 1. 计算梯度 w = A^T * residual\n            let maxW = -1, jMax = -1;\n            for (let j = 0; j < K; j++) {\n                if (isP[j]) continue;\n                let dot = 0;\n                const offset = j * M;\n                for (let i = 0; i < M; i++) dot += A[offset + i] * residual[i];\n                w[j] = dot;\n                if (dot > maxW) { maxW = dot; jMax = j; }\n            }\n            if (jMax === -1 || maxW < tol) break;\n            isP[jMax] = 1;\n            pIdx[pCount++] = jMax;\n            while (pCount > 0) {\n                // 求解子问题，结果暂存在 s 中\n                if (!this._solveSubProblem(A, b, pCount, pIdx, s)) {\n                    const last = pIdx[--pCount];\n                    isP[last] = c[last] = 0;\n                    break;\n                }\n                let alpha = 2.0;\n                let hasConstraintViolation = false;\n                for (let i = 0; i < pCount; i++) {\n                    const idx = pIdx[i];\n                    if (s[idx] <= 0) {\n                        const ratio = c[idx] / (c[idx] - s[idx] + 1e-15);\n                        if (ratio < alpha) { \n                            alpha = ratio; \n                            hasConstraintViolation = true;\n                        }\n                    }\n                }\n                if (!hasConstraintViolation) {\n                    // 无冲突：更新残差并接受新系数\n                    this._updateResidual(A, c, s, pCount, pIdx);\n                    for (let i = 0; i < pCount; i++) c[pIdx[i]] = s[pIdx[i]];\n                    break;\n                }\n                // 有冲突：按 alpha 步长靠近，并剔除归零的变量\n                for (let i = 0; i < pCount; i++) {\n                    const idx = pIdx[i];\n                    c[idx] += alpha * (s[idx] - c[idx]);\n                }\n                for (let i = 0; i < pCount; i++) {\n                    const idx = pIdx[i];\n                    if (c[idx] < 1e-9) { // 稍微放宽归零判定\n                        c[idx] = 0;\n                        isP[idx] = 0;\n                        pIdx[i] = pIdx[--pCount];\n                        i--;\n                    }\n                }\n                this._fullResidualUpdate(A, b, c, pCount, pIdx);\n            }\n        } return c;\n    }\n\n    _solveSubProblem(A, b, n, pIdx, s) {\n        const { M, matM, rhsM, L, z, lambda } = this;\n        // 1. 构建正规方程\n        for (let i = 0; i < n; i++) {\n            const offI = pIdx[i] * M;\n            let dotB = 0;\n            for (let r = 0; r < M; r++) dotB += A[offI + r] * b[r];\n            rhsM[i] = dotB;\n            for (let j = 0; j <= i; j++) {\n                const offJ = pIdx[j] * M;\n                let dotA = 0;\n                for (let r = 0; r < M; r++) dotA += A[offI + r] * A[offJ + r];\n                if (i === j) dotA += lambda;\n                matM[i * n + j] = dotA;\n            }\n        }\n        // 2. Cholesky 分解\n        for (let i = 0; i < n; i++) {\n            for (let j = 0; j <= i; j++) {\n                let sum = matM[i * n + j];\n                for (let k = 0; k < j; k++) sum -= L[i * n + k] * L[j * n + k];\n                if (i === j) {\n                    if (sum <= 0) return false; \n                    L[i * n + j] = Math.sqrt(sum);\n                } else {\n                    L[i * n + j] = sum / L[j * n + j];\n                }\n            }\n        }\n        // 3. 前向替换 (L * y = rhsM -> 结果存入 z)\n        for (let i = 0; i < n; i++) {\n            let sum = rhsM[i];\n            for (let k = 0; k < i; k++) sum -= L[i * n + k] * z[k];\n            z[i] = sum / L[i * n + i];\n        }\n        // 4. 后向替换 (L^T * x = z -> 结果存入 z)\n        for (let i = n - 1; i >= 0; i--) {\n            let sum = z[i];\n            for (let k = i + 1; k < n; k++) sum -= L[k * n + i] * z[k];\n            z[i] = sum / L[i * n + i];\n        }\n        // 5. 映射回原始大向量 s\n        s.fill(0); // 必须清零，因为s共享\n        for (let i = 0; i < n; i++) {\n            s[pIdx[i]] = z[i];\n        } return true;\n    }\n    _updateResidual(A, oldC, newS, n, pIdx) {\n        const { M, residual } = this;\n        for (let i = 0; i < n; i++) {\n            const idx = pIdx[i];\n            const delta = newS[idx] - oldC[idx];\n            if (Math.abs(delta) < 1e-14) continue;\n            const offset = idx * M;\n            for (let r = 0; r < M; r++) residual[r] -= A[offset + r] * delta;\n        }\n    }\n    _fullResidualUpdate(A, b, c, n, pIdx) {\n        const { M, residual } = this;\n        residual.set(b);\n        for (let i = 0; i < n; i++) {\n            const idx = pIdx[i];\n            if (c[idx] === 0) continue;\n            const offset = idx * M;\n            for (let r = 0; r < M; r++) residual[r] -= A[offset + r] * c[idx];\n        }\n    }\n    // 在调用 solve() 之后可以使用此函数获取当前残差的 L2 范数\n    calcError() {\n        let sum = 0;\n        for (let i = 0; i < this.M; i++) sum += this.residual[i] ** 2;\n        return Math.sqrt(sum);\n    }\n}\n"
  },
  {
    "path": "dataProcess/aboutANA.md",
    "content": "# JE数字谱自动对齐音频 Auto Note Alignment\n2025/12/27 文章已经整理到知乎: https://zhuanlan.zhihu.com/p/1988276192063800011\n\n下文为8/21刚完成算法时的整理：\n\n-----------------\n\n- 问题：给定音高序列和时频谱，求对应关系。音频为polyphonic，还可能为多音色，而音高序列为monophonic，比如只有人声或某种乐器的。最终得到赋予时值信息的音符。此任务类似自动排布视频字幕。\n- 输入：时频谱(而不是音频)、音高序列\n- 输出：音符在时频谱上的坐标\n- 定位：计算复杂度少于AMT(自动扒谱)，最好不使用神经网络。因为如果AMT更快，就没必要让用户给出音高序列了。好比有自动识别、添加字幕功能时，用户就没必要重新打一遍字幕了。\n\n## 难点\n- 音符之间可能需要插入“间隔”\n- 对于连续的同一音高的音符序列，如何断开\n\n## 最初建模：隐马尔可夫模型 HMM\n使用时频谱的时间轴，每一帧的隐状态即为音符，目标是最大化全局概率。假设第t帧频谱为 $\\vec{s}_t$ ，第t帧的隐状态记为 $v_t$ ，第i个音符（音高）为 $n_i$ ，间隔记为\"O\"。则有：\n$$\nv_t = \\begin{cases}\n    n_i \\rightarrow v_{t+1}=&\n    \\begin{cases}\n        n_i:&保持不变\\\\\n        O:&间隔\\\\\n        n_{i+1}:&下一个音符\n    \\end{cases}\\\\\n    \\\\\n    O \\rightarrow v_{t+1}=&\n    \\begin{cases}\n        O:&保持间隔\\\\\n        n_{i+1}:&下一个音符\n    \\end{cases}\\\\\n\\end{cases}\\tag{1}\n$$\n\nHMM有三个要素：初始状态分布，状态转移矩阵，激发概率。\n- 初始状态可以设置为\"O\"。\n- 按照传统HMM的建模方法，每个音高都对应各自的状态，比如noteDigger有84个半音，则有(84+1)个状态（考虑了\"O\"）。而用户给出的音符序列，相当于约束了状态转移矩阵。然而，由于每个音符的长度未定，同一个状态可能承载多种分支，使得状态转移矩阵无法构建：比如音符“123124”，第一条转移路径在t时到达第一个2，第二条转移路径在t时到达第二个2，那此时状态2的转移概率如何构建？显然此时两个分支的转移概率应该分开来算。因此，传统的HMM状态建模不可行。\n- 激发概率难以合理设置。由于频谱状态空间无限大，必须动态求解。而频谱反应的是分量的幅度，值域为 $[0,+\\infty)$，没有合理的、到 $[0, 1]$ 的映射。\n\n## 简化：DTW (失败)\nDTW 即 `Dynamic Time Warping`，常用于序列对齐。初见DTW是在MusicNet数据集中，DTW免去了人工的对齐，但也因此此数据集的精度不高。想到DTW是因为本任务就是两个序列的对齐：音高数组和（所有帧的）频谱（构成的）数组的对齐。\n\nDTW也是状态的转移，不过将每个元素视为一个状态。上述传统HMM状态建模仅仅编码了`音高`，导致了时序的混乱；DTW相当于将  `(音高，顺序)` 作为整体编码，因此音高序列有多长，就有多少个状态。这一点值得学习。\n\nDTW和HMM的Viterbi解码基本原理都是动态规划。如果将问题建模为使用上述状态编码的HMM，且状态转移概率均等，那就可以用DTW来解码路径。\n\n相比于HMM使用激发概率，DTW使用距离（其实概率也可以算一种距离）。距离的好处是直接加减、没有范围限制，很容易从幅度谱中映射，比如我选择了用“当前频谱当前音高的幅度的相反数”，因为幅度越大表明越有可能有该音高，而“距离越大越不相似”与之相反，所以加个负号。\n\n如何解决提到的难点？可以在每个音符之间插入一个\"O\"。那如果两个音符理应紧密相连怎么办？DTW中有一对多、多对一的情况，理论上不匹配的会被折叠，即\"O\"可以不出现。\n\n最困难的是\"O\"到各个频谱的距离。最终我选择了频谱均值，在统计了一些数据后设置为0.08的相反数，这大概能代表整个时频谱每个单元的能量均值。\n\n实现上为了减少空间复杂度，使用Hirschberg algorithm，虽然运算量*2，但节省了`帧数/2`倍的空间（帧数往往在4k以上）。\n\n然而效果并不好，仅有局部可以对齐。我认为是DTW的无记忆性和缺少约束导致的：\n1. 无记忆：特指求距离时仅依赖当前状态，缺少上一个状态。比如同为切换到\"O\"，从音符切换到\"O\"时的距离应该和“音符和频谱的距离”有关，因为是音符的结尾；而若上一个状态就是\"O\"，此时的距离应该和“下一个音符和频谱的距离”有关，因为要识别下一个音符的开头。\n2. 缺少约束：比如结果中出现了宽度为0的音符，这是被折叠了，而实际音符应该有长度约束。\n\n长度约束可以在DTW的路径回溯添加，具体为限制音符的回溯方向。而使用Hirschberg algorithm的DTW无法解决“无记忆”的问题，因为此算法不按顺序，根基就是“DTW的无记忆距离计算”。为此只能回到DTW最初的实现。而要增加的记忆的作用是可以利用上一帧的状态计算本帧本状态的距离，意味着距离和路径有关。这会导致什么呢？比如考虑下面的D格：\n\n| 累积距离 | 上一帧 | 当前帧 |\n| - | ----- | ------ |\n| 状态X | A: -1 | B: -2 |\n| 状态Y | C: -3 | D: ? |\n\n| 方向 | 距离增加 |\n| --- | -------- |\n| A→D | -5 |\n| B→D | -3 |\n| C→D | -1 |\n\n一通计算发现应该选A→D，更新D的距离为-6。但在DTW的路径回溯中，上一步选择的是距离最小值，因此D的上一步会选择C，而不是计算距离用的A。因此DTW整个框架是没法引入记忆的。\n\n## 融合HMM和DTW\nDTW被其路径回溯限制，那我们可以改成Viterbi算法的路径记录啊~于是回归HMM建模与Viterbi解码。\n\n状态设置同DTW，即首先给音符序列间插\"O\"，然后每个元素作为一个状态。\n\n此时可以设置状态转移概率了，即给式(1)中每一行设置一个概率，具体为多少可以根据实验调参。马尔可夫链基于概率，是累乘的，但只要取对数就变成了DTW的累加。问题是如何得到合理的激发概率。\n\n映射的难点在于无界到有界，而对于实际的样本其实最大值就是上界。所以我使用样本的最值作为边界、线性缩放至 $[0, 1]$。当然样本的最值取的不是所有时频单元的最值，而是时频谱中音高序列中出现的音高能取到的最值。但这样的概率合理吗？\n\n我统计了一下每帧能量的分布，近似为卡方分布。每一个时频单元的能量分布应该也近似（没统计）。这意味着能量大的单元少，而中间或者低能单元的数目多。所以简单的线性缩放会导致大量单元的概率仅在0.5以下，所以我选择了再开根号。假设给出时频谱 $s_{t,f}\\in R^{T \\times F}$ 和音高序列 $\\vec{n} \\in Z^N$（为了下标方便，不考虑间插的\"O\"；在$n_i$和$n_{i+1}$之间的间隔记为$O_i$），可以这样得到 $n_i \\in Z$ 激发出 $\\vec{s}_t \\in R^F$ 的概率：\n$$\nAmp = \\max_{t,i} s_{t,n_i}, \\\\\namp = \\min_{t,i} s_{t,n_i}, \\\\\n\nt \\in 1,2,3,...,T\\\\\ni \\in 1,2,3,...,N \\\\\np(\\vec{s}_t | n_i) = (\\frac{s_{t,n_i}-amp}{Amp - amp})^{0.5}\n$$\n\n假设$t$时刻的状态为$u_t$，定义 $p_{keepO}$ 为当前为“O”时保持为“O”的概率，$p_{keepN}$ 为当前为音符时保持音符的概率，则从 $t$ 到 $t+1$ 的转移概率如下。注意，虽然这里称之为“转移概率”，但下式其实对应于HMM的“激发概率”×“转移概率”，将两步结合起来了：\n$$\n\\begin{aligned}\np(u_{t+1}=n_{i+1} | u_t=O_i) &= p(\\vec{s}_t | n_{i+1}) \\cdot (1 - p_{keepO})\\\\\np(u_{t+1}=O_i | u_t=O_i) &= 1 - p(\\vec{s}_t | n_{i+1}) \\cdot p_{keepO}\\\\\np(u_{t+1}=O_i | u_t=n_i) &= (1 - p(\\vec{s}_t | n_i)) \\cdot (1 - p_{keepN})\\\\\np(u_{t+1}=n_{i} | u_t=n_i) &= p(\\vec{s}_t | n_i) \\cdot p_{keepN}\\\\\np(u_{t+1}=n_{i+1} | u_t=n_i) &= (1 - p(\\vec{s}_t | n_i)) \\cdot p(\\vec{s}_t | n_{i+1}) \\cdot p_{NN}\\\\\n &:= p(u_{t+1}=O_i | u_t=n_i) \\cdot p(u_{t+1}=n_{i+1} | u_{t+1}=O_i)\n\\end{aligned}\n$$\n\n注意最后一行，转移判定是“不是$n_i$且是$n_{i+1}$”，所以是两个相乘，进而发现其实是转移两次的结果，实际实现中，对每一轮动规，先进行沿着时间的转移，再保持时间不变，进行沿着状态的转移，且仅对“O”状态开展后一轮转移。拆解为两次转移可以避免跨状态转移，保持了每次转移的一阶马尔科夫性。\n\n实际应用中的状态转移和式(1)有不同。首先添加长度约束。需要记录当前音符状态（不考虑\"O\"的长度约束）已经保持了多长，小于最小长度时设置为99%的概率继续延续。\n\n其次是转移方式。先做如下约定：\n- 从左到右——时频谱从开始到结尾\n- 从上到下——音符序列从开始到结尾\n- 起点：左上角；终点：右下角\n\n输入的音符序列已经间插了\"O\"了，如果当前是音符，直接跳到下一个音符需要跨一行更新，不优雅；遇到边界还需要重新调整转移概率，麻烦。而从 $p(v_{t+1}=n_{i+1} | v_t=n_i)$ 的表达式可以看出，到音符的转移可以建立在到\"O\"的基础上。于是有了以下设计：\n1. 只允许向右和右下转移，转移概率和为1。这保证了音符不会被折叠。\n2. 同一列中，允许\"O\"向下转变，可以设置一个转变概率。这保证了\"O\"可以被折叠\n3. 最终取最大值，并记录上一步。\n\n“转变”其实不是很严谨，等效到状态转移相当于总概率超过1了。\n\n最终效果优于DTW，人肉调参许久得到了如今使用的参数。"
  },
  {
    "path": "dataProcess/analyser.js",
    "content": "class FreqTable extends Float32Array {\n    constructor(A4 = 440) {\n        super(84);  // 范围是C1-B7\n        this.A4 = A4;\n    }\n    set A4(A4) {    // 负数强制更新\n        if (A4 == this.A4) return;\n        if (A4 < 0) A4 = -A4;\n        let Note4 = [\n            A4 * 0.5946035575013605, A4 * 0.6299605249474366,\n            A4 * 0.6674199270850172, A4 * 0.7071067811865475,\n            A4 * 0.7491535384383408,\n            A4 * 0.7937005259840998, A4 * 0.8408964152537146,\n            A4 * 0.8908987181403393, A4 * 0.9438743126816935,\n            A4, A4 * 1.0594630943592953,\n            A4 * 1.122462048309373\n        ];\n        this.set(Note4.map(v => v / 8), 0);\n        this.set(Note4.map(v => v / 4), 12);\n        this.set(Note4.map(v => v / 2), 24);\n        this.set(Note4, 36);\n        this.set(Note4.map(v => v * 2), 48);\n        this.set(Note4.map(v => v * 4), 60);\n        this.set(Note4.map(v => v * 8), 72);\n    }\n    get A4() { return this[45]; }\n}\n\nclass NoteAnalyser {    // 负责解析频谱数据\n    /**\n     * @param {number} df FFT的频率分辨率\n     * @param {FreqTable || Number} freq 频率表(将被引用)或中央A的频率\n     */\n    constructor(df, freq) {\n        this.df = df;\n        if (typeof freq === 'number') {\n            this.freqTable = new FreqTable(freq);\n        } else {\n            this.freqTable = freq;\n        } this.updateRange();\n    }\n    set A4(freq) {\n        this.freqTable.A4 = freq;\n        this.updateRange();\n    }\n    get A4() {\n        return this.freqTable.A4;\n    }\n    /**\n     * 创建从线性谱到CQ谱的加权矩阵\n     * @param {number} semiR 每个半音收集的频率范围 单位:半音 取0.5时半音间无重合\n     * @param {number} leakR 频谱泄露半径 单位:每FFT精度\n     * @param {number} oversample 过采样率 用于模拟泄露\n     */\n    updateRange(semiR = 0.667, leakR = 1, oversample = 32) {\n        const win = this.win = Array(this.freqTable.length);\n        const offset = this.offset = new Uint16Array(this.freqTable.length);\n\n        // 用余弦模拟FFT的频率泄漏(FFT使用hanning窗)\n        const H_fft = new Float32Array((oversample << 1) | 1);\n        // 跳过两端的0\n        for (let i = 0, j = H_fft.length - 1, w = Math.PI / (oversample + 1); i < oversample; i++, j--) {\n            H_fft[i] = H_fft[j] = (1 - Math.cos((i + 1) * w)) * 0.5;\n        } H_fft[oversample] = 1;\n        const over_df = this.df * leakR / (oversample + 1);\n\n        // 用对数谱的余弦收集能量 新坐标u=B*log2(x/center) B=12\n        // du/dx = B/log(2)/x 每Hz对应的半音数 代表占据能量的宽度\n        const omega = Math.PI / semiR;\n        function pitchCospuls(x, center) {\n            if (x <= 0) return 0;\n            let wrapedf = 12 * Math.log2(x / center);   // 半音距离\n            if (Math.abs(wrapedf) >= semiR) return 0;\n            // 余弦窗*du/dx 余弦周期为2表示相邻半音 常数项不管 会归一化\n            return (Math.cos(wrapedf * omega) + 1) / x;\n        }\n\n        const tuning = 2 ** (semiR / 12);   // 半音范围对应的频率倍数\n        const leak_f = over_df * oversample;// 模拟泄露的频率范围\n        for (let i = 0; i < offset.length; i++) {\n            let fc = this.freqTable[i];\n            let start = fc / tuning;\n            let end = fc * tuning;\n            start = offset[i] = Math.ceil((start - leak_f) / this.df);\n            end = Math.floor((end + leak_f) / this.df) + 1;\n            const H = win[i] = new Float32Array(end - start);\n            for (let j = start, id = 0; j < end; j++, id++) {\n                // 对每个fft中心频点计算贡献: \\sum 泄露*窗值\n                for (let hid = 0, f = j * this.df - oversample * over_df; hid < H_fft.length; f += over_df, hid++)\n                    H[id] += pitchCospuls(f, fc) * H_fft[hid];\n            }\n            // 幅度一致性: 频率越高窗越大\n            for (let j = 0; j < H.length; j++) H[j] *= fc;\n        }\n    }\n    /**\n     * 从FFT提取音符的频谱 原理是区间内求和\n     * @param {Float32Array} real 实部\n     * @param {Float32Array} imag 虚部\n     * @param {Float32Array} buffer 可选的缓冲区 避免重复分配\n     * @returns {Float32Array} 音符的幅度谱\n     */\n    mel(real, imag, buffer = null) {\n        const noteAm = buffer ?? new Float32Array(84);\n        for (let i = 0; i < this.freqTable.length; i++) {\n            const H = this.win[i];\n            const offset = this.offset[i];\n            for (let j = 0; j < H.length; j++) {\n                const eng = real[offset + j] * real[offset + j] + imag[offset + j] * imag[offset + j];\n                noteAm[i] += eng * H[j];\n            }\n        } return noteAm;\n    }\n    // 上面函数的平方和版本\n    mel2(eng, buffer = null) {\n        const noteAm = buffer ?? new Float32Array(84);\n        for (let i = 0; i < this.freqTable.length; i++) {\n            const H = this.win[i];\n            const offset = this.offset[i];\n            for (let j = 0; j < H.length; j++) {\n                noteAm[i] += eng[offset + j] * H[j];\n            }\n        } return noteAm;\n    }\n    /**\n     * 能量谱归一化 Welford计算std\n     * @param {Array<Float32Array>} engSpectrum 能量谱\n     */\n    static normalize(engSpectrum) {\n        let count = 0, mean = 0, M2 = 0;\n        for (const frame of engSpectrum) {\n            for (let i = 0; i < frame.length; i++) {\n                const x = frame[i];\n                count++;\n                const delta = x - mean;\n                mean += delta / count;\n                const delta2 = x - mean;\n                M2 += delta * delta2;\n            }\n        }\n        const invSigma = Math.sqrt(count / M2);\n        for (const frame of engSpectrum) {\n            for (let i = 0; i < frame.length; i++)\n                frame[i] = Math.sqrt(frame[i] * invSigma);\n        } return engSpectrum;\n    }\n    /**\n     * 调性分析，原理是音符能量求和\n     * @param {Array<Float32Array>} noteTable\n     * @returns {Array<String, Float32Array>} 调性和音符的能量\n     */\n    static Tonality(noteTable) {\n        let energy = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n        for (const atime of noteTable) {\n            energy[0] += atime[0] ** 2 + atime[12] ** 2 + atime[24] ** 2 + atime[36] ** 2 + atime[48] ** 2 + atime[60] ** 2 + atime[72] ** 2;\n            energy[1] += atime[1] ** 2 + atime[13] ** 2 + atime[25] ** 2 + atime[37] ** 2 + atime[49] ** 2 + atime[61] ** 2 + atime[73] ** 2;\n            energy[2] += atime[2] ** 2 + atime[14] ** 2 + atime[26] ** 2 + atime[38] ** 2 + atime[50] ** 2 + atime[62] ** 2 + atime[74] ** 2;\n            energy[3] += atime[3] ** 2 + atime[15] ** 2 + atime[27] ** 2 + atime[39] ** 2 + atime[51] ** 2 + atime[63] ** 2 + atime[75] ** 2;\n            energy[4] += atime[4] ** 2 + atime[16] ** 2 + atime[28] ** 2 + atime[40] ** 2 + atime[52] ** 2 + atime[64] ** 2 + atime[76] ** 2;\n            energy[5] += atime[5] ** 2 + atime[17] ** 2 + atime[29] ** 2 + atime[41] ** 2 + atime[53] ** 2 + atime[65] ** 2 + atime[77] ** 2;\n            energy[6] += atime[6] ** 2 + atime[18] ** 2 + atime[30] ** 2 + atime[42] ** 2 + atime[54] ** 2 + atime[66] ** 2 + atime[78] ** 2;\n            energy[7] += atime[7] ** 2 + atime[19] ** 2 + atime[31] ** 2 + atime[43] ** 2 + atime[55] ** 2 + atime[67] ** 2 + atime[79] ** 2;\n            energy[8] += atime[8] ** 2 + atime[20] ** 2 + atime[32] ** 2 + atime[44] ** 2 + atime[56] ** 2 + atime[68] ** 2 + atime[80] ** 2;\n            energy[9] += atime[9] ** 2 + atime[21] ** 2 + atime[33] ** 2 + atime[45] ** 2 + atime[57] ** 2 + atime[69] ** 2 + atime[81] ** 2;\n            energy[10] += atime[10] ** 2 + atime[22] ** 2 + atime[34] ** 2 + atime[46] ** 2 + atime[58] ** 2 + atime[70] ** 2 + atime[82] ** 2;\n            energy[11] += atime[11] ** 2 + atime[23] ** 2 + atime[35] ** 2 + atime[47] ** 2 + atime[59] ** 2 + atime[71] ** 2 + atime[83] ** 2;\n        }\n        // notes根据最大值归一化\n        let max = Math.max(...energy);\n        energy = energy.map((num) => num / max);\n        // 找到最大的前7个音符\n        const sortedIndices = energy.map((num, index) => index)\n            .sort((a, b) => energy[b] - energy[a])\n            .slice(0, 7);\n        sortedIndices.sort((a, b) => a - b);\n        // 判断调性\n        let tonality = sortedIndices.map((num) => {\n            return num.toString(16);\n        }).join('');\n        switch (tonality) {\n            case '024579b': tonality = 'C'; break;\n            case '013568a': tonality = 'C#'; break;\n            case '124679b': tonality = 'D'; break;\n            case '023578a': tonality = 'Eb'; break;\n            case '134689b': tonality = 'E'; break;\n            case '024579a': tonality = 'F'; break;\n            case '13568ab': tonality = 'Gb'; break;\n            case '024679b': tonality = 'G'; break;\n            case '013578a': tonality = 'Ab'; break;\n            case '124689b': tonality = 'A'; break;\n            case '023579a': tonality = 'Bb'; break;\n            case '13468ab': tonality = 'B'; break;\n            default: tonality = 'Unknown'; break;\n        } return [tonality, energy];\n    }\n    /**\n     * 标记大于阈值的音符\n     * @param {Array<Float32Array>} noteTable 时频图\n     * @param {number} threshold 阈值\n     * @param {number} from \n     * @param {number} to \n     * @returns {Array<Note>} {x1,x2,y,ch,selected}\n     */\n    static autoFill(noteTable, threshold, from = 0, to = 0) {\n        let notes = [];\n        let lastAt = new Uint16Array(noteTable[0].length).fill(65535);\n        let time = from;   // 迭代器指示\n        if (!to || to > noteTable.length) to = noteTable.length;\n        for (; time < to; time++) {\n            const t = noteTable[time];\n            for (let i = 0; i < lastAt.length; i++) {\n                let now = t[i] < threshold; // 现在不达标\n                if (lastAt[i] != 65535) {\n                    if (now) {\n                        notes.push({   // 上一次有但是这次没有\n                            y: i,\n                            x1: lastAt[i],\n                            x2: time,\n                            ch: -1, selected: false\n                        }); lastAt[i] = 65535;\n                    }\n                } else if (!now) lastAt[i] = time;  // 上次没有这次有\n            }\n        }\n        // 扫尾\n        for (let i = 0; i < lastAt.length; i++) {\n            if (lastAt[i] != 65535) notes.push({\n                y: i,\n                x1: lastAt[i],\n                x2: time,\n                ch: -1, selected: false\n            });\n        } return notes;\n    }\n}"
  },
  {
    "path": "dataProcess/bpmEst.js",
    "content": "///<reference path=\"fft_real.js\" />\n/**\n * @file bpmEst.js\n * @abstract BPM估计相关算法\n * @description 算法说明: https://zhuanlan.zhihu.com/p/1995849093491222501\n */\n\nclass SIGNAL {\n    /**\n     * 峰值检测\n     * @param {Float32Array} arr 输入数据\n     * @param {number} prominence 显著性阈值\n     * @returns {Array} 找到的峰值索引数组 从小到大\n     */\n    static findPeaks(arr, prominence = 0) {\n        const len = arr.length;\n        const outBuffer = [];\n        for (let i = 1; i < len - 1; i++) {\n            const current = arr[i];\n            if (current <= arr[i - 1] || current <= arr[i + 1]) continue;\n            // 查找左侧基准\n            let l = i - 1;\n            while (l > 0 && arr[l - 1] <= arr[l]) l--;\n            // 查找右侧基准\n            let r = i + 1;\n            while (r < len - 1 && arr[r + 1] <= arr[r]) r++;\n            // 计算显著性\n            const leftMin = arr[l];\n            const rightMin = arr[r];\n            const maxBase = leftMin > rightMin ? leftMin : rightMin;\n            if (current - maxBase >= prominence) outBuffer.push(i);\n        } return outBuffer;\n    }\n\n    /**\n     * 抛物线插值，返回相对于x2的偏移量\n     * @param {number} y1 \n     * @param {number} y2 极值点\n     * @param {number} y3 \n     * @returns {Array<number>} [峰值相对于x2的偏移量, 插值后的y值]\n     */\n    static parabolicInterpolation(y1, y2, y3) {\n        const a = y1 + y3 - 2 * y2;\n        const b = y1 - y3;\n        if (a === 0) return [0, y2];\n        const dx = b / (2 * a);\n        const y = y2 - b * dx * 0.25;\n        return [dx, y];\n    }\n\n    /**\n     * IIR滤波器实现（直接型II结构，支持任意阶数）\n     * @param {Float32Array} arr 输入信号\n     * @param {Array<number>} b 分子系数（b[0], b[1], ..., b[M]）\n     * @param {Array<number>} a 分母系数（a[0], a[1], ..., a[N]），a[0]通常为1，会自动归一化\n     * @param {boolean} inplace 是否就地滤波（修改输入数组）\n     * @param {boolean} reverse 是否反向滤波（用于filtfilt）\n     * @returns {Float32Array} 滤波后信号\n     * @example 二阶高通滤波器\n     * 差分方程：\n     *   y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] - a2*y[n-2]\n     * 对应传参：\n     *   b = [b0, b1, b2]\n     *   a = [1, a1, a2]\n     */\n    static filter(arr, b, a, inplace = false, reverse = false) {\n        const order = Math.max(b.length, a.length);\n        const result = inplace ? arr : (new Float32Array(arr.length));\n        const xHist = new Float32Array(order);\n        const yHist = new Float32Array(order);\n        let xPtr = 0, yPtr = 0;\n        const processSample = (n) => {\n            xHist[xPtr] = arr[n];\n            let y = 0;\n            for (let i = 0; i < b.length; i++)\n                y += b[i] * xHist[(xPtr - i + order) % order];\n            for (let i = 1; i < a.length; i++)\n                y -= a[i] * yHist[(yPtr - i + order) % order];\n            y /= a[0];\n            yHist[yPtr] = y;\n            result[n] = y;\n            // 不用取余 加速\n            if (++xPtr >= order) xPtr = 0;\n            if (++yPtr >= order) yPtr = 0;\n        }\n        if (reverse) {\n            for (let n = arr.length - 1; n >= 0; n--) processSample(n);\n        } else {\n            for (let n = 0; n < arr.length; n++) processSample(n);\n        } return result;\n    }\n\n    /**\n     * 自相关函数 点积，进行了幅度补偿和归一化\n     * 通常用于较长序列\n     * @param {Float32Array} arr 输入一维时序信号\n     * @param {number} points 偏移点数\n     * @param {Float32Array} result 可选的输出数组\n     * @returns {Float32Array} 有效长度为 points\n     */\n    static autoCorr(arr, points, result = undefined) {\n        const L = arr.length;\n        if (result === undefined || result.length < points) result = new Float32Array(points);\n        // 先计算直流量用于幅度补偿\n        let mean = 0;\n        for (let i = 0; i < L; i++) mean += arr[i] * arr[i];\n        mean = L / mean;\n        result[0] = 1;\n        // 计算各个tau的自相关值\n        for (let tau = 1; tau <= points; tau++) {\n            let ac = 0;\n            for (let n = L - tau - 1; n >= 0; n--)\n                ac += arr[n] * arr[n + tau];\n            result[tau] = ac * mean / (L - tau);\n        } return result;\n    }\n\n    /**\n     * 高效的分帧自相关\n     * @param {Float32Array} arr onset envelop\n     * @param {number} points 进行多少点的自相关\n     * @param {number} hopInWin 窗长内有几个hop\n     * @param {number} hop 每次移动多少\n     * @returns {Array<Float32Array>} 自相关帧数组\n     */\n    static autoCorrSeg(arr, points, hopInWin, hop = 1) {\n        const len = arr.length;\n        hopInWin = Math.max(1, hopInWin | 0);\n\n        const numFrames = Math.floor((len - points) / hop) - hopInWin + 1;\n        if (numFrames < 1) throw new Error(\"Input array too short\");\n\n        const frames = Array(numFrames);\n        for (let i = 0; i < numFrames; i++) {\n            frames[i] = new Float32Array(points);\n        }\n\n        // 预分配一个通用的 bins 数组，避免在 tau 循环中重复创建\n        const maxBinCount = Math.ceil(len / hop);\n        const bins = new Float32Array(maxBinCount);\n\n        for (let tau = 0; tau < points; tau++) {\n            // 预计算当前 tau 下的所有 bins\n            const currentBinCount = Math.floor((len - tau) / hop);\n            for (let b = 0, start = 0; b < currentBinCount; b++) {\n                let binSum = 0;\n                // 内部小循环计算一个 hop 长度的乘积和\n                for (let n = 0; n < hop; n++, start++) {\n                    binSum += arr[start] * arr[start + tau];\n                } bins[b] = binSum;\n            }\n\n            // 初始窗口的和 (第一个 frame)\n            let running = 0;\n            for (let f = 0; f < hopInWin; f++) {\n                running += bins[f];\n            } frames[0][tau] = running;\n\n            // 滑动更新后续 frame\n            for (let frameIdx = 1; frameIdx < numFrames; frameIdx++) {\n                running += bins[frameIdx + hopInWin - 1] - bins[frameIdx - 1];\n                frames[frameIdx][tau] = running;\n            }\n        }\n\n        // 归一化\n        for (let f = 0; f < numFrames; f++) {\n            const frame = frames[f];\n            const energy = frame[0];\n            if (energy < 1e-10) continue;\n            const invEnergy = 1 / energy;\n            frame[0] = 1;\n            for (let tau = 1; tau < points; tau++) {\n                frame[tau] *= invEnergy;\n            }\n        }\n\n        return frames;\n    }\n\n    /**\n     * 根据分析窗和hop长度生成配套的ISTFT合成窗\n     * @param {Float32Array} analysisWindow 分析阶段使用的窗\n     * @param {number} hop 跳跃长度\n     * @returns {Float32Array} 合成窗\n     */\n    static createSynthesisWindow(analysisWindow, hop) {\n        const n = analysisWindow.length;\n        const res = new Float32Array(n);\n        let h = 0;\n        for (let i = 0; i < n; i++) {\n            const val = analysisWindow[i];\n            res[h] += val * val;\n            if (++h === hop) h = 0;\n        }\n\n        // 将能量和转换为倒数 减少除法次数\n        for (let i = 0; i < hop; i++) {\n            const s = res[i];\n            res[i] = s > 1e-10 ? 1.0 / s : 0;\n        }\n\n        // 生成最终合成窗 必须从后往前遍历 (n-1 到 0)\n        h = (n - 1) % hop;\n        for (let i = n - 1; i >= 0; i--) {\n            res[i] = analysisWindow[i] * res[h];\n            if (--h < 0) h = hop - 1;\n        } return res;\n    }\n}\n\nclass Beat {\n    /**\n     * 根据采样率得到适合的FFT长度\n     * @param {number} fs onset的采样率\n     * @param {number} sec 音频长度（秒）\n     * @returns {number} FFT的大小\n     */\n    static fs2FFTN(fs, sec = 50) {\n        let n = fs * sec;   // 用50秒的音频，分辨率大概有1.2BPM\n        return 1 << Math.round(Math.log2(n));\n    }\n\n    /**\n     * 压缩异常大的值 原位操作\n     * @param {Float32Array} onsetEnv\n     * @param {number} percent 分位数\n     * @param {number} margin_ratio 允许超出的最大比例 大于1\n     * @returns {Float32Array} onsetEnv 返回同一个引用\n     */\n    static compressOutliers(onsetEnv, percent = 0.99, margin_ratio = 1.3) {\n        // 理论上可以用堆排序只找后1%，但是sort底层是C++实现的，性能已经足够好了\n        const sorted = Array.from(onsetEnv).sort((a, b) => a - b);\n        const margin = sorted[(sorted.length * percent) | 0];   // floor会使得索引一定存在\n        const marginMax = margin * margin_ratio;\n        const actualMax = sorted[sorted.length - 1];\n        if (actualMax <= marginMax) return onsetEnv;\n        // 用三次函数压缩\n        const x0 = actualMax - margin;\n        const y0 = marginMax - margin;\n        const a = (x0 - 2 * y0) / (x0 * x0 * x0);\n        const b = (3 * y0 - 2 * x0) / (x0 * x0);\n        const trans = (x) => x * (a * x * x + b * x + 1);\n        for (let i = 0; i < onsetEnv.length; i++) {\n            if (onsetEnv[i] > margin) onsetEnv[i] = trans(onsetEnv[i] - margin) + margin;\n        } return onsetEnv;\n    }\n\n    /**\n     * 高通滤波去除趋势 原位操作\n     * @param {Float32Array} onsetEnv\n     * @returns {Float32Array} 去趋势后的onsetEnv 同一个引用\n     */\n    static detrend(onsetEnv) {\n        // 对于20Hz采样的频谱，用0.96对低频的压制较好 0.9低频压制太多 0.99低频压制太少\n        const b = [1, -1];\n        const a = [1, -0.96];\n        // filtfilt\n        SIGNAL.filter(onsetEnv, b, a, true, false);\n        SIGNAL.filter(onsetEnv, b, a, true, true);\n        return onsetEnv;\n    }\n\n    /**\n     * 除以标准差并保持非负 原位操作\n     * @param {Float32Array} onsetEnv \n     * @returns {Float32Array} onsetEnv 同一个引用\n     */\n    static onsetNorm(onsetEnv) {\n        let std = 0;\n        let minVal = Infinity;\n        let mean = 0;\n        for (const v of onsetEnv) {\n            mean += v;\n            std += v * v;\n            if (v < minVal) minVal = v;\n        }\n        mean /= onsetEnv.length;\n        std = Math.sqrt(std / onsetEnv.length - mean * mean);\n        for (let i = 0; i < onsetEnv.length; i++) {\n            onsetEnv[i] = (onsetEnv[i] - minVal) / std;\n        } return onsetEnv;\n    }\n\n    /**\n     * 对数谱差分法提取 onset envelope\n     * 会进行抑制峰值、去趋势、std归一化、非负化\n     * @param {Array<Float32Array>} spectrogram 幅度谱\n     * @param {number} a 平滑系数 0~1 越大越不平滑\n     * @returns {Float32Array} onset envelope\n     */\n    static extractOnset(spectrogram, a = 0.8) {\n        const ra = 1 - a;\n        const onsetEnv = new Float32Array(spectrogram.length);\n        const prevFrame = new Float32Array(spectrogram[0].length);\n        prevFrame.fill(Math.log(1e-2)); // 防止一开始就有大变化\n        for (let i = 0; i < spectrogram.length; i++) {\n            const frame = spectrogram[i];\n            let diff = 0;\n            for (let j = 0; j < frame.length; j++) {\n                const logedValue = Math.log(frame[j] + 1e-6);\n                const delta = logedValue - prevFrame[j];\n                if (delta > 0) diff += delta;\n                // 滑动更鲁棒\n                prevFrame[j] = prevFrame[j] * ra + logedValue * a;\n            } onsetEnv[i] = diff;\n        }\n        // 抑制峰值\n        Beat.compressOutliers(onsetEnv, 0.99, 1.3);\n        // 去趋势\n        Beat.detrend(onsetEnv);\n        // 归一化并非负化\n        return Beat.onsetNorm(onsetEnv);\n    }\n\n    /**\n     * 浮点数最大公因数\n     * @param {Float32Array} idx 峰值序号数组\n     * @param {Uint8Array} N 可选的倍数数组\n     * @returns {number} 最大公因数\n     */\n    static floatGCD(idx, N) {\n        // 用最小间隔估计一个初始值 这里假设一次差分就能获取\n        let minInterval = idx[0];\n        for (let i = 1; i < idx.length; i++) {\n            let inter = idx[i] - idx[i - 1];\n            if (inter < minInterval) minInterval = inter;\n        }\n        // 计算各个idx对应的倍数 并动态修正 minInterval\n        if (N === undefined) N = new Uint8Array(idx.length);\n        for (let i = 0; i < idx.length; i++) {\n            const n = Math.round(idx[i] / minInterval);\n            N[i] = n;\n            // 修正 minInterval 因为距离越远误差越小\n            minInterval = (minInterval + idx[i] / n) * 0.5;\n        }\n        // MSE求最佳 minInterval\n        let a = 0, b = 0;\n        for (let i = 0; i < idx.length; i++) {\n            a += N[i] * N[i];\n            b += N[i] * idx[i];\n        }\n        return b / a;\n    }\n\n    /**\n     * 对自相关结果进行BPM估计\n     * 从自相关结果中找到BPM峰值\n     * @param {Float32Array} corr 自相关结果\n     * @param {number} sr 采样率\n     * @param {number} BPMstd BPM的标准差 用于高斯加权\n     * @param {number} BPMu 期望的BPM值 用于高斯加权\n     * @returns {number} 估计的BPM值 如果无法估计则返回NaN\n     */\n    static corrBPM(corr, sr, BPMstd = 1, BPMu = 110) {\n        if (corr.length < 3) throw new Error(\"Correlation array too short\");\n        const maxInterval = Math.ceil(60 * sr / 35) + 1; // 35 BPM对应的最大间隔 更低的不管\n        if (corr.length > maxInterval) corr = corr.subarray(0, maxInterval);\n        // 峰值插值\n        let peakIdx = SIGNAL.findPeaks(corr, 0.02);\n        if (peakIdx.length === 0) return NaN;   // 置信度太小了，无法估计\n        const peak = new Float32Array(peakIdx.length);\n        for (let i = 0; i < peakIdx.length; i++) {\n            const idx = peakIdx[i];\n            const [dx, y] = SIGNAL.parabolicInterpolation(\n                corr[idx - 1],\n                corr[idx],\n                corr[idx + 1]\n            );\n            peakIdx[i] = idx + dx;\n            peak[i] = y;\n        }\n        // 得到候选BPM\n        const N = new Uint8Array(peakIdx.length);\n        const nBPM = 60 * sr / Beat.floatGCD(peakIdx, N); // 一定是整数倍\n        // 选择最显著的BPM 用高斯权重\n        let bestBPM = nBPM, maxVal = -1;\n        BPMu = Math.log2(BPMu);\n        for (let i = 0; i < peakIdx.length; i++) {\n            const bpm = nBPM / N[i];  // 候选BPM\n            const k = (Math.log2(bpm) - BPMu) / BPMstd;\n            const q = peak[i] * Math.exp(-0.5 * k * k);\n            if (q > maxVal) {\n                maxVal = q;\n                bestBPM = bpm;\n            }\n        } return bestBPM;\n    }\n\n    /**\n     * 估计每帧的BPM值\n     * @param {Float32Array} onsetEnv extractOnset的结果\n     * @param {number} onset_sr 采样率\n     * @param {number} minBPM 允许的最小BPM值 用于得到autoCorrSeg的points参数\n     * @param {number} winSec 窗口长度（秒）实际使用时会向上调整为hop的整数倍\n     * @param {number} hopSec hop长度（秒）\n     * @param {number} centerBPM corrBPM的BPMu参数\n     * @param {number} BPMstd corrBPM的BPMstd参数\n     * @returns {Float32Array} 每帧的BPM估计值\n     */\n    static tempo(onsetEnv, onset_sr, minBPM, winSec, hopSec = 1, centerBPM = 110, BPMstd = 0.5) {\n        // 确保winLen是hop的整数倍\n        const hop = Math.max(1, Math.round(onset_sr * hopSec));\n        const hopInWin = Math.ceil(winSec / hopSec);\n        const winLen = hopInWin * hop;\n\n        const maxInterval = Math.ceil(onset_sr * 60 / minBPM) + 1;\n        const corrFrames = SIGNAL.autoCorrSeg(onsetEnv, maxInterval, hopInWin, hop);\n\n        let f = winLen >> 1;\n        const BPMt = new Float32Array(onsetEnv.length);\n        let validBPM = centerBPM;   // 如果都是NaN只能相信给的值\n        let NanIdx = [];\n        for (let i = 0; i < corrFrames.length; f += hop, i++) {\n            const bpm = Beat.corrBPM(corrFrames[i], onset_sr, BPMstd, centerBPM);\n            if (isNaN(bpm)) {\n                NanIdx.push(f);\n                continue;\n            }\n            validBPM = BPMt[f] = bpm;\n            centerBPM = centerBPM * 0.8 + BPMt[f] * 0.2;    // 动态更新中心BPM\n        }\n        // 处理可能的NaN\n        for (let a = NanIdx.length - 1; a >= 0; a--)\n            BPMt[NanIdx[a]] = BPMt[NanIdx[a + 1]] || validBPM;\n        const endAt = f;\n        // 其余位置证据不足，直接复制邻近值\n        for (f += 1 - hop; f < onsetEnv.length; f++) BPMt[f] = BPMt[f - 1];\n        for (f = winLen >> 1; f > 0; f--) BPMt[f - 1] = BPMt[f];\n        // 中间用线性插值\n        if (hop === 1) return BPMt;\n        f = winLen >> 1;\n        let lastVal = BPMt[f];\n        let nextIdx = f + hop;\n        while (nextIdx < endAt) {\n            const nextVal = BPMt[nextIdx];\n            const step = (nextVal - lastVal) / hop;\n            for (let i = 1; i < hop; i++) BPMt[f + i] = lastVal + step * i;\n            f = nextIdx;\n            lastVal = nextVal;\n            nextIdx += hop;\n        } return BPMt;\n    }\n\n    /**\n     * Ellis节拍追踪算法实现\n     * @param {Float32Array} onsetEnv extractOnset的结果\n     * @param {number} onset_sr 采样率\n     * @param {number} tightness 动态规划的超参数 越大表示越尊重给出的节奏估计\n     * @param {number|Float32Array} bpm 单值:负数表示偏好,正值表示估计; Float32Array:每帧BPM估计\n     * @param {Array|null} rangeBPM [MinBPM, MaxBPM] 搜索范围 传入null表示范围无限制\n     * 以下参数仅在bpm为负数时有效\n     * @param {number} winSec 进行自相关的窗口长度（秒）\n     * @param {number} hopSec 自相关的hop长度（秒）\n     * @returns {Array} 识别到的节拍索引数组\n     */\n    static EllisBeatTrack(onsetEnv, onset_sr, tightness = 100, bpm = -110, rangeBPM = [40, 200], winSec = 16, hopSec = 1) {\n        const sr60 = onset_sr * 60;\n        const frameRange = (rangeBPM === null) ? [1, Infinity] : [sr60 / rangeBPM[1], sr60 / rangeBPM[0]];\n        if (typeof bpm === \"number\") {\n            if (bpm > 0) return Beat.beatTrackDp(\n                // 平滑以鲁棒\n                Beat.beatLocalScore(onsetEnv, bpm),\n                sr60 / bpm,\n                frameRange,\n                tightness\n            );\n            // bpm < 0 偏好模式\n            const BPMt = Beat.tempo(onsetEnv, onset_sr, rangeBPM[0], winSec, hopSec, -bpm);\n            for (let i = 0; i < BPMt.length; i++) BPMt[i] = sr60 / BPMt[i]; // 转换为 帧/拍\n            return Beat.beatTrackDp(\n                Beat.beatLocalScore(onsetEnv, BPMt),\n                BPMt,\n                frameRange,\n                tightness\n            );\n        }\n        if (bpm.length !== onsetEnv.length) throw new Error(\"bpm length must match onsetEnv length\");\n        const fpb = new Float32Array(bpm.length);\n        for (let i = 0; i < bpm.length; i++) fpb[i] = sr60 / bpm[i];\n        return Beat.beatTrackDp(\n            Beat.beatLocalScore(onsetEnv, fpb),\n            fpb,\n            frameRange,\n            tightness\n        );\n    }\n\n    /**\n     * 对onset进行平滑，得到局部节拍得分\n     * 直接抄袭的librosa的实现\n     * @param {Float32Array} onsetEnvelope\n     * @param {number|number[]|Float32Array} framesPerBeat 每拍帧数，可以是单值或与onsetEnvelope等长的数组\n     * @returns {Float32Array} 平滑后的局部节拍得分\n     */\n    static beatLocalScore(onsetEnvelope, framesPerBeat) {\n        const N = onsetEnvelope.length;\n        const localscore = new Float32Array(N);\n        if (typeof framesPerBeat === \"number\") framesPerBeat = [framesPerBeat];\n\n        let window = null;\n        const getWindow = (fpb) => {\n            const halfK = fpb | 0;\n            const K = (halfK << 1) | 1;\n            if (window === null || window.length < K)\n                window = new Float32Array(K);\n            const scale = 24 / fpb; // 越大意味着越窄\n            // librosa没有对窗进行归一化 会导致对低节拍的偏好\n            let sum = 0;\n            for (let i = 0, j = -halfK; i < K; ++i, ++j) {\n                const x = j * scale;\n                sum += window[i] = Math.exp(-0.5 * x * x);\n            }\n            for (let i = 0; i < K; i++) window[i] /= sum;\n            return { K, halfK };\n        };\n\n        if (framesPerBeat.length === 1) {\n            // --- 静态节奏模式 ---\n            const { K, halfK } = getWindow(framesPerBeat[0]);\n            for (let i = 0; i < N; i++) {\n                let sum = 0;\n                const kMax = Math.min(i + halfK, K);\n                for (let k = Math.max(0, i + halfK - N + 1); k < kMax; k++) {\n                    sum += window[k] * onsetEnvelope[i + halfK - k];\n                } localscore[i] = sum;\n            }\n        } else if (framesPerBeat.length === N) {\n            // --- 动态节奏模式 ---\n            let lastFpb = -1;\n            let K, halfK;\n            for (let i = 0; i < N; i++) {\n                const currentFpb = Math.round(framesPerBeat[i]);\n                // 只有当 fpb 变化时才更新窗口\n                if (currentFpb !== lastFpb) {\n                    const res = getWindow(currentFpb);\n                    K = res.K;\n                    halfK = res.halfK;\n                    lastFpb = currentFpb;\n                }\n                let sum = 0;\n                const kMax = Math.min(i + halfK, K);\n                for (let k = Math.max(0, i + halfK - N + 1); k < kMax; k++) {\n                    sum += window[k] * onsetEnvelope[i + halfK - k];\n                } localscore[i] = sum;\n            }\n        } else throw new Error('framesPerBeat 长度必须为 1 或与 onsetEnvelope 等长');\n        return localscore;\n    }\n\n    /**\n     * 节拍追踪动态规划核心逻辑 (Ellis 算法)\n     * @param {Float32Array} localscore 平滑后的起始强度 (beatLocalScore 的输出)\n     * @param {Float32Array|number[]|number} framesPerBeat 每拍帧数 (1个或N个) 可以为浮点\n     * @param {number[]} frameRange 帧范围 [minFrame, maxFrame] 都包含\n     * @param {number} tightness 转移代价权重\n     * @returns {Array} 识别到的节拍索引数组\n     */\n    static beatTrackDp(localscore, framesPerBeat, frameRange = [1, Infinity], tightness = 110) {\n        if (typeof framesPerBeat === \"number\") framesPerBeat = [framesPerBeat];\n        const isDynamicTempo = framesPerBeat.length > 1;\n        const minFrame = Math.max(1, frameRange[0]) | 0;\n        const maxFrame = Math.max(minFrame + 1, Math.ceil(frameRange[1]));\n\n        const N = localscore.length;\n        const dp = new Float32Array(N);\n        const backlink = new Int32Array(N);\n\n        // 计算第一个节拍必须超过的阈值\n        let scoreThresh = 0;\n        for (let i = 0; i < N; i++) {\n            if (localscore[i] > scoreThresh) scoreThresh = localscore[i];\n        } scoreThresh *= 0.01;\n\n        let firstBeat = true;\n\n        // 预计算 Log 表以提升性能 范围最大为 frameRange\n        const r = Math.min(maxFrame - minFrame, N) + 1;\n        const logTable = new Float32Array(r);\n        for (let j = 0; j < r; j++) logTable[j] = Math.log(j + minFrame);\n\n        for (let t = 0; t < N; t++) {\n            // 获取当前的期望每拍帧数 (fpb)\n            const fpb = isDynamicTempo ? framesPerBeat[t] : framesPerBeat[0];\n            const targetInter = Math.log(fpb);\n\n            // librosa的搜索区间：[i - 2*fpb, i - fpb/2]\n            // 同时还受限于 frameRange\n            const searchStart = t - Math.round(Math.max(minFrame, fpb * .5));\n            let searchEnd = t - Math.round(Math.min(maxFrame, fpb * 2));\n            if (searchEnd < 0) searchEnd = 0;\n\n            // 在搜索范围内寻找最优的前驱节点\n            let beatT = -1, maxS = -Infinity;\n            for (let tau = searchStart; tau >= searchEnd; tau--) {\n                const diff = logTable[t - tau - minFrame] - targetInter;\n                const s = dp[tau] - tightness * diff * diff;\n                if (s > maxS) {\n                    maxS = s;\n                    beatT = tau;\n                }\n            }\n\n            // 累加得分到 dp 数组\n            const scoreI = localscore[t];\n            dp[t] = (beatT >= 0) ? (scoreI + maxS) : scoreI;\n            // if (isNaN(dp[t])) console.warn(`NaN detected at dp[${t}]`);\n            // 起始点判定 在找到第一个超过阈值的有效起始点之前，不建立回溯链接\n            if (firstBeat && scoreI < scoreThresh) {\n                backlink[t] = -1;\n            } else {\n                backlink[t] = beatT;\n                firstBeat = false;\n            }\n        }\n        // 回溯\n        let tail = Beat.getLastBeat(dp);\n        const beatIndices = [];\n        while (tail >= 0) {\n            beatIndices.push(tail);\n            tail = backlink[tail];\n        }\n        return beatIndices.reverse();\n    }\n\n    /**\n     * 识别最后一次检测到的 beat 位置 (Ellis 算法)\n     * @param {Float32Array|Array} cumscore 累积得分数组\n     * @returns {number} 最后一次 beat 的索引\n     */\n    static getLastBeat(cumscore) {\n        const n = cumscore.length;\n        if (n === 0) return 0;\n\n        // 1. 提取局部极大值 (Peaks) 预分配内存\n        const preLen = (n >> 1) + 1;\n        const peaks = new Float32Array(preLen);\n        const peakIndices = new Int32Array(preLen);\n        let peakCount = 0;\n        for (let i = 1; i < n - 1; i++) {\n            const val = cumscore[i];\n            if (val > cumscore[i - 1] && val >= cumscore[i + 1]) {\n                peaks[peakCount] = val;\n                peakIndices[peakCount] = i;\n                peakCount++;\n            }\n        }\n        // 单独判断最后一个; librosa 不考虑第一个点\n        if (cumscore[n - 1] > cumscore[n - 2]) {\n            peaks[peakCount] = cumscore[n - 1];\n            peakIndices[peakCount] = n - 1;\n            peakCount++;\n        }\n        if (peakCount === 0) return n - 1;\n\n        // 2. 中位数计算函数\n        function getMedianOfPeaks(arr, len) {\n            const swap = (i, j) => {\n                const tmp = arr[i];\n                arr[i] = arr[j];\n                arr[j] = tmp;\n            };\n            function partition(left, right, pivotIdx) {\n                const pivotValue = arr[pivotIdx];\n                swap(pivotIdx, right);\n                let storeIdx = left;\n                for (let i = left; i < right; i++) {\n                    if (arr[i] < pivotValue) {\n                        swap(i, storeIdx);\n                        storeIdx++;\n                    }\n                }\n                swap(storeIdx, right);\n                return storeIdx;\n            }\n            function quickSelect(k) {\n                let left = 0;\n                let right = len - 1;\n                while (left <= right) {\n                    if (left === right) return arr[left];\n                    let pivotIdx = (left + right) >>> 1;\n                    pivotIdx = partition(left, right, pivotIdx);\n                    if (k === pivotIdx) return arr[k];\n                    if (k < pivotIdx) right = pivotIdx - 1;\n                    else left = pivotIdx + 1;\n                }\n            }\n            const mid = len >> 1;\n            if (len % 2 !== 0) {\n                return quickSelect(mid);\n            } else {\n                // 此时数组已被部分排序，第二次 quickSelect 极快\n                const v1 = quickSelect(mid);\n                const v2 = quickSelect(mid - 1);\n                return (v1 + v2) / 2;\n            }\n        }\n\n        const median = getMedianOfPeaks(peaks, peakCount);\n        const threshold = 0.5 * median;\n\n        // 3. 反向搜索确定最后一个超过阈值的峰值位置\n        for (let j = peakCount - 1; j >= 0; j--) {\n            const originalIdx = peakIndices[j];\n            if (cumscore[originalIdx] >= threshold) {\n                return originalIdx;\n            }\n        } return peakIndices[0];\n    }\n\n    /**\n     * Predominant local pulse estimation\n     * 理解为时变滤波\n     * @param {Float32Array} onsetEnv \n     * @param {number} onset_sr \n     * @param {number[]} rangeBPM [MinBPM, MaxBPM]\n     * @param {number} winLen STFT窗长\n     * @param {number} hopLen STFT hop\n     * @param {(number)=>(number)=>number} prior 传入时间点，返回一个函数f，f输入BPM，输出权重\n     * @returns {Float32Array} 滤波后的脉冲序列\n     */\n    static PLP(onsetEnv, onset_sr, rangeBPM = [40, 200], winLen, hopLen, prior) {\n        const fft = new realFFT(winLen, 'hanning');\n        if (typeof hopLen !== \"number\") hopLen = fft.N; // 一半的窗长\n        if (hopLen <= 0 || hopLen > fft.N << 1) throw new Error(\"Invalid hop length\");\n        const win = SIGNAL.createSynthesisWindow(fft.window, hopLen);\n\n        const n_bpm = fft.N / (onset_sr * 30);    // 每BPM对应的频率点数 fft.N只有一半故为30\n        const bpm_n = 1 / n_bpm;\n        const fMin = Math.min(fft.N, rangeBPM[0] * n_bpm);\n        const fMax = Math.max(0, rangeBPM[1] * n_bpm);\n        const validPrior = typeof prior === \"function\";\n\n        const pulse = new Float32Array(onsetEnv.length);    // 最终脉冲序列\n        for (let t = fft.N >> 1; t < onsetEnv.length; t += hopLen) {\n            let offset = t - fft.N;\n            const [real, imag] = fft.fft(onsetEnv, offset);\n            // 加窗\n            let i = 0;\n            for (; i < fMin; i++) real[i] = imag[i] = 0;\n            if (validPrior) {\n                const p = prior(t);\n                let maxMag = -1;\n                let maxAt = fMin;\n                for (let j = i; j < fMax; j++) {\n                    const scale = p(j * bpm_n);\n                    real[j] *= scale;\n                    imag[j] *= scale;\n                    const mag = Math.hypot(real[j], imag[j]);\n                    if (mag > maxMag) {\n                        maxMag = mag;\n                        maxAt = j;\n                    }\n                }\n                // 只保留关键频率\n                // for (; i < maxAt; i++) real[i] = imag[i] = 0;\n                // librosa 有归一化，但我认为不能有\n                // real[maxAt] /= maxMag;\n                // imag[maxAt] /= maxMag;\n                // for (i = maxAt + 1; i < fMax; i++) real[i] = imag[i] = 0;\n            }\n            for (i = fft.N - 1; i > fMax; i--) real[i] = imag[i] = 0;\n            // 还原\n            const time = fft.ifft(real, imag);\n            i = 0;\n            while (offset < 0) i++, offset++;\n            for (; i < fft.N && offset < onsetEnv.length; i++, offset++) {\n                pulse[offset] += time[i] * win[i];\n            }\n        }\n        // 仅保留正值 并归一化\n        let std = 0, mean = 0, min = Infinity;\n        for (let i = 0; i < pulse.length; i++) {\n            // const e = pulse[i] = Math.exp(pulse[i] - 1);\n            const e = pulse[i] = (pulse[i] > 0) ? pulse[i] : 0;\n            mean += e;\n            std += e * e;\n            if (e < min) min = e;\n        }\n        mean /= pulse.length;\n        std = Math.sqrt(std / pulse.length - mean * mean);\n        for (let i = 0; i < pulse.length; i++) pulse[i] = (pulse[i] - min) / std;\n        return pulse;\n    }\n\n    /**\n     * PLP的高斯先验函数生成器\n     * @param {Float32Array} BPMt 每帧BPM估计\n     * @param {number} std 标准差 0.2刚好在倍数处切掉 0.3适合没有任何先验时使用 搭配BPMt=[]\n     * @returns {(number)=>(number)=>number}\n     */\n    static PLPprior(BPMt = [], std = 0.2) {\n        const stdInv = 1 / std;\n        return (t) => {\n            const logbpm = Math.log2(BPMt[t] || 110);\n            return (bpm) => {\n                const k = (Math.log2(bpm) - logbpm) * stdInv;\n                return Math.exp(-0.5 * k * k);\n            }\n        };\n    }\n\n    /**\n     * 获取每个节拍位置的最大onset强度\n     * @param {Float32Array} onsetEnv\n     * @param {number[]} beatIndices 节拍位置索引\n     * @param {number} winLen 搜索范围\n     * @returns {Float32Array} beat的onset强度\n     */\n    static beatStrength(onsetEnv, beatIndices, winLen = 5) {\n        const halfWin = winLen >> 1;\n        const eng = new Float32Array(beatIndices.length);\n        for (let i = 0; i < beatIndices.length; i++) {\n            const idx = beatIndices[i];\n            let m = -1;\n            const end = Math.min(onsetEnv.length - 1, idx + halfWin);\n            for (let j = Math.max(0, idx - halfWin); j <= end; j++) {\n                if (onsetEnv[j] > m) m = onsetEnv[j];\n            } eng[i] = m;\n        } return eng;\n    }\n\n    /**\n     * 假设全局节奏型不变 根据节拍强度推断节奏型\n     * @param {Float32Array} beatStrength \n     * @param {number[]} patterns \n     * @returns {[0]:number, [1]:number} 节奏型(小节拍数), 第一个重拍的位置\n     */\n    static rhythmicPattern(beatStrength, patterns = [2, 3, 4]) {\n        const pateng = (size) => {\n            const eng = new Float32Array(size);\n            const cnt = new Uint16Array(size);\n            for (let i = 0; i <= beatStrength.length; i++) {\n                const k = i % size;\n                eng[k] += beatStrength[i];\n                cnt[k]++;\n            }\n            for (let i = 0; i < size; i++) {\n                if (cnt[i] === 0) throw new Error(\"No beats found for pattern analysis\");\n                eng[i] /= cnt[i];\n            } return eng;\n        }\n        let maxPattern = 4, maxDiff = -Infinity, maxAt = 0;\n        for (const p of patterns) {\n            const eng = pateng(p);\n            // 找到最大和最小值，最大值要记录位置\n            let maxVal = -Infinity, minVal = Infinity, maxIdx = 0;\n            for (let i = 0; i < p; i++) {\n                const v = eng[i];\n                if (v > maxVal) {\n                    maxVal = v;\n                    maxIdx = i;\n                }\n                if (v < minVal) minVal = v;\n            }\n            const diff = maxVal - minVal;\n            if (diff > maxDiff) {\n                maxDiff = diff;\n                maxPattern = p;\n                maxAt = maxIdx;\n            }\n        } return [maxPattern, maxAt];\n    }\n\n    /**\n     * 根据节拍强度和节拍位置，推断节奏型\n     * @param {Float32Array} beatStrength onset envelope at beat positions\n     * @param {number[]} meters 支持的小节拍数\n     * @returns {[0]:number[], [1]:number[]} 检测到的下拍索引数组，节奏型对应的小节拍数数组\n     */\n    static detectDownbeats(beatStrength, meters = [2, 3, 4]) {\n        const numBeats = beatStrength.length;\n        if (numBeats === 0) return [[], []];\n\n        Beat.onsetNorm(beatStrength);\n\n        let states = [];    // 状态=(节奏型, 相位)\n        meters.forEach(m => {\n            // m: 节奏型 p: 小节内相位(0为重拍) id: 状态唯一标识\n            for (let p = 0; p < m; p++) states.push({ m, p, id: `${m}-${p}` });\n        });\n\n        // dp 存储: s(加权重拍和), c(加权重拍数), su(加权弱拍和), cu(加权弱拍数), a(累积评分)\n        let dp = Array.from({ length: numBeats }, () => ({}));\n\n        // --- 动态参数 ---\n        const ALPHA = 0.97;             // 遗忘因子：越小局部性越强 理论最大值为 1 / (1-ALPHA)\n        const UPBEAT_W = 0.2;          // 弱拍抑制权重\n        const METER_CHANGE_PENALTY = 0.6; // 切换惩罚\n        const BIAS_44 = 0.02;            // 4/4 偏好\n        const HIST_W = 0.25;             // 历史分值权重\n\n        // 初始化第一拍\n        states.forEach(s => {\n            const isDB = (s.p === 0);\n            const str = beatStrength[0];\n            // 允许第一拍在任何相位开始\n            dp[0][s.id] = {\n                s: isDB ? str : 0,\n                c: isDB ? 1 : 0,\n                su: isDB ? 0 : str,\n                cu: isDB ? 0 : 1,\n                a: isDB ? str : -UPBEAT_W * str,\n                prev: null\n            };\n        });\n\n        // 动态规划\n        for (let i = 1; i < numBeats; i++) {\n            const str = beatStrength[i];\n            // 假设当前为curr模式\n            states.forEach(curr => {\n                let maxScore = -Infinity;\n                let bestPrevId = null;\n                let bestState = null;\n                // 遍历所有可能的前驱模式\n                states.forEach(prev => {\n                    const pInfo = dp[i - 1][prev.id];\n                    if (!pInfo) return;\n\n                    // 物理顺序约束\n                    let isSwitch = false;\n                    if (prev.m === curr.m) {\n                        // 节奏型相同，但相位不连续，不符合要求\n                        if (curr.p !== (prev.p + 1) % curr.m) return;\n                    } else {\n                        // 只有在旧小节末尾且新小节开头才允许切换\n                        if (prev.p === prev.m - 1 && curr.p === 0) isSwitch = true;\n                        else return;\n                    }\n                    // 带有遗忘因子的统计量更新\n                    const isDB = (curr.p === 0);\n                    const nextC = pInfo.c * ALPHA + (isDB ? 1 : 0);\n                    let nextSU = pInfo.su * ALPHA + (isDB ? 0 : str);\n                    const nextS = pInfo.s * ALPHA + (isDB ? str : 0);\n                    const nextCU = pInfo.cu * ALPHA + (isDB ? 0 : 1);\n                    // 计算当前局部均值对比度\n                    const avgDB = nextC > 0 ? nextS / nextC : 0;\n                    const avgUP = nextCU > 0 ? nextSU / nextCU : 0;\n                    let contrast = avgDB - (UPBEAT_W * avgUP);\n\n                    // 切换惩罚\n                    if (isSwitch) {\n                        contrast *= METER_CHANGE_PENALTY;\n                        // 仿射变换 降低对未来的相对影响\n                        nextSU = nextSU * 1.05 + 4;\n                    }\n                    // 4/4偏好\n                    if (curr.m === 4) contrast += BIAS_44;\n\n                    // 混合历史与当前\n                    const currentScore = pInfo.a * HIST_W + contrast * (1 - HIST_W);\n\n                    if (currentScore > maxScore) {\n                        maxScore = currentScore;\n                        bestPrevId = prev.id;\n                        bestState = {\n                            s: nextS,\n                            c: nextC,\n                            su: nextSU,\n                            cu: nextCU,\n                            a: currentScore\n                        };\n                    }\n                });\n                if (bestPrevId !== null)\n                    dp[i][curr.id] = { ...bestState, prev: bestPrevId };\n            });\n        }\n\n        // 回溯\n        let lastId = null;\n        let maxA = -Infinity;\n        states.forEach(s => {\n            if (dp[numBeats - 1][s.id] && dp[numBeats - 1][s.id].a > maxA) {\n                maxA = dp[numBeats - 1][s.id].a;\n                lastId = s.id;\n            }\n        });\n\n        const dbIdx = [], dbMeters = [];\n        for (let i = numBeats - 1; i >= 0; i--) {\n            if (!lastId) break;\n            const [m, p] = lastId.split('-').map(Number);\n            if (p === 0) { dbIdx.push(i); dbMeters.push(m); }\n            lastId = dp[i][lastId].prev;\n        }\n\n        return [dbIdx.reverse(), dbMeters.reverse()];\n    }\n}"
  },
  {
    "path": "dataProcess/fft_real.js",
    "content": "/**\n * 目前我写的最快的实数FFT。为音乐频谱分析设计\n */\nclass realFFT {\n    /**\n     * 位反转数组 最大支持2^16点\n     * @param {number} N 2的正整数幂\n     * @returns {Uint16Array} 位反转序列\n     */\n    static reverseBits(N) {\n        const reverseBits = new Uint16Array(N); // 实际N最大2^15\n        reverseBits[0] = 0;\n        // 计算位数\n        let bits = 15;\n        while ((1 << bits) > N) bits--;\n        // 由于是实数FFT，偶次为实部，奇次为虚部，故最终结果要乘2，所以不是16-bits\n        bits = 15 - bits;\n        for (let i = 1; i < N; i++) {\n            // 基于二分法的位翻转\n            let r = ((i & 0xaaaa) >> 1) | ((i & 0x5555) << 1);\n            r = ((r & 0xcccc) >> 2) | ((r & 0x3333) << 2);\n            r = ((r & 0xf0f0) >> 4) | ((r & 0x0f0f) << 4);\n            reverseBits[i] = ((r >> 8) | (r << 8)) >> bits;\n        } return reverseBits;\n    }\n    /**\n     * 复数乘法\n     * @param {number} a 第一个数的实部\n     * @param {number} b 第一个数的虚部\n     * @param {number} c 第二个数的实部\n     * @param {number} d 第二个数的虚部\n     * @returns {Array} [实部, 虚部]\n     */\n    static ComplexMul(a = 0, b = 0, c = 0, d = 0) {\n        return [a * c - b * d, a * d + b * c];\n    }\n    /**\n     * 计算复数的幅度\n     * @param {Float32Array} r 实部数组\n     * @param {Float32Array} i 虚部数组\n     * @returns {Float32Array} 幅度\n     */\n    static ComplexAbs(r, i, l) {\n        l = l || r.length;\n        const ABS = new Float32Array(l);\n        for (let j = 0; j < l; j++) {\n            ABS[j] = Math.sqrt(r[j] * r[j] + i[j] * i[j]);\n        } return ABS;\n    }\n\n    /**\n     * 初始化实数FFT 使用Hanning窗\n     * @param {number} N 要做几点的实数FFT\n     * @param {string} window 窗类型 'hanning' | 'none'\n     */\n    constructor(N, window = 'hanning') {\n        this.ini(N);\n        this.bufferr = new Float32Array(this.N);\n        this.bufferi = new Float32Array(this.N);\n        // 存放最终结果的数组\n        // FFT返回Xr和Xi IFFT返回X\n        this.X = new Float32Array(this.N << 1);\n        this.Xr = this.X.subarray(0, this.N);\n        this.Xi = this.X.subarray(this.N);\n        // 窗函数初始化\n        if (window === 'hanning') this.initWindow();\n        else this.window = new Float32Array(this.N << 1).fill(1);\n    }\n    /**\n     * 计算Hanning窗\n     * 并利用this.bufferr和this.bufferi对窗值进行重排\n     * 以加速FFT时的访问速度（随机访问->顺序访问）\n     */\n    initWindow() {\n        // this.N是实际长度的一半\n        const half_N = this.N;\n        const N = this.N << 1;\n        const pi2_N = Math.PI / half_N; // 2π/N = π/(N/2)\n        for (let n = 0; n < half_N; n++) {\n            // 利用对称性 由于最后会归一化，因此这里不用除以2\n            this.bufferr[n] = this.bufferi[half_N - n - 1] = 1 - Math.cos(pi2_N * n);\n        }\n        const window = new Float32Array(N);\n        for (let i = 0, ii = 1, j = 0; j < N; i += 2, ii += 2, j += 4) {\n            // 利用性质：reverseBits的偶数项都小于half_N（从bufferr中取值），奇数项都大于half_N（从bufferi中取值）\n            window[j] = this.bufferr[this.reverseBits[i]];\n            window[j+1] = this.bufferr[this.reverseBits[i] + 1];\n            window[j+2] = this.bufferi[this.reverseBits[ii] - half_N];\n            window[j+3] = this.bufferi[this.reverseBits[ii] - half_N + 1];\n        }\n        this.window = window;\n    }\n    /**\n     * 预计算常量\n     * @param {number} N 2的正整数次幂\n     */\n    ini(N) {\n        // 确定FFT长度\n        N = 1 << (Math.ceil(Math.log2(N)) - 1);\n        this.N = N;     // 存的是实际FFT的点数\n        // 位反转预计算 实际做N/2的FFT\n        this.reverseBits = realFFT.reverseBits(N);\n        // 旋转因子预计算 仍然需要N点的，但是只取前一半\n        const PIN = Math.PI / N;\n        this._Wr = new Float32Array(Array.from({ length: N }, (_, i) => Math.cos(PIN * i)));\n        this._Wi = new Float32Array(Array.from({ length: N }, (_, i) => -Math.sin(PIN * i)));\n    }\n    /**\n     * 计算除第一层外的FFT\n     * 要求第一层的结果存储于this.bufferr和this.bufferi\n     * 结果存储于this.bufferr和this.bufferi\n     */\n    _fftOther() {\n        for (let groupNum = this.N >> 2, groupMem = 2; groupNum; groupNum >>= 1) {\n            // groupNum: 组数；groupMem：一组里有几个蝶形结构，同时也是一个蝶形结构两个元素的序号差值\n            // groupNum: N/4,  N/8, ...,    1\n            // groupMem: 2,    4,   ...,    N/2\n            // W's base: 4,    8,   ...,    N\n            // W's base desired: 2N\n            // times to k: N/2, N/4 --> equals to 2*groupNum (W_base*k_times=W_base_desired)\n            // offset between groups: 4, 8, ..., N --> equals to 2*groupMem\n            const groupOffset = groupMem << 1;\n            for (let mem = 0, k = 0, dk = groupNum << 1; mem < groupMem; mem++, k += dk) {\n                const [Wr, Wi] = [this._Wr[k], this._Wi[k]];\n                for (let gn = mem; gn < this.N; gn += groupOffset) {\n                    const gn2 = gn + groupMem;\n                    const [gwr, gwi] = realFFT.ComplexMul(this.bufferr[gn2], this.bufferi[gn2], Wr, Wi);\n                    this.Xr[gn] = this.bufferr[gn] + gwr;\n                    this.Xi[gn] = this.bufferi[gn] + gwi;\n                    this.Xr[gn2] = this.bufferr[gn] - gwr;\n                    this.Xi[gn2] = this.bufferi[gn] - gwi;\n                }\n            }\n            [this.bufferr, this.bufferi, this.Xr, this.Xi] = [this.Xr, this.Xi, this.bufferr, this.bufferi];\n            groupMem = groupOffset;\n        }\n    }\n    /**\n     * 输入N点实数，输出N/2点复数FFT结果；X[0]的实部存放于Xi[0]\n     * @param {Float32Array} input 输入\n     * @param {number} offset 偏移量\n     * @returns [实部, 虚部]\n     */\n    fft(input, offset = 0) {\n        // 偶数次和奇数次组合并计算第一层 并加窗\n        for (let i = 0, ii = 1, j = 0, offseti = offset + 1; i < this.N; i += 2, ii += 2, j += 4) {\n            let xr1 = input[this.reverseBits[i] + offset] || 0;\n            let xi1 = input[this.reverseBits[i] + offseti] || 0;\n            let xr2 = input[this.reverseBits[ii] + offset] || 0;\n            let xi2 = input[this.reverseBits[ii] + offseti] || 0;\n            xr1 *= this.window[j];\n            xi1 *= this.window[j+1];\n            xr2 *= this.window[j+2];\n            xi2 *= this.window[j+3];\n            this.bufferr[i] = xr1 + xr2;\n            this.bufferi[i] = xi1 + xi2;\n            this.bufferr[ii] = xr1 - xr2;\n            this.bufferi[ii] = xi1 - xi2;\n        }\n        // 其他层\n        this._fftOther();\n        // 合并为实数FFT的结果\n        this.Xr[0] = this.bufferr[0] + this.bufferi[0];\n        this.Xi[0] = this.bufferr[0] - this.bufferi[0]; // 实际上是X[N/2]的实部\n        for (let k = 1, Nk = this.N - 1; Nk; k++, Nk--) {\n            const [Ir, Ii] = realFFT.ComplexMul(this.bufferi[k] + this.bufferi[Nk], this.bufferr[Nk] - this.bufferr[k], this._Wr[k], this._Wi[k]);\n            this.Xr[k] = (this.bufferr[k] + this.bufferr[Nk] + Ir) * 0.5;\n            this.Xi[k] = (this.bufferi[k] - this.bufferi[Nk] + Ii) * 0.5;\n        }\n        return [this.Xr, this.Xi];\n    }\n    /**\n     * 输入N/2点复数频域，输出N点实数时域\n     * @param {Float32Array} real 频域实部\n     * @param {Float32Array} imag 频域虚部 imag[0]存放X[N/2]的实部\n     * @returns {Float32Array} 时域实数\n     */\n    ifft(real, imag) {\n        const calci = (idx) => {\n            const xr = real[idx] || 0;\n            const xi = imag[idx] || 0;\n            const xrN = real[this.N - idx] || 0;\n            const xiN = imag[this.N - idx] || 0;\n            const [r, i] = realFFT.ComplexMul(xr - xrN, xi + xiN, this._Wi[idx], this._Wr[idx]);\n            // 先不乘0.5 到最后归一化再做\n            return [xr + xrN + r, xi - xiN + i];\n        }\n        // 拼接并计算第一层\n        {   // 单独计算第一组\n            const x1r = real[0] + imag[0];\n            const x1i = real[0] - imag[0];\n            // reverseBits为了适应FFT乘了2 这里要除回去\n            const [x2r, x2i] = calci(this.reverseBits[1] >> 1);\n            this.bufferr[0] = x1r + x2r;\n            this.bufferr[1] = x1r - x2r;\n            // IFFT需要取共轭\n            this.bufferi[0] = -(x1i + x2i);\n            this.bufferi[1] = x2i - x1i;\n        }\n        for (let i = 2, ii = 3; i < this.N; i+=2, ii+=2) {\n            const [x1r, x1i] = calci(this.reverseBits[i] >> 1);\n            const [x2r, x2i] = calci(this.reverseBits[ii] >> 1);\n            this.bufferr[i] = x1r + x2r;\n            this.bufferr[ii] = x1r - x2r;\n            this.bufferi[i] = -(x1i + x2i);\n            this.bufferi[ii] = x2i - x1i;\n        }\n        // 其他层\n        this._fftOther();\n        // 结果重排并归一化\n        const norm = 1 / (this.N << 1);     // 之前的0.5\n        for (let i = 0, j = 0; i < this.N; i++, j+=2) {\n            this.X[j] = this.bufferr[i] * norm;\n            this.X[j + 1] = -this.bufferi[i] * norm;    // 取共轭\n        }\n        return this.X;\n    }\n}"
  },
  {
    "path": "dataProcess/stftGPU.js",
    "content": "/**\n * Short-Time Real Fourier Transform using WebGPU\n */\nclass STFTGPU {\n    static reverseBits(N) {\n        const reverseBits = new Uint32Array(N);\n        const bits = Math.log2(N);\n        for (let i = 0; i < N; i++) {\n            let r = 0, n = i;\n            for (let j = 0; j < bits; j++) {\n                r = (r << 1) | (n & 1);\n                n >>= 1;\n            } reverseBits[i] = r;\n        } return reverseBits;\n    }\n    constructor(fftN = 8192, hopSize) {\n        this.fftN = 1 << Math.ceil(Math.log2(fftN));\n        this.realN = this.fftN >> 1;\n        this.hopSize = hopSize;\n    }\n    async initWebGPU(workgroup_size_pow = 8) {  // 最大为8\n        const adapter = await navigator.gpu.requestAdapter();\n        if (!adapter) throw new Error(\"WebGPU adapter not found.\");\n        const device = await adapter.requestDevice({\n            requiredLimits: {\n                maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,\n                maxBufferSize: adapter.limits.maxBufferSize,\n            }\n        });\n        if (!device) throw new Error(\"WebGPU device not found.\");\n        this.adapter = adapter; this.device = device;\n        this.workgroup_size_pow = workgroup_size_pow;\n        const workgroup_size = 1 << workgroup_size_pow;\n        this.maxSize = Math.min(adapter.limits.maxStorageBufferBindingSize, adapter.limits.maxBufferSize);\n        this.memUsed = 0;\n\n        const shaderModule = device.createShaderModule({\n            label: 'STFT Compute Shader',\n            code: /*wgsl*/`\nconst fftN: u32 = ${this.fftN}u;// 实数FFT长度\nconst M: u32 = ${this.realN}u;// 复数FFT长度\nconst PI: f32 = 3.14159265359;\nstruct Config {\n    audioLen: u32,\n    hop: u32,\n    numFrames: u32,\n    initialOffset_stage: i32,   // 第一阶段作为音频起始位置偏移 第二阶段作为stage\n};\n@group(0) @binding(0) var<storage, read_write> audio: array<f32>;// 音频输入\n@group(0) @binding(1) var<storage, read_write> complexData: array<vec2<f32>>;// 复数中间结果 [numFrames * M]\n@group(0) @binding(2) var<uniform> config: Config;\n@group(0) @binding(3) var<storage, read> bitReverseLUT: array<u32>;// 位反转查找表 [M]\n@group(0) @binding(4) var<storage, read_write> energyOutput: array<f32>;// 能量谱输出 [numFrames * M]\n\nfn hanning(n: u32) -> f32 {return 1 - cos(PI * f32(n) / f32(M));}\n\n// Pass1 预处理阶段：加窗并填充复数数组\n@compute @workgroup_size(${workgroup_size})\nfn preprocess(\n    // 对于8192点, dispatch(8192/(256*2), numFrames, 1)\n    @builtin(global_invocation_id) global_id: vec3<u32> // (x: n within frame, y: frame index)\n) {\n    let n = global_id.x; // range [0, 4095]\n    let frame = global_id.y;\n    let offset = i32(frame * config.hop) + config.initialOffset_stage;   // 本帧的音频起始位置\n    // 取音频数据，越界补零\n    let idx_even = offset + i32(n * 2);\n    let idx_odd = idx_even + 1;\n    let re = select(0.0, audio[u32(idx_even)], idx_even >= 0 && u32(idx_even) < config.audioLen);\n    let im = select(0.0, audio[u32(idx_odd)], idx_odd >= 0 && u32(idx_odd) < config.audioLen);\n    // 加窗并构成复数\n    let win_even = hanning(n << 1u);\n    let win_odd = hanning((n << 1u) + 1u);\n    complexData[frame * M + n] = vec2<f32>(re * win_even, im * win_odd);\n}\n\n// Pass2 FFT计算阶段 config.initialOffset_stage (即 stage) 应该从 LOG2_M - 1 (11) 循环递减到 0\n@compute @workgroup_size(${workgroup_size})\nfn fft_stage(\n    // dispatch(2048/256, numFrames, 1)\n    @builtin(global_invocation_id) global_id: vec3<u32>\n) {\n    let n = global_id.x; // range [0, 2047] 一个线程处理一个蝶形\n    let frame = global_id.y;\n    let stage = u32(config.initialOffset_stage);   // 作为stage使用\n\n    let step = 1u << stage; // 步长: 2048, 1024, ..., 1\n    let element_count = step << 1u;  // 当前块大小\n\n    let blockIdx = n / step; // n*2 / element_count\n    let offsetInBlock = n % step;\n\n    // 旋转因子 W 计算\n    let tIndex = offsetInBlock * (M >> (stage + 1u));\n    let angle = -2.0 * PI * f32(tIndex) / f32(M);\n    let w = vec2<f32>(cos(angle), sin(angle));\n\n    let index1 = frame * M + (blockIdx * element_count + offsetInBlock);\n    let index2 = index1 + step;\n    let u = complexData[index1];\n    let v = complexData[index2];\n\n    let sub = u - v;\n    let out2 = vec2<f32>(\n        sub.x * w.x - sub.y * w.y,\n        sub.x * w.y + sub.y * w.x\n    );\n    complexData[index1] = u + v;\n    complexData[index2] = out2;\n}\n\n// Pass3 位反转 RealFFT后处理 能量谱\n@compute @workgroup_size(${workgroup_size})\nfn postprocess(\n    // dispatch(4096/256, numFrames, 1)\n    @builtin(global_invocation_id) global_id: vec3<u32>\n) {\n    let k = global_id.x; // [0, M-1]\n    let frame = global_id.y;\n\n    // 1. 读取 Bit-Reversed 数据，恢复线性顺序的 Z[k]\n    let revK = bitReverseLUT[k];\n    let Z_k = complexData[frame * M + revK];\n\n    // 2. 获取对称点 Z[N/2 - k]\n    // 注意处理 k=0 的情况, (M-0)%M = 0\n    let k_sym = (M - k) % M;\n    let revK_sym = bitReverseLUT[k_sym];\n    let Z_sym = complexData[frame * M + revK_sym];\n\n    // 3. Unscramble 公式\n    let Z_sym_conj = vec2<f32>(Z_sym.x, -Z_sym.y);\n    let F_even = 0.5 * (Z_k + Z_sym_conj);\n    let F_odd  = 0.5 * (Z_k - Z_sym_conj);\n    let angle = -PI * f32(k) / f32(M);\n    let w = vec2<f32>(cos(angle), sin(angle));\n    let neg_j_F_odd = vec2<f32>(F_odd.y, -F_odd.x);// -j * Fodd\n    let rot_F_odd = vec2<f32>(// -j * Fodd * w\n        neg_j_F_odd.x * w.x - neg_j_F_odd.y * w.y,\n        neg_j_F_odd.x * w.y + neg_j_F_odd.y * w.x\n    );\n    let X_k = F_even + rot_F_odd;\n\n    // 4. 计算能量谱\n    let energy = X_k.x * X_k.x + X_k.y * X_k.y;\n\n    // 累加\n    let outIdx = frame * M + k;\n    energyOutput[outIdx] = energyOutput[outIdx] + energy;\n}`});\n        const bindGroupLayout = this.bindGroupLayout = device.createBindGroupLayout({\n            label: \"STFT Uniform Layout\",\n            entries: [\n                { binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: { type: \"storage\" } },\n                { binding: 1, visibility: GPUShaderStage.COMPUTE, buffer: { type: \"storage\" } },\n                { binding: 2, visibility: GPUShaderStage.COMPUTE, buffer: { type: \"uniform\" } },\n                { binding: 3, visibility: GPUShaderStage.COMPUTE, buffer: { type: \"read-only-storage\" } },\n                { binding: 4, visibility: GPUShaderStage.COMPUTE, buffer: { type: \"storage\" } },\n            ]\n        });\n        const pipelineLayout = device.createPipelineLayout({\n            bindGroupLayouts: [bindGroupLayout]\n        });\n\n        this.prePipeLine = device.createComputePipeline({\n            label: \"STFT Preprocess Pipeline\",\n            layout: pipelineLayout,\n            compute: { module: shaderModule, entryPoint: \"preprocess\" },\n        });\n        this.fftPipeLine = device.createComputePipeline({\n            label: \"STFT FFT Pipeline\",\n            layout: pipelineLayout,\n            compute: { module: shaderModule, entryPoint: \"fft_stage\" },\n        });\n        this.postPipeline = device.createComputePipeline({\n            label: \"STFT Postprocess Pipeline\",\n            layout: pipelineLayout,\n            compute: { module: shaderModule, entryPoint: \"postprocess\" },\n        });\n        // 位反转缓冲区\n        const bitReverseLUTBuffer = this.bitReverseLUTBuffer = device.createBuffer({\n            size: this.realN * Uint32Array.BYTES_PER_ELEMENT,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n            mappedAtCreation: true,\n        });\n        new Uint32Array(bitReverseLUTBuffer.getMappedRange()).set(STFTGPU.reverseBits(this.realN));\n        bitReverseLUTBuffer.unmap();\n        // 配置缓冲区\n        this.configBuffer ??= device.createBuffer({\n            size: 4 * Uint32Array.BYTES_PER_ELEMENT,\n            usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n        });\n        this.memUsed += bitReverseLUTBuffer.size + this.configBuffer.size;\n        if (this.memUsed > this.maxSize) throw new Error(\"STFTGPU: Exceeded maximum buffer size.\");\n    }\n    stft(audioBuffer) {\n        // 第一帧的左侧 一般为负数\n        const initialOffset = (this.hopSize >> 1) - this.realN;\n        const audioLen = audioBuffer.length;\n        const numFrames = 1 + (audioLen - 1 - (this.hopSize >> 1)) / this.hopSize | 0;\n        const bytes = numFrames * this.realN * Float32Array.BYTES_PER_ELEMENT;\n        // 输入\n        const audioBufferGPU = this.audioBufferGPU ??= this.device.createBuffer({\n            size: audioBuffer.byteLength,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n        });\n        // 中间变量\n        const complexDataBuffer = this.complexDataBuffer ??= this.device.createBuffer({\n            size: bytes << 1,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,\n        });\n        // 输出\n        const outputBuffer = this.outputBuffer ??= this.device.createBuffer({\n            size: bytes,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n        });\n        // 检查空间\n        this.memUsed += audioBufferGPU.size + complexDataBuffer.size + outputBuffer.size;\n        if (this.memUsed > this.maxSize) throw new Error(\"STFTGPU: Exceeded maximum buffer size.\");\n        // 写入数据\n        this.device.queue.writeBuffer(audioBufferGPU, 0, audioBuffer);\n        this.device.queue.writeBuffer(this.configBuffer, 0, new Int32Array([\n            audioLen, this.hopSize, numFrames, initialOffset\n        ]));\n        // 创建统一的BindGroup\n        const mainBindGroup = this.device.createBindGroup({\n            layout: this.bindGroupLayout,\n            entries: [\n                { binding: 0, resource: { buffer: audioBufferGPU } },\n                { binding: 1, resource: { buffer: complexDataBuffer } },\n                { binding: 2, resource: { buffer: this.configBuffer } },\n                { binding: 3, resource: { buffer: this.bitReverseLUTBuffer } },\n                { binding: 4, resource: { buffer: outputBuffer } },\n            ],\n        });\n\n        // === 预处理 ===\n        const commandEncoder = this.device.createCommandEncoder();\n        const passEncoder1 = commandEncoder.beginComputePass();\n        passEncoder1.setPipeline(this.prePipeLine);\n        passEncoder1.setBindGroup(0, mainBindGroup);\n        passEncoder1.dispatchWorkgroups(this.realN >> this.workgroup_size_pow, numFrames, 1);\n        passEncoder1.end();\n        this.device.queue.submit([commandEncoder.finish()]);\n        // === FFT计算 ===\n        const LOG2_M = Math.log2(this.realN);\n        for (let stage = LOG2_M - 1; stage >= 0; stage--) {\n            const commandEncoder = this.device.createCommandEncoder();\n            const passEncoder2 = commandEncoder.beginComputePass();\n            passEncoder2.setPipeline(this.fftPipeLine);\n            // 更新stage\n            this.device.queue.writeBuffer(this.configBuffer, 3 * Uint32Array.BYTES_PER_ELEMENT, new Int32Array([stage]));\n            passEncoder2.setBindGroup(0, mainBindGroup);\n            passEncoder2.dispatchWorkgroups(this.realN >> (this.workgroup_size_pow + 1), numFrames, 1);\n            passEncoder2.end();\n            this.device.queue.submit([commandEncoder.finish()]);\n        }\n        // === 后处理 ===\n        const commandEncoder3 = this.device.createCommandEncoder();\n        const passEncoder3 = commandEncoder3.beginComputePass();\n        passEncoder3.setPipeline(this.postPipeline);\n        passEncoder3.setBindGroup(0, mainBindGroup);\n        passEncoder3.dispatchWorkgroups(this.realN >> this.workgroup_size_pow, numFrames, 1);\n        passEncoder3.end();\n        this.device.queue.submit([commandEncoder3.finish()]);\n    }\n    readGPU(buffer = this.outputBuffer) {\n        const readBuffer = this.device.createBuffer({\n            size: buffer.size,\n            usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,\n        });\n        const commandEncoder = this.device.createCommandEncoder();\n        commandEncoder.copyBufferToBuffer(buffer, 0, readBuffer, 0, buffer.size);\n        this.device.queue.submit([commandEncoder.finish()]);\n        return readBuffer.mapAsync(GPUMapMode.READ).then(() => {\n            const arrayBuffer = new Float32Array(readBuffer.getMappedRange()).slice();\n            readBuffer.unmap();\n            readBuffer.destroy();\n            const result = Array(arrayBuffer.length / this.realN);\n            for (let i = 0, offset = 0; i < arrayBuffer.length; i += this.realN, offset++) {\n                result[offset] = arrayBuffer.slice(i, i + this.realN);\n            } return result;\n        });\n    }\n    free() {\n        this.audioBufferGPU?.destroy();this.audioBufferGPU = null;\n        this.complexDataBuffer?.destroy();this.complexDataBuffer = null;\n        this.outputBuffer?.destroy();this.outputBuffer = null;\n        this.bitReverseLUTBuffer?.destroy();this.bitReverseLUTBuffer = null;\n        this.configBuffer?.destroy();this.configBuffer = null;\n        this.prePipeLine = null;this.fftPipeLine = null;this.postPipeline = null;\n        this.device = null;this.adapter = null;\n        this.bindGroupLayout = null;\n    }\n}"
  },
  {
    "path": "docs/DEVELOPMENT.md",
    "content": "# 开发概述\n基本功能在`core/`文件夹中，包括：\n- 频谱分析与绘制\n- 音符播放与绘制\n- 音频播放与时间管理。音频是整个项目的同步时钟\n- 左侧键盘的绘制\n- 顶部的时间轴和小节轴\n- 文件输入输出\n\n## 时频分析\n用`Web Audio API`解码上传的音频，得到幅度数组。然后使用FFT，接着使用CQT，最后两种频谱进行融合。\n\n- FFT参数：采样率44100Hz，取8192点的实数FFT，使用Hanning窗，分析范围：C1-B7，但点数限制只能区分F#2以上的音符。\n- 从线性谱到对数谱使用频域窗，先模拟频谱泄露，然后在对数坐标中用Hanning窗。注意窗和（窗绝对值求和）应该正比于中心频率，这样不同频段才可比。\n- CQT参数：采样率44100Hz，每个半音对应一个滤波器，每个滤波器为BlackmanHarris窗作用的 $e^{2\\pi j\\omega t}$（指数没有负号，因为最终取能量，无所谓）。由于窗导致主瓣增加，因此滤波器长度至少为2倍原长才能有矩形窗的主瓣分辨率。取2.8。没有用任何技巧，直接时域滤波。\n- 归一化：在能量域进行二维的方差归一化。\n- 频谱融合：CQT小的地方使用几何平均（相乘再开根号），以实现压制；CQT大的地方使用均方根，以突出。几何平均<算数平均<军均方根。之所以需要FFT频谱参与，是因为CQT频谱过于琐碎，需要平滑。\n\n3个问题：\n1. 有的音乐中心频率不是正好440Hz，是否需要自适应？懒得做了，调音前后结果基本相同，徒增运算量。\n2. FFT低频分辨率不足。这个没办法，所以有了CQT。\n3. 最高到22050Hz，但是音符最高3950Hz，取到C8，即只需777点。后面的是否保留？暂时没考虑保留。\n\n## 可视化\n绘制由`requestAnimationFrame`驱动，采用“数据-渲染”的模式。另一种选择是事件驱动，但是很混乱，抛弃。\n\n### 视窗模型\n即无限画布的实现原理。首先规定每个格子的宽高像素数，即`.width`和`.height`。在此基础上，定义`.scrollX`和`scrollY`，表示视窗左侧和世界左侧、视窗下侧和世界下侧的像素数。注意这里的`scrollY`和画布的纵坐标是反的。\n\n### 数据结构\n一共有三个画布区域：左侧钢琴，顶部时间轴/小节轴，中心主工作区。左侧和顶部的绘制内容需要和主工作区的横向、纵向对齐。\n\n主工作区采用画布叠加实现多图层（属性`.layers`），为了拓展性，暴露了图层增删的API: `.layers.addLayer` `.layers.removeLayer`。每个图层为一个封装过的画布，有独立的`dirty`属性，表示是否要重绘该画布。每个画布的绘制采用带有优先级的**注册制**，优先级越小越先绘制，实现了每个画布的内部图层。\n\n由于频谱绘制频繁切换`fillStyle`，CPU占用较高，且内容基本不会变，因此单独作为一个背景图层，使用`dirty`标签作为重绘标记。`dirty`置位条件为:\n- 视窗位置更改\n- 频谱发生改变\n- 绘制参数改变(如倍率、谐波分析)\n\n其余部分绘制较为容易，因此集成到另一个画布，`dirth`置位条件为用户是否操作，因为这层主要绘制时间线、音符等强交互内容。\n\n## MIDI\n### 存储结构\n两个方案：所有轨都在一个数组中，和每轨一个数组，或者……两者结合\n- 所有轨都在一个数组：可以一次遍历实现音符拾取\n- 每轨一个数组：可以方便地实现单轨样式的应用，更改音轨顺序容易，绘制容易，但需要每个轨道单独遍历\n- 两者结合：维护较为麻烦\n需要实现的功能：\n- 撤销重做: 差不多，都是`JSON.stringfy`\n- 单音轨播放(静音、乐器)：一个数组简单，因为播放的时候只需要维护一次遍历\n- 多音轨拖拽：音符拾取是单音轨简单。拖拽影响的是selected数组（见后文），两者平局\n\n最终决定主存储使用一个数组（便于播放的状态维护）：\n```ts\ntype Note = {          // 单个音符\n    x1: number;        // onset位置\n    x2: number;        // offset位置\n    y: number;         // 音高\n    ch: number;        // 音轨\n    selected: boolean; // 是否选中\n    v: number;         // 音量\n};\n.midiAction.midi: Note[]\n```\n以`x1`为主序，升序排列。\n\n而另一种设计体现在了“音符绘制”上。\n\n### 绘制\n音轨越上，图层越上（此处图层指canvas内绘制顺序等效得到的图层）。然而，midi的数据结构非常扁平，不适合用于绘制。于是维护了一个`insight`数组，表示**当前视野中**各个通道的音符，数据结构如下：\n```js\n.midiAction.insight = [ // 音轨的Array\n    Note[], // 第一音轨的音符列表\n    ...\n]\n```\n`insight`的更新条件较为复杂，详见代码注释。\n\n### 交互\n关键鼠标操作如何改变状态。效果描述：\n\n鼠标按下：\n- 如果按在空白则新建音符，进入调整时长模式\n- 如果按在音符上：\n    ctrl是否按下？\n    - 按下：选择多个\n    - 没按下：是否已经选择了多个？\n        - 是：鼠标抬起的时候，如果之前有拖动则什么也不做，否则仅选中当前那个\n        - 否：仅选一个\n        判断点击位置：\n        - 前一半：后面的是拖动模式\n        - 后一半：后面的是调整时长模式\n        无论是那种模式，都支持音高上的调整\n\n如何添加音符？\n1. 点击的时候确认位置，已经添加进去了。\n2. 设置这个音符为选中，模式是调整时长。\n\n选中有两个方案：\n1. 设置一个选中列表，存选中的midi音符对象的地址\n有一个难点：绘制的时候如何让选中的不绘制两次？\n2. 每个音符设置一个选中状态\n有一个难点：每次调整音符状态的时候，都需要遍历所有音符\n\n结论是：两者结合，空间换时间。\n\n## 音轨\n音轨和音符仅仅通过音符的`ch`属性进行关联。音轨管理的是音色和显式层级，大多时候仅需作为一个字典供外部读取。\n\n然而音轨涉及到UI操作，UI操作会改变midi数据；因此需要向外传递信息，故使用event与外界进行单向交流。耦合关系：\n`MidiAction`监听`ChannelList`的事件，而`ChannelList`不监听`MidiAction`，但受其控制（指可以调用其方法）。\n- `ChannelList`->音轨变化(顺序、个数)->`MidiAction`&`MidiPlayer`\n    如何传递这个变化？改变顺序用reorder事件，删除用remove事件，添加似乎不涉及midi音符的操作。【修正：新增channel也需要事件，用于存档】\n    删除一个channel时，先触发remove，再触发reorder，remove事件用于删除midi列表对应通道的音符，reorder用于更改剩下的音符的音轨序号\n    由于reorder只在序号发生变化时触发，如果是最后一个删除或添加就不会触发，这意味着对此事件监听不能响应所有变化，那如何设置存档点？存档单独注册一个reorder的监听，add/remove前先取消注册，由add/remove自行设置存档，操作结束再注册回来，防止两次存档。\n- `ChannelList`->音轨音量改变->`MidiPlayer`\n- `ChannelList`<-选中音符<-`MidiAction`\n\n这样的设计下，“音轨”完全可以作为一个独立的库：`MidiAction`单向依赖`ChannelList`。\n\n## 播放同步\n在每次animationFrame中，首要做的就是查询音频播放进度，更新系统时间。\n\n然后是合成器播放音符。每次连续播放都会维护一个“音符播放进度”，每次预测下一帧会播放哪些音符，并使用`Web audio API`精确强大的schedule实现精确延时播放。\n\n## 撤销\n本想改了什么存什么（以节省内存），但是没存的会丢失当前信息，所以必须midi、channel、beat都存快照。\n\n## 合成器\n参考 https://github.com/g200kg/webaudio-tinysynth 完成了精简版的合成器，相比原版，有如下变化：\n- 抽象为类，音色变成static属性。\n- 用animationFrame而非timeInterval实现了音符检查与停止。\n- 为了契合“动态音轨”的设计，合成器中以channel为单位组织数组，而非原版以audioNode为单位。\n- 每个音轨的原型都是合成器，故可以单独拿出来使用。\n- 没有做成midi的形式，音符频率依赖外部传参\n- 没有实现通道的调制、左右声道、混响。\n- 没有做鼓的音色。\n\n## 不依赖音频的空白画布，即midi编辑器模式\n由于使用了扒谱架构，同样需要确定时间精度（和一般midi编辑器不一样），因此需要复用onfile逻辑。\n思想是替代Audio类，整理一下需要实现的功能：\n- AudioPlayer.update: 用到了audio.readyState，audio.paused，audio.cuttentTime（更新app.time、重复区间）\n- audio.readyState判断是否可以播放\n- 设置audio.currentTime可以指定位置播放\n- 设置audio.playbackRate可以指定播放速度\n- 还有一些handler在createAudio中。\n\n因此有了`fakeAudio.js`。\n\n其次是Spectrogram._spectrogram，需要全部置为零（供绘制用）此外，查询Spectrogram._spectrogram以获取是否已经分析（onfile中据此判断是工作区否有文件，鼠标事件据此判断是否绘制音符）\n于是设计了一个proxy，有length属性，用[][]访问总是零。\n\nFakeAudio和这个Proxy的连接点在于时长，midi编辑器模式下总时长是会变的。于是借助setter完成了两者的数据关联。同时xnum也要能改变，于是也改为了setter。\n\n## 插件(plugins文件夹)\n此处插件特指有独立可视化需求的功能，比如“和弦识别”，需要绘制识别结果。这些功能并非必须，为了保持核心代码的简洁，不在`App`类中实例化，而是在实例化后外部注入。\n\n## 其他（碎碎念）\n## 去掉等待的动画\n指一边分析一边把频谱绘制出来。改的地方：Array不能初始化好长度，每次应该用push添加元素造成Array.length在增加。每次更新进度条的地方改成频谱赋值。\n这样确实能看到频谱生长出来，但是分析会导致此时的UI操作很卡顿。解决这个问题需要开worker后台计算，每次移交一个时刻的频谱。用了worker就不能双击打开了，不做。\n此外这样意味着音频要先加载，如果出错了，会出现一堆未定义事件。\n所以还是放弃。\n\n### 关于Web Auido API的自动采样\n当AudioContext的采样率和输入音频的采样率不一样的时候会发是什么？\nhttps://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html搜索“resample”可以看到会重新采样。问题是：是否会抗混叠滤波？\n测试：首先创建了一个只含有一个G7音符（3136Hz）的midi，然后利用musescore转为WAV，采样率选择44100Hz。导入分析后，频谱符合预期。\n改变AudioContext的采样率为4186Hz，如果抗混叠滤波，则这个G7肯定要被滤除。如果不抗混叠，则混叠到3136-(4186/2)=1043，位于C6（1046Hz）。\n结果是在C6处出现了能量。所以不会抗混叠。"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\"\n        content=\"noteDigger是一个前端辅助扒谱工具，提供可视化的频谱助力零门槛快速扒谱，工具链完善，实现了“AI扒谱-人工修正-导出”的扒谱全流程。本项目即开即用、完全开源免费！\" />\n    <meta name=\"msvalidate.01\" content=\"675258B9620330F89A324C974E5FF134\" />\n    <meta name=\"google-site-verification\" content=\"EDvkTTOlpIs5kaPG6IxVzZxL-XkfjLrvChCOk6VKgHs\" />\n    <link rel=\"Shortcut Icon\" href=\"./favicon.ico\" type=\"image/x-icon\" />\n    <title>noteDigger~在线扒谱</title>\n\n    <!-- 导出需要，可以慢点加载 -->\n    <script src=\"./lib/midi.js\" async></script>\n    <!-- 可选的CQT分析 -->\n    <script src=\"./dataProcess/CQT/cqt.js\" async></script>\n    <!-- 可选的AI扒谱 -->\n    <script src=\"./dataProcess/AI/AIEntrance.js\" async></script>\n    <!-- 节奏估计 -->\n    <script src=\"./dataProcess/bpmEst.js\" async></script>\n    <!-- 自动音符对齐 -->\n    <script src=\"./dataProcess/ANA.js\" async></script>\n    <!-- 非负最小二乘 -->\n    <script src=\"./dataProcess/NNLS.js\" async></script>\n\n    <script src=\"./ui/siderMenu.js\"></script>\n    <script src=\"./ui/myRange.js\"></script>\n    <script src=\"./ui/contextMenu.js\"></script>\n    <script src=\"./ui/channelDiv.js\"></script>\n    <script src=\"./dataProcess/fft_real.js\"></script>\n    <script src=\"./dataProcess/stftGPU.js\"></script>\n    <script src=\"./dataProcess/analyser.js\"></script>\n    <script src=\"./lib/snapshot.js\"></script>\n    <script src=\"./lib/tinySynth.js\"></script>\n    <script src=\"./lib/beatBar.js\"></script>\n    <script src=\"./lib/saver.js\"></script>\n    <script src=\"./lib/fakeAudio.js\"></script>\n    <script src=\"./core/app_spectrogram.js\"></script>\n    <script src=\"./core/app_midiaction.js\"></script>\n    <script src=\"./core/app_midiplayer.js\"></script>\n    <script src=\"./core/app_audioplayer.js\"></script>\n    <script src=\"./core/app_keyboard.js\"></script>\n    <script src=\"./core/app_timebar.js\"></script>\n    <script src=\"./core/app_beatbar.js\"></script>\n    <script src=\"./core/app_hscrollbar.js\"></script>\n    <script src=\"./core/app_analyser.js\"></script>\n    <script src=\"./core/app_io.js\"></script>\n    <script src=\"./app.js\"></script>\n    <link rel=\"stylesheet\" href=\"./style/style.css\">\n    <link rel=\"stylesheet\" href=\"./style/askUI.css\">\n    <link rel=\"stylesheet\" href=\"./style/myRange.css\">\n    <link rel=\"stylesheet\" href=\"./style/siderMenu.css\">\n    <link rel=\"stylesheet\" href=\"./style/contextMenu.css\">\n    <link rel=\"stylesheet\" href=\"./style/channelDiv.css\">\n    <link rel=\"stylesheet\" href=\"./style/icon/iconfont.css\">\n\n    <!-- 插件 -->\n    <script src=\"./plugins/pitchName.js\" async></script>\n    <script src=\"./plugins/chordEst.js\" async></script>\n</head>\n\n<body class=\"fc\">\n    <!-- 上半部分 工具区 -->\n    <div class=\"tools\">\n        <img src=\"./img/logo-small.png\" alt=\"noteDigger\" class=\"top-logo logo1\">\n        <div class=\"rangeBox\">\n            速度&nbsp;<input type=\"range\" id=\"speedControl\" max=\"2\" min=\"0.2\" step=\"0.1\" value=\"1\">\n        </div>\n        <div>\n            <div class=\"rangeBox\">\n                <b>显</b>&nbsp;&nbsp;倍率&nbsp;<input type=\"range\" id=\"multiControl\" max=\"600\" min=\"10\" step=\"2\"\n                    value=\"240\">\n            </div>\n            <div class=\"rangeBox\">\n                <b>示</b>&nbsp;&nbsp;对比&nbsp;<input type=\"range\" id=\"contrastControl\" max=\"4\" min=\"0.2\" step=\"0.1\"\n                    value=\"1\">\n            </div>\n        </div>\n        <div>\n            <div class=\"rangeBox\">\n                <b>音</b>&nbsp;&nbsp;音符&nbsp;<input type=\"range\" id=\"midivolumeControl\" max=\"1.5\" min=\"0\" step=\"0.02\"\n                    value=\"1\">\n            </div>\n            <div class=\"rangeBox\">\n                <b>量</b>&nbsp;&nbsp;音频&nbsp;<input type=\"range\" id=\"audiovolumeControl\" max=\"1\" min=\"0\" step=\"0.02\"\n                    value=\"0.2\">\n            </div>\n        </div>\n\n        <div class=\"switch-bar\" id=\"actMode\">\n            <button class=\"iconfont icon-pen-l labeled selected\" data-tooltip=\"绘制音符\"></button>\n            <button class=\"labeled\" data-tooltip=\"选择模式\"><!-- 要旋转，所以包裹了一层 -->\n                <div class=\"iconfont icon-select\"></div>\n            </button>\n        </div>\n        <div class=\"switch-bar\">\n            <button class=\"iconfont icon-xifu1 labeled selected\" id=\"snap-btn\" data-tooltip=\"网格吸附\"></button>\n        </div>\n        <div class=\"switch-bar\">\n            <button class=\"iconfont icon-repeat labeled selected\" id=\"repeat-btn\" data-tooltip=\"重复区间:开\"></button>\n        </div>\n        <div class=\"switch-bar\">\n            <button class=\"iconfont icon-pageTurns labeled\" id=\"autopage-btn\" data-tooltip=\"自动翻页:关\"></button>\n        </div>\n        <a href=\"https://www.bilibili.com/video/BV1XA4m1G7k4\" class=\"f logo3\" target=\"_blank\">\n            <img src=\"./img/bilibili-white.png\" alt=\"视频教程\" class=\"top-logo\">\n        </a>\n        <a href=\"https://github.com/madderscientist/noteDigger\" class=\"f logo2\" target=\"_blank\">\n            <img src=\"./img/github-mark-white.png\" alt=\"项目地址\" class=\"top-logo\">\n        </a>\n    </div>\n    <!-- 下半部分 操作区 -->\n    <div class=\"flexfull fr\">\n        <!-- 菜单由函数创建 包括样式管理 -->\n        <div id=\"funcTab\"></div>\n        <div id=\"funcSider\" style=\"position: relative; z-index: 0;\"></div>\n\n        <div class=\"flexfull fc\" style=\"position: relative; z-index: 0; border-left: var(--theme-dark) solid 3px;\">\n            <div id=\"Canvases-Container\" class=\"flexfull\">\n                <div class=\"f wf\">\n                    <button id=\"play-btn\" draggable=\"false\">当前时间<br>总时长</button>\n                    <canvas id=\"timeBar\" width=\"1000px\" height=\"40px\"></canvas>\n                </div>\n                <div class=\"f wf\">\n                    <canvas id=\"piano\" width=\"80px\" height=\"500px\"></canvas>\n                    <div id=\"main-layers\" class=\"flexfull\">\n                        <canvas id=\"spectrum\" width=\"1000px\" height=\"500px\" style=\"z-index: 1;\"></canvas>\n                        <canvas id=\"actions\" width=\"1000px\" height=\"500px\" style=\"z-index: 2;\"></canvas>\n                    </div>\n                </div>\n            </div>\n            <div id=\"scrollbar-track\">\n                <div id=\"scrollbar-thumb\"></div>\n            </div>\n        </div>\n    </div>\n</body>\n<div id=\"tab-Contents\">\n    <ul class=\"paddingbox niceScroll btn-ul\" id=\"filePannel\">\n        <li class=\"pointer\">导入音频</li>\n        <li class=\"pointer\">导入midi</li>\n        <li class=\"pointer\">MIDI编辑器模式</li>\n        <li class=\"pointer\">导出当前进度</li>\n        <li class=\"pointer\">导出为midi</li>\n        <li id=\"numberedScore\">\n            <button>转换为(更新)数字谱</button>\n            <textarea cols=\"30\" rows=\"16\"></textarea>\n        </li>\n    </ul>\n\n    <div class=\"paddingbox niceScroll\">\n        <h3>EQ设置(dB)</h3>\n        <div id=\"EQcontrol\">\n            请先上传音频！\n        </div>\n    </div>\n\n    <ul class=\"paddingbox niceScroll btn-ul\" id=\"analysePannel\">\n        <li class=\"pointer\">调性分析</li>\n        <li>\n            <div style=\"cursor: pointer;\">节奏分析</div>\n            自动节奏型 <input type=\"checkbox\">\n        </li>\n        <li>自动填充 <h5 style=\"display: inline-block;\"><input type=\"checkbox\">在新轨道中</h5>\n            <div class=\"wf fr\">\n                黑&nbsp;<input type=\"range\" max=\"255\" min=\"0\" value=\"255\" step=\"1\">&nbsp;红\n            </div>\n            <div class=\"wf fr\" style=\"justify-content: space-around;\">\n                <button>重复区间内</button>\n                <button>所有时间</button>\n            </div>\n        </li>\n        <li class=\"pointer\">去除谐波</li>\n        <li class=\"pointer\">数字谱对齐音频</li>\n        <li class=\"pointer\">人工智障扒谱</li>\n        <li class=\"pointer\">音色分离扒谱</li>\n    </ul>\n\n    <ul class=\"paddingbox niceScroll btn-ul\" id=\"settingPannel\">\n        <li data-value=\"5\"><button>-</button>宽度<button>+</button></li>\n        <li data-value=\"15\"><button>-</button>高度<button>+</button></li>\n        <li data-value=\"170\"><button>-</button>遮罩厚度<button>+</button></li>\n        <li data-value=\"20\"><button>-</button>最短节拍宽<button>+</button></li>\n        <li data-value=\"1\"><button>-</button>谐波数<button>+</button></li>\n        <li>\n            精准设置重复区间\n            <div id=\"repeatRange\">\n                <input type=\"text\" value=\"00:01:000\">~<input type=\"text\" value=\"00:02:000\">\n            </div>\n            <button>取消区间</button><button>应用</button>\n        </li>\n        <li><label>透明度表示强度&nbsp;<input type=\"checkbox\" checked\n                    onchange=\"app.MidiAction.alphaIntensity=this.checked\"></label></li>\n        <li><label>播放节拍&nbsp;<input type=\"checkbox\" onchange=\"app.MidiPlayer.switchBeatMode(this.checked)\"></label></li>\n    </ul>\n</div>\n<script>\n    const menu = window.menu = SiderMenu.new(funcTab, funcSider, 206);\n    const app = window.app = new App();\n    const _checkBoxBlur = (e) => {\n        e.stopPropagation();\n        e.target.blur();\n    };\n    {   // 添加菜单内容\n        const tabContents = document.getElementById('tab-Contents').children;\n        menu.add('文件', 'iconfont icon-file', tabContents[0]);\n        menu.add('音轨', 'iconfont icon-list', app.MidiAction.channelDiv.container);\n        menu.add('EQ', 'iconfont icon-mixer', tabContents[0]);\n        menu.add('分析', 'iconfont icon-analysis', tabContents[0])\n        menu.add('设置', 'iconfont icon-setting', tabContents[0]);  // 内容是在变的\n        menu.show();\n        document.getElementById('tab-Contents').remove();\n    }\n    // 在后面初始化range; reset触发oninput事件同步app中的值\n    LableRange.new(speedControl).reset();\n    myRange.new(multiControl).reset();\n    myRange.new(contrastControl).reset();\n    hideLableRange.new(midivolumeControl).reset();\n    hideLableRange.new(audiovolumeControl).reset();\n    // 事件\n    // ==== 顶部按钮事件 ==== //\n    document.getElementById('snap-btn').addEventListener('click', function () {\n        switch (app.MidiAction.snapMode) {\n            case 1:\n                app.MidiAction.snapMode = -1;\n                this.dataset.tooltip = \"节拍吸附\";\n                this.className = \"iconfont icon-xifu labeled selected\";\n                break;\n            case -1:\n                app.MidiAction.snapMode = 0;\n                this.dataset.tooltip = \"吸附:关\";\n                this.className = \"iconfont icon-xifu labeled\";\n                break;\n            default:    // 吸附:关\n                app.MidiAction.snapMode = 1;\n                this.dataset.tooltip = \"网格吸附\";\n                this.className = \"iconfont icon-xifu1 labeled selected\";\n                break;\n        }\n        this.blur();\n    });\n    document.getElementById('repeat-btn').addEventListener('click', function () {\n        if (this.classList.toggle('selected')) {\n            app.AudioPlayer.repeat = true;\n            this.dataset.tooltip = '重复区间:开';\n        } else {\n            app.AudioPlayer.repeat = false;\n            this.dataset.tooltip = '重复区间:关';\n        }\n        this.blur();\n    });\n    document.getElementById('autopage-btn').addEventListener('click', function () {\n        if (this.classList.toggle('selected')) {\n            app.AudioPlayer.autoPage = true;\n            this.dataset.tooltip = '自动翻页:开';\n        } else {\n            app.AudioPlayer.autoPage = false;\n            this.dataset.tooltip = '自动翻页:关';\n        }\n        this.blur();\n    });\n    let actMode = document.getElementById('actMode').children;\n    actMode[0].onclick = () => {\n        app.MidiAction.mode = 0;\n        actMode[1].classList.remove('selected');\n        actMode[0].classList.add('selected');\n    };\n    actMode[1].onclick = () => {\n        if (app.MidiAction.mode == 0) app.MidiAction.mode = 1;\n        else {\n            app.MidiAction.frameXid = -1;\n            switch (app.MidiAction.frameMode) {\n                case 0:\n                    app.MidiAction.frameMode = 1;\n                    actMode[1].firstElementChild.className = 'iconfont icon-range';\n                    break;\n                case 1:\n                    app.MidiAction.frameMode = 2;\n                    actMode[1].firstElementChild.style.rotate = '90deg';\n                    break;\n                case 2:\n                    app.MidiAction.frameMode = 0;\n                    actMode[1].firstElementChild.style.rotate = '0deg';\n                    actMode[1].firstElementChild.className = 'iconfont icon-select';\n                    break;\n            }\n        }\n        actMode[0].classList.remove('selected');\n        actMode[1].classList.add('selected');\n    };\n\n    // EQ的UI设置\n    function iniEQUI({ detail }) {\n        if (detail >= 0) return;\n        if (app.midiMode) {\n            EQcontrol.innerHTML = '<h5>MIDI模式下没有EQ哦</h5>';\n            return;\n        }\n        EQcontrol.innerHTML = '';\n        const filters = app.AudioPlayer.audio.EQ.filter;\n        function controlfilter() {\n            this.filter.gain.value = parseInt(this.value);\n        }\n        for (const f of filters) {\n            const Hz = document.createElement('h5');\n            Hz.textContent = f.frequency.value + ' Hz';\n            EQcontrol.appendChild(Hz);\n            const r = document.createElement('input'); r.type = 'range';\n            r.max = 40; r.min = -40;\n            r.value = f.gain.value;\n            r.step = 1;\n            r.filter = f;\n            r.addEventListener('input', controlfilter);\n            EQcontrol.appendChild(r);\n            LableRange.new(r).reset();\n        }\n    } app.event.addEventListener('progress', iniEQUI);\n\n    // ==== 文件界面 ==== //\n    function _uploadFile() {\n        const input = document.createElement('input');\n        input.type = 'file';    // 音频和视频都可以，但是quicktime系列需要单独处理\n        input.accept = 'audio/*,video/*,.mov';\n        input.onchange = function () {\n            app.io.onfile(this.files[0]);\n        }; input.click();\n    }\n    {\n        const lis = document.getElementById('filePannel').children;\n        lis[0].onclick = _uploadFile;\n        lis[1].onclick = async () => {    // 导入midi\n            const input = document.createElement('input');\n            input.type = 'file'; input.accept = '.mid';\n            input.onchange = function () {\n                app.io.onfile(this.files[0]);\n            }; input.click();\n        };\n        lis[2].onclick = () => {\n            app.io.onfile();\n        }\n        lis[3].onclick = () => {\n            if (!app.Spectrogram._spectrogram) {\n                alert(\"请先导入音频！\");\n                return;\n            } app.io.projFile.write();\n        }\n        lis[4].onclick = () => {    // midi导出\n            if (!app.Spectrogram._spectrogram) {\n                alert(\"请先导入音频！\");\n                return;\n            }\n            app.io.midiFile.export.UI();\n        };\n        const textfield = numberedScore.querySelector('textarea');\n        textfield.addEventListener('focus', () => app.preventShortCut = true);\n        textfield.addEventListener('blur', () => app.preventShortCut = false);\n        numberedScore.querySelector('button').onclick = () => { // 转数字谱\n            const note = [\"1\", \"#1\", \"2\", \"#2\", \"3\", \"4\", \"#4\", \"5\", \"#5\", \"6\", \"#6\", \"7\"];\n            function indexToje(index) { // indexToje(0) -> \"1\"\n                let position = (index % 12 + 12) % 12;\n                let k = Math.floor(index / 12);\n                let brackets = '';\n                for (let i = 0; i < Math.abs(k); i++) {\n                    brackets = brackets + '[';\n                }\n                return ((k > 0) ? brackets : brackets.replace(/\\[/g, '(')) + note[position] + ((k > 0) ? brackets.replace(/\\[/g, ']') : brackets.replace(/\\[/g, ')'));\n            }\n            const midi = app.MidiAction.midi;\n            const scores = Array.from(app.MidiAction.channelDiv.channel, () => '');\n            let time = Array.from(scores, () => -1);\n            for (const note of midi) {\n                let id = note.ch;\n                if (time[id] >= 0) {\n                    let interval = (note.x1 - time[id]) * app.dt;\n                    if (interval > 1000) scores[id] += '\\n';\n                    else if (interval > 400) scores[id] += ' ';\n                }\n                scores[id] += indexToje(note.y - 36);   // C4认为是'1'\n                time[id] = note.x1;\n            }\n            let out = '';\n            for (let i = 0; i < scores.length; i++)\n                out += `音轨${i} :${app.MidiAction.channelDiv.channel[i].instrument}\\n${scores[i]}\\n`;\n            textfield.value = out;\n        };\n    }\n\n    // ==== 分析界面 ==== //\n    {\n        const lis = document.getElementById('analysePannel').children;\n        lis[0].onclick = function () {\n            // 如果已经有结果了就删除\n            if (this.childElementCount) {\n                this.removeChild(this.lastChild);\n                return;\n            }\n            if (!app.Spectrogram._spectrogram || app.midiMode) {\n                alert(\"请先导入音频！\");\n                return;\n            }\n            let [tonality, energy] = NoteAnalyser.Tonality(app.Spectrogram._spectrogram);\n            const div = document.createElement('div');\n            div.innerHTML = `<h5>调性: ${tonality}</h5>\n            <div class=\"tonalityResult\">\n                <div style=\"background:#FF4500;width:${energy[0] * 100}%;\">C</div>\n                <div style=\"background:#FFD700;width:${energy[1] * 100}%;\">C#</div>\n                <div style=\"background:#32CD32;width:${energy[2] * 100}%;\">D</div>\n                <div style=\"background:#00BFFF;width:${energy[3] * 100}%;\">D#</div>\n                <div style=\"background:#FF6347;width:${energy[4] * 100}%;\">E</div>\n                <div style=\"background:#FF1493;width:${energy[5] * 100}%;\">F</div>\n                <div style=\"background:#7FFF00;width:${energy[6] * 100}%;\">F#</div>\n                <div style=\"background:#1E90FF;width:${energy[7] * 100}%;\">G</div>\n                <div style=\"background:#FFA500;width:${energy[8] * 100}%;\">G#</div>\n                <div style=\"background:#EE82EE;width:${energy[9] * 100}%;\">A</div>\n                <div style=\"background:#ADFF2F;width:${energy[10] * 100}%;\">A#</div>\n                <div style=\"background:#87CEFA;width:${energy[11] * 100}%;\">B</div>\n            </div>`;\n            this.appendChild(div);\n        };\n        // 节奏分析\n        lis[1].onclick = function () {\n            const lastChild = this.lastElementChild;\n            if (lastChild && lastChild.tagName === 'DIV') {\n                lastChild.remove();\n            }\n            if (!app.Spectrogram._spectrogram || app.midiMode) {\n                alert(\"请先导入音频！\");\n                return;\n            }\n            const patternAuto = this.querySelector('input').checked;\n            const BPM = app.Analyser.beatEst(40, patternAuto);\n            const div = document.createElement('div');\n            div.innerHTML = `<h5>BPM: ${BPM.toFixed(2)}</h5>`;\n            this.appendChild(div);\n        };\n        {   // 自动填充音符\n            const inputs = lis[2].querySelectorAll('input');\n            const btns = lis[2].querySelectorAll('button');\n            const checkbox = inputs[0];\n            checkbox.addEventListener('click', _checkBoxBlur);\n            const threshold = inputs[1];\n            threshold.addEventListener('input', function () {\n                this.style.background = app.Spectrogram.getColor(this.value)\n            });\n            hideLableRange.new(threshold).reset().parentElement.classList.add('fullRange');\n            function autoFill(from, to) {\n                let ch;\n                const chdiv = app.MidiAction.channelDiv;\n                chdiv.switchUpdateMode(false);\n                if (checkbox.checked) {  // 新建音轨\n                    ch = chdiv.addChannel();\n                    if (!ch) return;    // addChannel会alert\n                } else ch = chdiv.selected;\n                if (!ch) {\n                    alert(\"未选中音轨！\");\n                    return;\n                }\n                let id = ch.index;\n                let notes = NoteAnalyser.autoFill(\n                    app.Spectrogram.getCurrentSpectrum(),\n                    parseInt(threshold.value),\n                    from, to\n                );\n                for (const nt of notes) nt.ch = id;\n                app.MidiAction.midi.push(...notes);\n                app.MidiAction.midi.sort((a, b) => a.x1 - b.x1);\n                chdiv.switchUpdateMode(true, true);     // 强制更新，因为不一定调用了addChannel\n            }\n            btns[0].onclick = () => {   // 重复区间内\n                if (!app.Spectrogram._spectrogram) {\n                    alert('请导入音频！');\n                    return;\n                }\n                if (app.TimeBar.repeatEnd <= app.TimeBar.repeatStart) {\n                    alert('区间错误！(起点不能晚于终点)');\n                    return;\n                }\n                autoFill(\n                    (app.TimeBar.repeatStart / app.dt) | 0,\n                    app.TimeBar.repeatEnd / app.dt\n                );\n            };\n            btns[1].onclick = () => {\n                if (!app.Spectrogram._spectrogram) {\n                    alert('请导入音频！');\n                    return;\n                } autoFill();\n            };\n        }\n        // 去谐波\n        lis[3].onclick = function () {\n            if (!app.Spectrogram._spectrogram || app.midiMode) {\n                alert(\"请先导入音频！\");\n                return;\n            }\n            app.Analyser.reduceHarmonic().then((done) => {\n                if (!done) return;\n                if (this.childElementCount) return;\n                this.firstChild.textContent = \"重新去除谐波\";\n                let ui = document.createElement('div');\n                ui.innerHTML = `<h5 style=\"display: inline-block;\">谐波保留:</h5><div class=\"wf fr\">多&nbsp;<input type=\"range\" max=\"1\" min=\"0\" value=\"${app.Spectrogram.Hmultiple}\" step=\"0.05\">&nbsp;少</div>`;\n                const r = ui.querySelector('input');\n                r.addEventListener('input', function () {\n                    app.Spectrogram.Hmultiple = parseFloat(this.value);\n                });\n                r.classList.add('fullRange');\n                ui.addEventListener('click', _checkBoxBlur);\n                this.appendChild(ui);\n                myRange.new(r).reset();\n            });\n        };\n        // 自动音符对齐\n        lis[4].onclick = () => app.Analyser.autoNoteAlign();\n        // 人工智障扒谱\n        lis[5].onclick = function () {\n            if (!app.Analyser.basicamt(null, true)) return; // 仅仅判断是否可以进行AI扒谱\n            const btn = this;\n            // 由于效果并不好，因此不会自动执行；而程序为了省内存不会保留音频数据，因此需要重新上传音频\n            const input = document.createElement('input');\n            input.type = 'file';\n            input.accept = 'audio/*,video/*,.mov';\n            input.onchange = function () {\n                btn.innerHTML = \"AI扒谱中...\";\n                const fileReader = new FileReader();\n                fileReader.onload = (e) => {\n                    // 解码音频文件为音频缓冲区\n                    app.audioContext.decodeAudioData(e.target.result).then((decodedData) =>\n                        app.Analyser.basicamt(decodedData, false)\n                    ).then(() => {\n                        btn.innerHTML = \"人工智障扒谱\";\n                    });\n                }; fileReader.readAsArrayBuffer(this.files[0]);\n            }; input.click();\n        };\n        // 音色分离扒谱\n        lis[6].onclick = function () {\n            if (!app.Analyser.basicamt(null, true)) return; // 仅仅判断是否可以进行AI扒谱\n            const btn = this;\n            const input = document.createElement('input');\n            input.type = 'file';\n            input.accept = 'audio/*,video/*,.mov';\n            input.onchange = function () {\n                // 文件选完后弹出分离数量选择UI\n                let tempDiv = document.createElement('div');\n                tempDiv.innerHTML = `\n<div class=\"request-cover\">\n    <div class=\"card hvCenter\">\n        <h3>选择音色数目</h3>\n        请选择要分离的音色数目（2-4）<br>适合乐器差异较大的乐曲<br>\n        <input type=\"number\" min=\"2\" max=\"4\" value=\"2\">\n        <div class=\"layout layout-first\">\n            <button class=\"ui-cancel\">取消</button>\n            <span style=\"width: 1em;\"></span>\n            <button class=\"ui-confirm\">确认</button>\n        </div>\n    </div>\n</div>`;\n                const ui = tempDiv.firstElementChild;\n                const close = () => ui.remove();\n                ui.querySelector('.ui-cancel').onclick = close;\n                ui.querySelector('.ui-confirm').onclick = () => {\n                    let k = parseInt(ui.querySelector('input').value);\n                    if (isNaN(k) || k < 2 || k > 5) {\n                        alert('请输入2-4的整数！');\n                        return;\n                    }\n                    close();\n                    btn.innerHTML = \"AI扒谱中...\";\n                    const fileReader = new FileReader();\n                    fileReader.onload = (e) => {\n                        app.audioContext.decodeAudioData(e.target.result).then((decodedData) =>\n                            app.Analyser.septimbre(decodedData, k)\n                        ).then(() => {\n                            btn.innerHTML = \"音色分离扒谱\";\n                        });\n                    }; fileReader.readAsArrayBuffer(input.files[0]);\n                }\n                document.body.insertBefore(ui, document.body.firstChild);\n            };\n            input.click();\n        };\n    }\n\n    // ==== 设置界面 ==== //\n    {\n        const lis = document.getElementById('settingPannel').children;\n        lis[0].dataset.value = app.width;\n        lis[0].firstChild.onclick = (e) => {\n            e.target.blur();\n            --app.width;    // 设置width会自动被setter限位\n            lis[0].dataset.value = app.width;\n            app.scroll2();\n        };\n        lis[0].lastChild.onclick = (e) => {\n            e.target.blur();\n            lis[0].dataset.value = ++app.width;\n            app.scroll2();\n        };\n        lis[1].dataset.value = app.height;\n        lis[1].firstChild.onclick = (e) => {\n            e.target.blur();\n            --app.height;    // 设置height会自动被setter限位\n            lis[1].dataset.value = app.height;\n            app.scroll2();\n        };\n        lis[1].lastChild.onclick = (e) => {\n            e.target.blur();\n            lis[1].dataset.value = ++app.height;\n            app.scroll2();\n        };\n        lis[2].dataset.value = app.layers.action.Alpha;\n        lis[2].firstChild.onclick = (e) => {\n            e.target.blur();\n            if (app.layers.action.Alpha <= 1) return;\n            lis[2].dataset.value = app.layers.action.Alpha -= 2;\n        };\n        lis[2].lastChild.onclick = (e) => {\n            e.target.blur();\n            lis[2].dataset.value = app.layers.action.Alpha += 2;\n        };\n        lis[3].dataset.value = app.BeatBar.minInterval;\n        lis[3].firstChild.onclick = (e) => {\n            e.target.blur();\n            if (app.BeatBar.minInterval <= 5) return;\n            lis[3].dataset.value = --app.BeatBar.minInterval;\n        };\n        lis[3].lastChild.onclick = (e) => {\n            e.target.blur();\n            lis[3].dataset.value = ++app.BeatBar.minInterval;\n        };\n        lis[4].dataset.value = app.Keyboard.Harmonics;\n        lis[4].firstChild.onclick = (e) => {\n            e.target.blur();\n            if (app.Keyboard.Harmonics <= 0) return;\n            lis[4].dataset.value = --app.Keyboard.Harmonics;\n        };\n        lis[4].lastChild.onclick = (e) => {\n            e.target.blur();\n            if (app.Keyboard.Harmonics >= 6) return;\n            lis[4].dataset.value = ++app.Keyboard.Harmonics;\n        };\n        const repeatInput = lis[5].querySelectorAll('input');\n        function checkTime(time) {\n            const timeRegex = /^\\d{1,2}:\\d{1,2}:\\d{1,3}$/;\n            return timeRegex.test(time);\n        }\n        function Time2Ms(time) {\n            const t = time.split(':');\n            return parseInt(t[0]) * 60000 + parseInt(t[1]) * 1000 + parseInt(t[2]);\n        }\n        repeatInput[0].oninput = repeatInput[1].oninput = function () {\n            this.style.color = checkTime(this.value) ? 'var(--theme-text)' : 'red';\n        };\n        const repbtn = lis[5].querySelectorAll('button');\n        repbtn[0].onclick = (e) => {\n            app.TimeBar.setRepeat(-1, -1);\n            e.target.blur();\n        };\n        repbtn[1].onclick = (e) => {\n            e.target.blur();\n            if (checkTime(repeatInput[0].value) && checkTime(repeatInput[1].value)) {\n                let i1 = Time2Ms(repeatInput[0].value);\n                let i2 = Time2Ms(repeatInput[1].value);\n                if (i1 > i2) {\n                    let temp = i2;\n                    i2 = i1; i1 = temp;\n                }\n                app.TimeBar.setRepeat(i1, i2);\n            } else alert('时间格式错误！');\n        }\n    }\n    // ==== 交互细节 ==== //\n    document.querySelector('.top-logo').addEventListener('click', () => {\n        // 如果已经有分析数据了，就打开新的界面\n        if (app.Spectrogram._spectrogram) {\n            if (confirm('本页面已有分析结果，是否打开新页面进行分析？')) {\n                window.open(window.location.href, '_blank');\n            }\n        } else _uploadFile();\n    });\n    window.onbeforeunload = function (e) {\n        if (app.MidiAction.midi.length) {\n            e.preventDefault(); // 取消默认的关闭提示消息\n            e.returnValue = ''; // Chrome 需要在返回值上赋值            \n        }\n    };\n    // 加载插件\n    if (window.plugins) {\n        window.plugins.forEach(plugin => plugin(window.app));\n        window.plugins = null;   // 卸载插件接口，释放内存\n    }\n    // 扩大复选框的点击范围 取消焦点\n    document.querySelectorAll('input[type=\"checkbox\"]').forEach(input => {\n        input.addEventListener('click', _checkBoxBlur);\n    });\n</script>\n<script>\n    const dragEvents = {\n        dragover: function (e) {\n            e.preventDefault(); // 必须阻止默认事件才能触发drop事件\n        }, // dragover触发过于频繁，所以用dragenter来增加dragIn\n        dragenter: function (e) {\n            e.preventDefault();\n            // 检查是否有文件被拖入 以防止dom被拖入也触发\n            if (Array.from(e.dataTransfer.types).includes('Files')) {\n                document.body.classList.add('dragIn');\n            }\n        },\n        dragleave: function (e) {\n            e.preventDefault();\n            if (!document.body.contains(e.relatedTarget)) { // 不这样写会导致立即删去dragIn类\n                document.body.classList.remove('dragIn');\n            }\n        },\n        drop: function (e) {\n            e.preventDefault();\n            document.body.classList.remove('dragIn');\n            if (Array.from(e.dataTransfer.types).includes('Files')) {   // 判断是否有文件被拖入\n                app.io.onfile(e.dataTransfer.files[0]);\n            }\n        },\n        registDrag: function () {\n            document.body.addEventListener('dragover', dragEvents.dragover);\n            document.body.addEventListener('dragenter', dragEvents.dragenter);\n            document.body.addEventListener('dragleave', dragEvents.dragleave);\n            document.body.addEventListener('drop', dragEvents.drop);\n        },\n        deRegistDrag: function () {\n            document.body.removeEventListener('dragover', dragEvents.dragover);\n            document.body.removeEventListener('dragenter', dragEvents.dragenter);\n            document.body.removeEventListener('dragleave', dragEvents.dragleave);\n            document.body.removeEventListener('drop', dragEvents.drop);\n        }\n    }; dragEvents.registDrag();\n\n    app.event.addEventListener('fileui', dragEvents.deRegistDrag);\n    app.event.addEventListener('fileuiclose', dragEvents.registDrag);\n    app.event.addEventListener('fileerror', (e) => {\n        dragEvents.registDrag();\n        alert(\"文件解析！\" + e.detail.message);\n    });\n</script>\n<script>\n    /**\n     * iOS 长按适配全局\n     * 功能：在 iOS 设备上，将长按操作映射为 contextmenu 事件\n     */\n    (function () {\n        // 检测是否为 iOS 设备\n        const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\n        if (!isIOS) return;\n\n        let longPressTimer = null;\n        const LONG_PRESS_DURATION = 500; // 长按阈值 ms\n        let startX = null, startY = null; // 记录触摸起始位置\n\n        document.addEventListener('touchstart', function (e) {\n            // 如果已经存在长按目标，清除之前的计时器\n            if (longPressTimer) {\n                clearTimeout(longPressTimer);\n                longPressTimer = null;\n            }\n            // 只处理单个触点\n            if (e.touches.length > 1) return;\n            // 保存触摸点信息\n            const touch = e.touches[0];\n            if (!touch) return;\n            startX = touch.clientX;\n            startY = touch.clientY;\n            // 获取触摸的目标元素\n            const targetElement = e.target;\n            if (!targetElement) return;\n            // 启动长按计时器\n            longPressTimer = setTimeout(function () {\n                // 在触摸的目标元素上触发事件\n                const contextMenuEvent = new MouseEvent('contextmenu', {\n                    bubbles: true,\n                    cancelable: true,\n                    view: window,\n                    clientX: startX,\n                    clientY: startY,\n                    button: 2 // 模拟右键按钮\n                });\n                targetElement.dispatchEvent(contextMenuEvent);\n                longPressTimer = null;\n            }, LONG_PRESS_DURATION);\n        }, { passive: true });\n\n        // 处理触摸移动（移动超过5像素时取消长按）\n        document.addEventListener('touchmove', function (e) {\n            if (longPressTimer && startX !== null && startY !== null) {\n                const touch = e.touches[0];\n                if (touch) {\n                    if (Math.hypot(touch.clientX - startX, touch.clientY - startY) > 8) {\n                        clearTimeout(longPressTimer);\n                        longPressTimer = null;\n                    }\n                }\n            }\n        }, { passive: true });\n\n        const cancelLongPress = () => {\n            if (longPressTimer) {\n                clearTimeout(longPressTimer);\n                longPressTimer = null;\n            }\n        };\n        document.addEventListener('touchend', cancelLongPress);\n        document.addEventListener('touchcancel', cancelLongPress);\n        console.log('iOS 长按适配已启用');\n    })();\n</script>\n\n</html>"
  },
  {
    "path": "jsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2023\",\n    \"checkJs\": false,   // 不启用类型检查 因为用了很多流氓写法\n    \"allowJs\": true,    // 允许分析JS文件\n    \"noEmit\": true      // 不生成输出文件\n  },\n  \"exclude\": [\"node_modules\"]\n}"
  },
  {
    "path": "lib/beatBar.js",
    "content": "// 本文件用于管理小节信息，实现了稀疏存储小节的数据结构\nclass aMeasure {\n    /**\n     * 构造一个小节\n     * @param {number | aMeasure} beatNum 分子 几拍为一小节; 如果是aMeasure对象则复制构造\n     * @param {number} beatUnit 分母 几分音符是一拍\n     * @param {number} interval 一个小节的时间，单位ms\n     */\n    constructor(beatNum = 4, beatUnit = 4, interval = 2000) {\n        if (typeof beatNum === 'number') {\n            this.beatNum = beatNum;\n            this.beatUnit = beatUnit;\n            this.interval = interval;\n        } else {    // 复制构造\n            this.beatNum = beatNum.beatNum;\n            this.beatUnit = beatNum.beatUnit;\n            this.interval = beatNum.interval;\n        }\n    }\n    static fromBpm(beatNum, beatUnit, bpm) {\n        let interval = 60000 * beatNum / bpm;\n        return new aMeasure(beatNum, beatUnit, interval);\n    }\n    copy(obj) {\n        this.beatNum = obj.beatNum;\n        this.beatUnit = obj.beatUnit;\n        this.interval = obj.interval;\n        return this;\n    }\n    // 不关注bpm，而关注interval。所以修改了beatNum会导致bpm变化\n    get bpm() {\n        return 60000 / this.interval * this.beatNum;\n    }\n    set bpm(value) {\n        this.interval = 60000 * this.beatNum / value;\n    }\n    isEqual(other) {\n        return this.interval === other.interval && this.beatNum === other.beatNum && this.beatUnit === other.beatUnit;\n    }\n}\n\n// extended aMeasure\nclass eMeasure extends aMeasure {\n    /**\n     * 构造一个有位置信息的小节\n     * @param {number | eMeasure} id 小节号 或 eMeasure对象（复制构造）\n     * @param {number} start 小节开始时间 单位ms\n     * @param {number | aMeasure} beatNum \n     * @param {number} beatUnit \n     * @param {number} interval \n     */\n    constructor(id = 0, start = 0, beatNum, beatUnit, interval) {\n        if(typeof id === 'number') {\n            super(beatNum, beatUnit, interval);\n            this.id = id;       // 第几小节\n            this.start = start; // 开始的时间 单位ms\n        } else {\n            super(id);\n            this.id = id.id;\n            this.start = id.start;\n        }\n    }\n    /**\n     * 基于某个小节构造一个新的小节\n     * @param {eMeasure} base 同类型的小节\n     * @param {number} id 小节号\n     * @param {aMeasure} measure 如果要修改值就传 否则参数同base\n     * @returns \n     */\n    static baseOn(base, id, measure = undefined) {\n        return new eMeasure(id, (id - base.id) * base.interval + base.start, measure || base);\n    }\n}\n\nclass Beats extends Array {\n    /**\n     * 构造一个稀疏数组，只存储节奏变化\n     * @param {number} maxTime 乐曲时长 单位ms\n     */\n    constructor(maxTime = 60000) {\n        super(1);\n        this.maxTime = maxTime; // 用于迭代\n        this[0] = new eMeasure(0, 0);\n    }\n    /**\n     * 找到当前小节模式的小节头\n     * @param {number} at 当前小节的时间或小节号\n     * @param {boolean} timeMode at是否表示毫秒时间\n     * @returns {number} 小节头在实际数组中的位置\n     */\n    getBaseIndex(at, timeMode = false) {\n        let attr = timeMode ? 'start' : 'id';\n        for (let i = this.length - 1; i >= 0; i--) {\n            if (this[i][attr] <= at) return i;\n        } return -1;\n    }\n    /**\n     * 迭代器屏蔽了数组的稀疏性 如要连续取值，在元素多的时候效果比getMeasure(id)好\n     * 注意传入的参数需要自行匹配好，否则后果未知 建议用this.iterator()代替此函数\n     * @param {number} index 开始的序号\n     * @param {number} baseAt 基于的eMeasure对象在实际数组中的位置\n     * @returns next()\n     */\n    [Symbol.iterator](index = 0, baseAt = 0) {\n        return {\n            next: () => {\n                // 确定base\n                let nextBase = this[baseAt + 1];\n                if (nextBase && nextBase.id === index) baseAt++;\n                else nextBase = this[baseAt];\n                // 得到小节信息\n                let value = eMeasure.baseOn(nextBase, index++);\n                // 判断是否越界\n                if (value.start >= this.maxTime) return { done: true };\n                return {\n                    value: value,\n                    done: false\n                };\n            }\n        };\n    }\n    /**\n     * 从任意位置开始的迭代器\n     * @param {number} at 位置\n     * @param {boolean} timeMode at是否表示毫秒时间\n     * @returns 迭代器\n     */\n    iterator(at, timeMode = false) {    // 由于在绘制更新中使用，故没有复用getBaseIndex以加速运行\n        let attr = timeMode ? 'start' : 'id';\n        for (let i = this.length - 1; i >= 0; i--) {\n            if (this[i][attr] <= at) {\n                let id = timeMode ? this[i].id + ((at - this[i].start) / this[i].interval) | 0 : at;\n                return this[Symbol.iterator](id, i);\n            }\n        } return {\n            next: () => ({ done: true })\n        }\n    }\n    /**\n     * 根据小节号返回一个只读的小节\n     * @param {number} at 小节号或覆盖该时刻的小节\n     * @param {boolean} timeMode 传入的是否是时间\n     * @returns {eMeasure} 小节信息，修改返回值不会影响原数组 如果越界则返回null\n     */\n    getMeasure(at, timeMode = false) {\n        let i = this.getBaseIndex(at, timeMode);\n        if (i == -1) return null;\n        let id = timeMode ? this[i].id + ((at - this[i].start) / this[i].interval) | 0 : at;\n        let m = eMeasure.baseOn(this[i], id);\n        if (m.start >= this.maxTime) return null;\n        return m;\n    }\n    /**\n     * 返回一个可以修改的对象。若修改返回值会影响原数组，修改后应调用this.check()\n     * @param {number} at 修改第几小节或覆盖该时间的小节\n     * @param {aMeasure} measure 小节信息 传递后也需要外界调用this.check()来确认设置\n     * @param {boolean} timeMode at是否表示毫秒时间\n     * @param {boolean} returnIdx 是否返回索引而不是对象\n     * @returns {eMeasure} 可以修改的对象 如果越界则返回null returnIdx=true则返回索引\n     */\n    setMeasure(at, measure = undefined, timeMode = false, returnIdx = false) {\n        let i = this.getBaseIndex(at, timeMode);\n        if (i == -1) return null;\n        // 检查id是否存在 如果不存在就找到第一个data.id > id的位置插入\n        let id = timeMode ? this[i].id + ((at - this[i].start) / this[i].interval) | 0 : at;\n        if (this[i].id == id) {\n            if (measure) this[i].copy(measure);\n            if (returnIdx) return i;\n            return this[i];\n        }\n        if (this[i].id < id) {\n            // 不管是否重复 重复性的检查交给check\n            let m = eMeasure.baseOn(this[i], id, measure);\n            if (m.start >= this.maxTime) return null;\n            this.splice(i + 1, 0, m);\n            if (returnIdx) return i + 1;\n            return m;\n        }\n    }\n\n    /**\n     * 整理小节信息:\n     * 1. 合并前后参数一样的小节 (由merge控制是否合并)\n     * 2. 校准每个小节的开始时间\n     * 应该在添加、删除、修改数组元素后调用 需要手动调用\n     * 在鼠标操作预览时不应合并小节 (会造成中途小节丢失)\n     */\n    check(merge = true) {\n        this[0].start = 0;\n        this[0].id = 0;\n        for (let i = 0, end = this.length - 1; i < end; i++) {\n            if (this[i].start > this.maxTime) {\n                this.splice(i); return;\n            }\n            if (merge && this[i].isEqual(this[i + 1])) {\n                this.splice(i + 1, 1);\n                i--; end--;\n            } else this[i + 1].start = (this[i + 1].id - this[i].id) * this[i].interval + this[i].start;\n        }\n    }\n    /**\n     * 删除一个小节\n     * @param {number} at 位置\n     * @param {boolean} timeMode at是否表示毫秒时间\n     */\n    delete(at, timeMode = false) {\n        let attr = timeMode ? 'start' : 'id';\n        for (let i = this.length - 1; i >= 0; i--) {\n            if (this[i][attr] <= at) {\n                // 如果只有一个小节，则删除小节头\n                if (this[i + 1] && this[i].id === this[i + 1].id) { // this[i+1].id不用减1，因为已经减过了\n                    this.splice(i, 1);\n                } break;\n            } this[i].id--; // 后面的都前移一格\n        } this.check();\n    }\n    /**\n     * 增加一个小节，小节属性同前一个小节\n     * @param {number} at 位置\n     * @param {boolean} timeMode at是否表示毫秒时间\n     */\n    add(at, timeMode = false) {\n        let attr = timeMode ? 'start' : 'id';\n        for (let i = this.length - 1; i >= 0; i--) {\n            if (this[i][attr] <= at) break;\n            this[i].id++; // 后面的都后移一格\n        } this.check();\n    }\n    /**\n     * 拷贝数据 用户撤销恢复\n     * @param {Beats} beatArray \n     * @returns {Beats} this\n     */\n    copy(beatArray) {\n        this.length = beatArray.length;\n        for (let i = beatArray.length - 1; i >= 0; i--) {\n            this[i] = new eMeasure(beatArray[i]);\n        } return this;\n    }\n}"
  },
  {
    "path": "lib/fakeAudio.js",
    "content": "/**\n * 模拟没有声音、时长可变的Audio。模拟了：\n * 设置currentTime跳转播放位置\n * 设置playbackRate改变播放速度\n * play()和pause()控制播放\n * 到duration后自动停止，触发onended\n * duration改变后，触发ondurationchange\n * 构造后，下一个时刻触发ondurationchange和onloadeddata\n */\nfunction FakeAudio(duration = Infinity) {\n    this.readyState = 4;\n    this.paused = true;\n    this.volume = 0;    // 废物属性\n    this.loop = false;  // 是否循环。和下面的_loop不一样\n    this._currentTime = 0;\n    this._duration = duration;\n    this._playbackRate = 1;\n    this._loop = 0;\n    this._beginTime = 0;\n    this._lastTime = 0;\n    this.onended = Function.prototype;\n    this.onloadeddata = Function.prototype;\n    this.ondurationchange = Function.prototype;\n    const update = (t) => {\n        let dt = t - this._beginTime;\n        this._currentTime = this._lastTime + dt * this._playbackRate / 1000;\n        if (this._currentTime >= this._duration) {\n            if (this.loop) {\n                this.currentTime = 0;\n            } else {\n                this.pause();\n                this.onended();\n                return;\n            }\n        }\n        this._loop = requestAnimationFrame(update);\n    };\n    this.pause = () => {\n        cancelAnimationFrame(this._loop);\n        this._lastTime = this._currentTime;\n        this.paused = true;\n    }\n    this.play = () => {\n        if (this._currentTime >= this._duration) this._lastTime = this._currentTime = 0;\n        this._beginTime = document.timeline.currentTime;\n        this._loop = requestAnimationFrame(update);\n        this.paused = false;\n    }\n    Object.defineProperty(this, 'currentTime', {\n        get: function () { return this._currentTime; },\n        set: function (t) {\n            if (t < 0) t = 0;\n            if (t > this._duration) t = this._duration;\n            this._lastTime = this._currentTime = t;\n            this._beginTime = document.timeline.currentTime;\n        }\n    });\n    Object.defineProperty(this, 'playbackRate', {\n        get: function () { return this._playbackRate; },\n        set: function (r) {\n            this._playbackRate = r;\n            this.currentTime = this._currentTime;\n        }\n    });\n    Object.defineProperty(this, 'duration', {\n        get: function () { return this._duration; },\n        set: function (d) {\n            if (d < 0) return;\n            this._duration = d;\n            this.ondurationchange();\n        }\n    });\n    // 给设置handler留时间\n    setTimeout(() => {\n        this.ondurationchange();\n        this.onloadeddata();\n    }, 0);\n}"
  },
  {
    "path": "lib/midi.js",
    "content": "/**\n * 对midi事件进行封装\n * 相比于原生midi事件：\n * - 使用绝对时间（在导出为二进制时被mtrk转换为相对时间）\n * - 不记录通道信息（在导出为二进制时由mtrk加上通道信息）\n */\nclass midiEvent {\n    ticks;  // 绝对时间 无需是整数 因为export时会被mtrk.tick_hex转为整数\n    code;   // 必须是整数 由构造函数保证，但不限制范围\n    value;  // 每一项必须是整数 由构造函数保证，但不限制范围\n    // 范围的限制由static方法保证\n    /**\n     * 用参数创建一个事件\n     * @param {number} ticks 绝对时间，单位tick。若tisks == -1, 在mtrk.addEvent时会自动使用last_tick; 若<-1, 则last_tick - this.ticks（此时代表相对时间）\n     * @param {number} code 如果有channel，则去掉channel，如0x91 -> 0x9；如果是0xf0则保留此编码；如果是0xff则需要加上后面的type，如0xff51\n     * @param {Array<number>} value 数组，代表其余所有参数\n     */\n    #constructor_args(ticks, code, value) {\n        this.ticks = ticks;\n        this.code = code;\n        if (value instanceof Number) this.value = [value];\n        else this.value = value;\n        return this;\n    }\n    /**\n     * 根据已经创建的对象创建事件\n     * @param {Object} eventObj 一个对象，包含ticks, code, value\n     * @param {boolean} reference 是否引用 默认true\n     */\n    #constructor_obj(eventObj, reference = true) {\n        if (reference) {\n            if (eventObj instanceof midiEvent) return eventObj;\n            Object.setPrototypeOf(eventObj, midiEvent.prototype);\n            return eventObj;\n        } else {\n            this.ticks = eventObj.ticks;\n            this.code = eventObj.code;\n            this.value = eventObj.value;\n            return this;\n        }\n    }\n    /**\n     * 根据参数数目选择不同的构造函数创建事件。会把非整数转为整数\n     * @param 参考构造函数#constructor_args和#constructor_obj\n     * @returns midiEvent\n     */\n    constructor() {\n        let e = (arguments.length == 3) ? this.#constructor_args(...arguments) : this.#constructor_obj(...arguments);\n        // 数据整数化\n        for (let i = 0; i < e.value.length; i++) e.value[i] = Math.round(e.value[i]);\n        e.code = e.code | 0;\n        return e;\n    }\n    /**\n     * 针对0xff事件的type\n     * code存的是0xff<<8+type，所以type是code的低8位\n     */\n    get type() {\n        if (this.code >= 0xff) return this.code & 0xff;\n        return void 0;\n    }\n    /**\n     * 导出为二进制数据，要求this.ticks是绝对时间（非负数）\n     * 应由mtrk调用，可以保证this.ticks是绝对时间（调用mtrk.addEvent时会转换相对为绝对）\n     * @param {number} current_tick 本事件发生前的时间\n     * @param {number} channel midi通道，对0xff??和0xf0事件无效\n     * @returns {Array<number>} midi二进制数据数组的数组\n     */\n    export(current_tick = 0, channel = 0) {\n        const d = mtrk.tick_hex(this.ticks - current_tick);\n        if (this.code >= 0xf0) {\n            if (this.code == 0xf0) d.push(0xf0, this.value.length);\n            else d.push(0xff, this.type, this.value.length);\n        } else d.push((this.code << 4) + channel);\n        d.push(...this.value);\n        return d;\n    }\n\n    static note(at, duration, note, intensity) {\n        if (note < 0 || note > 127) {\n            if (midi.autoFix) note = mtrk.constrain(note, 0, 127);\n            else throw new Error('note should be in [0, 127]');\n        }\n        if (intensity < 0 || intensity > 127) {\n            if (midi.autoFix) intensity = mtrk.constrain(intensity, 0, 127);\n            else throw new Error('note intensity should be in [0, 127]');\n        }\n        return [new midiEvent({\n            ticks: at,\n            code: 0x9,\n            value: [note, intensity]\n        }), new midiEvent({\n            ticks: at >= 0 ? at + duration : -duration,\n            code: 0x9,\n            value: [note, 0]\n        })];\n    }\n    static instrument(at, instrument) {\n        if (instrument < 0 || instrument > 127) {\n            if (midi.autoFix) instrument = mtrk.constrain(instrument, 0, 127);\n            else throw new Error('instrument should be in [0, 127]');\n        }\n        return new midiEvent({\n            ticks: at,\n            code: 0xc,\n            value: [instrument]\n        });\n    }\n    static control(at, id, Value) {\n        return new midiEvent({\n            ticks: at,\n            code: 0xb,\n            value: [id, Value]\n        });\n    }\n    static tempo(at, bpm) {\n        bpm = Math.round(60000000 / bpm);\n        return new midiEvent({\n            ticks: at,\n            code: 0xff51,\n            value: mtrk.number_hex(bpm, 3)\n        });\n    }\n    static time_signature(at, numerator, denominator) {\n        return new midiEvent({\n            ticks: at,\n            code: 0xff58,\n            value: [numerator, Math.floor(Math.log2(denominator)), 0x18, 0x8]\n        });\n    }\n    /**\n     * 切换端口，以实现超过16个音轨\n     * 一般不需要手动调用，在mtrk.export时会自动判断与调用\n     * @param {number} port \n     * @returns {midiEvent}\n     */\n    static port(port = 0) {\n        return new midiEvent({\n            ticks: 0,   // 这种事件一定得发生在第一个\n            code: 0xff21,\n            value: [port]\n        });\n    }\n}\n// 一个音轨\nclass mtrk {\n    // 限制数据范围\n    static constrain(value, min = 0, max = 127) { return Math.min(max, Math.max(min, value)); }\n    /**\n     * 将tick数转换为midi的时间格式\n     * @param {number} ticknum float，但会转换为int\n     * @returns {number[]} midi tick array\n     * @example mtrk.tick_hex(555555) // [0x08, 0x7A, 0x23]\n     */\n    static tick_hex(ticknum) {\n        ticknum = Math.round(ticknum).toString(2);\n        let i = ticknum.length, j = Math.ceil(i / 7) * 7;\n        for (; i < j; i++) ticknum = '0' + ticknum;\n        const t = Array();\n        for (i = 0; i + 7 < j; i = i + 7) t.push('1' + ticknum.substring(i, i + 7));\n        t.push('0' + ticknum.substr(-7, 7));\n        for (i = 0; i < t.length; i++) t[i] = parseInt(t[i], 2);\n        return t;\n    }\n    /**\n     * 将字符串转换为UTF-8数组\n     * @param {string} name string\n     * @param {number} x array's length (default:self-adaption)\n     * @returns {number[]} byte array\n     * @example mtrk.string_hex(\"example\",3) // [101,120,97]\n     */\n    static string_hex(str, maxBytes = -1) {\n        const encoder = new TextEncoder();\n        const bytes = encoder.encode(str);\n        if (maxBytes > 0) {\n            const result = new Array(maxBytes).fill(0);\n            const len = Math.min(maxBytes, bytes.length);\n            for (let i = 0; i < len; i++) result[i] = bytes[i];\n            return result;\n        } return Array.from(bytes);\n    }\n    /**\n     * 将UTF-8数组转换为字符串\n     * @param {Array} bytes byte array\n     * @returns {string}\n     */\n    static hex_string(bytes) {\n        const decoder = new TextDecoder();\n        return decoder.decode(new Uint8Array(bytes));\n    }\n    /**\n     * 将一个正整数按16进制拆分成各个位放在数组中, 最低位在数组最高位\n     * @param {number} num float，但会转换为int\n     * @param {number} x array's length (default:self-adaption)\n     * @returns {number[]}\n     * @example mtrk.number_hex(257,5) // [0,0,0,1,1]\n     */\n    static number_hex(num, x = -1) {\n        num = Math.round(num);\n        if (x > 0) {\n            let Buffer = Array(x).fill(0);\n            for (--x; x >= 0 && num != 0; x--) {\n                Buffer[x] = num & 0xff;\n                num = num >> 8;\n            } return Buffer;\n        } else {\n            let len = 0;\n            let num2 = num;\n            while (num2 != 0) {\n                num2 = num2 >> 8;\n                len++;\n            }\n            let Buffer = Array(len);\n            for (--len; len >= 0; len--) {\n                Buffer[len] = num & 0xff;\n                num = num >> 8;\n            } return Buffer;\n        }\n    }\n    constructor(name = \"\", event_list = Array()) {\n        this.name = name;\n        this.events = event_list;\n        this.last_tick = 0; // 最后一个事件的时间\n    }\n    /**\n     * 向mtrk添加事件 可以传入数组或一个个传递\n     * @param {midiEvent || Object} event {ticks,code,value} 可以是midiEvent对象，也可以是一般对象（会转为midiEvent）\n     * @returns event (or event list, or event list nesting)\n     * @example m.addEvent({ticks:0,code:0x9,value:[40,100]}); m.addEvent(midiEvent.tempo(0,120));\n     */\n    addEvent(event) {\n        if (arguments.length > 1) event = Array.from(arguments);\n        const addevent = (e) => {\n            if (e.ticks < 0) {\n                if (e.ticks == -1)\n                    e.ticks = this.last_tick;\n                else\n                    e.ticks = this.last_tick - e.ticks;\n            }\n            this.events.push(new midiEvent(e));\n            if (e.ticks > this.last_tick)\n                this.last_tick = e.ticks;\n        }\n        const parseEvents = (el) => {\n            if (Array.isArray(el)) {\n                for (let i = 0; i < el.length; i++)\n                    parseEvents(el[i]);\n            } else addevent(el);\n        }\n        parseEvents(event);\n        return event;\n    }\n    /**\n     * 对齐事件\n     * @param {number} tick 一个四分音符的tick数\n     * @param {number} accuracy int, 精度, 越大允许的最短时长越小\n     */\n    align(tick, accuracy = 4) {\n        accuracy = tick / parseInt(accuracy);\n        for (let i = 0; i < this.events.length; i++) {\n            this.events[i].ticks = Math.round(this.events[i].ticks / accuracy) * accuracy;\n        }\n    }\n    /**\n     * 事件按时间排序，同时间的音符事件则按力度排序\n     * 其余同时事件将code大的排在前面\n     */\n    sort() {\n        this.events.sort((a, b) => {\n            if(a.ticks == b.ticks) {\n                if(a.code == b.code && a.code == 9) return a.value[1] - b.value[1];\n                return b.code - a.code;\n            } return a.ticks - b.ticks;\n        });\n    }\n    /**\n     * 将mtrk转换为track_id音轨上的midi数据\n     * @param {number} track_id int, [0, 15]\n     * @returns {number[]} midi binary data array\n     */\n    export(track_id) {\n        this.sort();\n        // 音轨名\n        let data = [];\n        if (this.name.length) {\n            data = mtrk.string_hex(this.name);\n            data = [0, 255, 3, data.length, ...data];\n        }\n        // 多于16轨的支持\n        let channel = track_id % 16;\n        let port = track_id >> 4;\n        if (port > 0) {\n            data.push(...midiEvent.port(port).export(0, 0));\n        }\n        // 事件解析\n        let current = 0;\n        for (let i = 0; i < this.events.length; i++) {\n            let temp = this.events[i];\n            data.push(...temp.export(current, channel));\n            current = Math.round(temp.ticks);   // 避免误差累积 tick_hex用的是round\n        }\n        return [77, 84, 114, 107].concat(\n            mtrk.number_hex(data.length + 4, 4),\n            data,\n            0, 255, 47, 0\n        );\n    }\n\n    /**\n     * 将音轨转为可JSON对象\n     * @param {number} track_id 音轨所属轨道id (从0开始)\n     * @returns {Object} json\n     */\n    JSON(track_id) {\n        this.sort();\n        const Notes = [],\n              controls = [],\n              Instruments = [],\n              Tempos = [],\n              TimeSignatures = [];\n        for (let i = 0; i < this.events.length; i++) {\n            let temp = this.events[i];\n            switch (temp.code) {\n                case 0x9:\n                    if (temp.value[1] > 0) {    // 力度不为0表示按下\n                        let overat = temp.ticks;\n                        for (let j = i + 1; j < this.events.length; j++) {\n                            let over = this.events[j];\n                            if (over.code == 0x9 && over.value[0] == temp.value[0]) {\n                                overat = over.ticks;\n                                if (overat > temp.ticks) {\n                                    Notes.push({\n                                        ticks: temp.ticks,\n                                        durationTicks: overat - temp.ticks,\n                                        midi: temp.value[0],\n                                        intensity: temp.value[1]\n                                    });\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    break;\n                case 0xb:\n                    controls.push({\n                        ticks: temp.ticks,\n                        controller: temp.value[0],\n                        value: temp.value[1]\n                    })\n                    break;\n                case 0xc:\n                    Instruments.push({\n                        ticks: temp.ticks,\n                        number: temp.value[0]\n                    });\n                    break;\n                default:    // 0xffxx\n                    switch (temp.type) {\n                        case 0x51:  // 速度\n                            Tempos.push({\n                                ticks: temp.ticks,\n                                bpm: Math.round(60000000 / ((temp.value[0] << 16) + (temp.value[1] << 8) + temp.value[2]))\n                            });\n                            break;\n                        case 0x58:  // 节拍\n                            TimeSignatures.push({\n                                ticks: temp.ticks,\n                                timeSignature: [temp.value[0], 1 << temp.value[1]]\n                            });\n                            break;\n                    }\n                    break;\n            }\n        }\n        return {\n            channel: track_id,\n            name: this.name,\n            tempos: Tempos,\n            controlChanges: controls,\n            instruments: Instruments,\n            notes: Notes,\n            timeSignatures: TimeSignatures\n        }\n    }\n    toJSON(track_id) {\n        return this.JSON(track_id);\n    }\n}\n\nclass midi {\n    static autoFix = false; // 是否自动修正异常数据；为false会抛出异常\n    /**\n     * midi文件，组织多音轨\n     * @param {number} bpm beats per minute\n     * @param {Array<number>} time_signature [numerator, denominator] 4/4 -> [4,4]\n     * @param {number} tick default 480\n     * @param {Array<mtrk>} Mtrk initial with exist mtrk list\n     * @param {string} Name midi file name\n     */\n    constructor(bpm = 120, time_signature = [4, 4], tick = 480, Mtrk = [], Name = 'untitled') {\n        this.bpm = bpm;\n        this.Mtrk = Mtrk;   // Array<mtrk>\n        this.tick = tick;   // 一个四分音符的tick数\n        this.time_signature = time_signature;\n        this.name = Name;\n    }\n    /**\n     * 添加音轨，如果无参则创建并返回\n     * @param {mtrk} newtrack null则创建新音轨\n     * @param {number} channel_id 指定音轨位置，默认-1表示添加到最后\n     * @returns {mtrk} 新添加的音轨\n     * @example track = m.addTrack(); m2.addTrack(new mtrk(\"test\"))\n     */\n    addTrack(newtrack = null, channel_id = -1) {\n        if (newtrack == null)\n            newtrack = new mtrk(String(this.Mtrk.length));\n        if (channel_id >= 0) {\n            if (channel_id < this.Mtrk.length) this.Mtrk.splice(channel_id, 0, newtrack);\n            else this.Mtrk[channel_id] = newtrack;\n        } else this.Mtrk.push(newtrack);\n        return newtrack;\n    }\n    get tracks() {  // 起个别名\n        return this.Mtrk;\n    }\n    /**\n     * 对齐所有音轨 修改自身\n     * @param {number} accuracy 对齐精度\n     */\n    align(accuracy = 4) {\n        for (let i = 0; i < this.Mtrk.length; i++)\n            this.Mtrk[i].align(this.tick, accuracy);\n    }\n    /**\n     * 解析midi文件，返回新的midi对象\n     * 由于设计时认为同一音轨只操控一个通道，因此对于一个音轨操作多个通道的midi文件会有改动\n     * @param {Uint8Array} midi_file midi数据\n     * @param {boolean} which_main 1则以音轨为主，把同一音轨的通道置为相同；2则通道为主，一个通道一个音轨；0则根据midi类型判断，midi1则音轨为主，midi0则通道为主。最终都是保证一个音轨对应一个通道\n     * @returns new midi object\n     */\n    static import(midi_file, which_main = 0) {\n        // 判断是否为midi文件\n        if (midi_file.length < 14) return null;\n        if (midi_file[0] != 77 || midi_file[1] != 84 || midi_file[2] != 104 || midi_file[3] != 100) return null;\n        let newmidi = new midi(120, [4, 4], 480, [new mtrk('0')], '');  // 第一轨放全局控制事件\n        // 读取文件头\n        newmidi.tick = midi_file[13] + (midi_file[12] << 8);\n        let mtrkNum = midi_file[11] + (midi_file[10] << 8);\n        let midtype = midi_file[9];\n        // 读mtrk音轨\n        for (let n = 0, i = 14; n < mtrkNum; n++) {\n            // 判断是否为MTrk音轨\n            if (midi_file[i++] != 77 || midi_file[i++] != 84 || midi_file[i++] != 114 || midi_file[i++] != 107) { n--; i -= 3; continue; }\n            let timeline = 0;       // 时间线\n            let lastType = 0xC0;\t// 上一个midi事件类型\n            let lastChaneel = n - 1;  // 上一个midi事件通道\n            let mtrklen = (midi_file[i++] << 24) + (midi_file[i++] << 16) + (midi_file[i++] << 8) + midi_file[i++] + i;\n            let midiPort = 0;       // 默认的端口号\n            // 读取事件\n            for (; i < mtrklen; i++) {\n                // 时间间隔(tick)\n                let flag = 0;\n                while (midi_file[i] > 127)\n                    flag = (flag << 7) + midi_file[i++] - 128;\n                timeline += (flag << 7) + midi_file[i++];\n                // 事件类型\n                let type = midi_file[i] & 0xf0;\n                let channel = midi_file[i++] - type;\n                let ichannel = n;\n                switch (which_main) {\n                    case 1:\n                        ichannel = n;\n                        break;\n                    case 2:\n                        ichannel = (midiPort << 4) + channel;\n                        break;\n                    default:\n                        ichannel = (midtype == 0) ? ((midiPort << 4) + channel) : n;\n                        break;\n                }\n                if (!newmidi.Mtrk[ichannel]) newmidi.addTrack(new mtrk(), ichannel);\n                do {\n                    flag = false;\n                    switch (type) { // 结束后指向事件的最后一个字节\n                        case 0x90:\t// 按下音符\n                            newmidi.Mtrk[ichannel].addEvent({\n                                ticks: timeline,\n                                code: 0x9,\n                                value: [midi_file[i++], midi_file[i]]\n                            });\n                            break;\n                        case 0x80:\t// 松开音符\n                            newmidi.Mtrk[ichannel].addEvent({\n                                ticks: timeline,\n                                code: 0x9,\n                                value: [midi_file[i++], 0]\n                            });\n                            break;\n                        case 0xF0:\t// 系统码和其他格式\n                            if (channel == 0xF) {\n                                switch (midi_file[i++]) {\n                                    case 0x2f:\n                                        break;\n                                    case 0x03:\n                                        // 给当前mtrk块同序号的音轨改名\n                                        newmidi.Mtrk[n].name = mtrk.hex_string(midi_file.slice(i + 1, i + 1 + midi_file[i]));\n                                        break;\n                                    case 0x21:\n                                        midiPort = midi_file[i + 1];\n                                        break;\n                                //== 不break，进入default添加事件。所以这后面的都要加`if(timeline == 0)`保证能到default ==//\n                                    case 0x58:\n                                        if (timeline == 0) {\n                                            newmidi.time_signature = [midi_file[i + 1], 1 << midi_file[i + 2]];\n                                            break;\n                                        }\n                                    case 0x51:\n                                        if (timeline == 0) {\n                                            newmidi.bpm = Math.round(60000000 / ((midi_file[i + 1] << 16) + (midi_file[i + 2] << 8) + midi_file[i + 3]));\n                                            break;\n                                        }\n                                    default:    // 没有通道的统一加到第一轨\n                                        newmidi.Mtrk[0].addEvent({\n                                            ticks: timeline,\n                                            code: (0xff << 8) + midi_file[i - 1],\n                                            value: Array.from(midi_file.slice(i + 1, i + 1 + midi_file[i]))\n                                        });\n                                        break;\n                                }\n                            } else {\t// 系统码\n                                newmidi.Mtrk[0].addEvent({\n                                    ticks: timeline,\n                                    code: 0xf0,\n                                    value: Array.from(midi_file.slice(i + 1, i + 1 + midi_file[i]))\n                                });\n                            }\n                            i += midi_file[i];\n                            break;\n                        case 0xB0:\t// 控制器\n                            newmidi.Mtrk[ichannel].addEvent({\n                                ticks: timeline,\n                                code: 0xb,\n                                value: [midi_file[i++], midi_file[i]]\n                            });\n                            break;\n                        case 0xC0:\t// 改变乐器\n                            newmidi.Mtrk[ichannel].addEvent({\n                                ticks: timeline,\n                                code: 0xc,\n                                value: [midi_file[i]]\n                            });\n                            break;\n                        case 0xD0:\t// 触后通道\n                            newmidi.Mtrk[ichannel].addEvent({\n                                ticks: timeline,\n                                code: 0xd,\n                                value: [midi_file[i]]\n                            });\n                            break;\n                        case 0xE0:\t// 滑音\n                            newmidi.Mtrk[ichannel].addEvent({\n                                ticks: timeline,\n                                code: 0xe,\n                                value: [midi_file[i++], midi_file[i]]\n                            });\n                            break;\n                        case 0xA0:\t// 触后音符\n                            newmidi.Mtrk[ichannel].addEvent({\n                                ticks: timeline,\n                                code: 0xa,\n                                value: [midi_file[i++], midi_file[i]]\n                            });\n                            break;\n                        default:\n                            type = lastType;\n                            channel = lastChaneel\n                            flag = true;\n                            i--;\n                            break;\n                    }\n                } while (flag);\n                lastType = type;\n                lastChaneel = channel;\n            }\n        }\n        newmidi.name = newmidi.Mtrk[0].name;\n        // 移除除了第一轨以外的空音轨（没有音符的音轨）\n        for (let i = 1; i < newmidi.Mtrk.length; i++) {\n            let temp = newmidi.Mtrk[i];\n            if (!temp) continue;\n            temp = temp.events;\n            let hasNote = false;\n            for (let j = 0; j < temp.length; j++) {\n                if (temp[j].code == 0x9) {\n                    hasNote = true;\n                    break;\n                }\n            }\n            if (!hasNote) newmidi.Mtrk[i] = void 0;\n        }\n        return newmidi;\n    }\n    /**\n     * 转换为midi数据\n     * @param {number} type midi file type [0 or 1(default)]\n     * @returns {Uint8Array}\n     */\n    export(type = 1) {\n        if (type == 0) {    // midi0创建 由于事件不记录音轨，需要归并排序输出\n            let Mtrks = Array(this.Mtrk.length + 1);\n            for (let i = 0; i < this.Mtrk.length; i++) {\n                this.Mtrk[i].sort();\n                Mtrks[i] = this.Mtrk[i].events;\n            }\n            Mtrks[this.Mtrk.length] = new mtrk(\"head\", [\n                midiEvent.tempo(0, this.bpm),\n                midiEvent.time_signature(0, this.time_signature[0], this.time_signature[1])\n            ]);\n            let current = 0;\n            let index = Array(Mtrks.length).fill(0);\n            let data = [];\n            while (true) {\n                // 找到ticks最小项\n                let min = -1;\n                let minticks = 0;\n                for (let i = 0; i < index.length; i++) {\n                    if (index[i] < Mtrks[i].length) {\n                        if (min == -1 || Mtrks[i][index[i]].ticks < minticks) {\n                            min = i;\n                            minticks = Mtrks[i][index[i]].ticks;\n                        }\n                    }\n                }\n                if (min == -1) break;\n                // 转为midi数据\n                let d = null;\n                let temp = Mtrks[min][index[min]];\n                if (temp.code >= 0xf0) {\n                    if (temp.code == 0xf0) d = [0xf0, temp.value.length];\n                    else d = [0xff, temp.type, temp.value.length];\n                } else d = (temp.code << 4) + min;\n                data = data.concat(mtrk.tick_hex(temp.ticks - current), d, temp.value);\n                // 善后\n                current = minticks;\n                index[min]++;\n            }\n            data = [0, 255, 3, 5, 109, 105, 100, 105, 48, ...data, 0, 255, 47, 0];  // 加了音轨名和结尾\n            return new Uint8Array([\n                77, 84, 104, 100, 0, 0, 0, 6, 0, 0, 0, 1, ...mtrk.number_hex(this.tick, 2),\n                77, 84, 114, 107,\n                ...mtrk.number_hex(data.length, 4),\n                ...data\n            ]);\n        } else {    // 除了初始速度、初始节拍，其余ff事件全放0音轨。头音轨不在Mtrk中，export时生成\n            // MThd创建\n            const data = [\n                [77, 84, 104, 100, 0, 0, 0, 6, 0, 1],\n                undefined,  // 通道数 之后再填，因为数组可能空洞\n                mtrk.number_hex(this.tick, 2)\n            ];\n            // 加入全局音轨\n            let headMtrk = new mtrk(\"head\", [\n                midiEvent.tempo(0, this.bpm),\n                midiEvent.time_signature(0, this.time_signature[0], this.time_signature[1])\n            ]);\n            data.push(headMtrk.export(0));\n            // 加入其余音轨\n            let realChannelNum = 1;\n            for (let i = 0; i < this.Mtrk.length; i++) {\n                if (this.Mtrk[i]) {\n                    data.push(this.Mtrk[i].export(i));\n                    realChannelNum++;\n                }\n            }\n            data[1] = mtrk.number_hex(realChannelNum, 2);\n            return new Uint8Array([].concat(...data));\n        }\n    }\n\n    /**\n     * 将midi转换为json对象。原理：每个音轨转换为json对象并对事件进行合并\n     * @returns {Object} json\n     */\n    JSON() {\n        let j = {\n            header: {\n                name: this.name,\n                tick: this.tick,\n                tempos: [{\n                    ticks: 0,\n                    bpm: this.bpm\n                }],\n                timeSignatures: [{\n                    ticks: 0,\n                    timeSignature: this.time_signature\n                }]\n            },\n            tracks: []\n        }\n        for (let i = 0; i < this.Mtrk.length; i++) {\n            if (!this.Mtrk[i]) continue;\n            let t = this.Mtrk[i].JSON(i);\n            j.header.tempos = j.header.tempos.concat(t.tempos);\n            j.header.timeSignatures = j.header.timeSignatures.concat(t.timeSignatures);\n            j.tracks.push({\n                channel: t.channel,\n                name: t.name,\n                controlChanges: t.controlChanges,\n                instruments: t.instruments,\n                notes: t.notes\n            });\n        }\n        return j;\n    }\n    toJSON() {\n        return this.JSON();\n    }\n}"
  },
  {
    "path": "lib/saver.js",
    "content": "/* 示例\nfunction save() {\n    let B = bSaver.Float32Mat2Buffer(b);\n    let A = bSaver.Object2Buffer(a);\n    bSaver.saveArrayBuffer(bSaver.combineArrayBuffers(\n        [B, A]\n    ), \"test.nd\");\n}\nvar result;\nfunction parse() {\n    let input = document.createElement(\"input\");\n    input.type = \"file\";\n    input.onchange = function() {\n        let file = input.files[0];\n        bSaver.readBinary(file, (arrayBuffer)=>{\n            let [B, o] = bSaver.Buffer2Float32Mat(arrayBuffer, 0);\n            let [A, o2] = bSaver.Buffer2Object(arrayBuffer, o);\n            result = [A,B];\n            console.log(result);\n        })\n    } input.click();\n}\n*/\n// 保存和读取二进制数据的工具\n// 每个数据段开头会有Uint32(可能多个)的长度信息, 用于保存该数据段的长度\nwindow.bSaver = {\n    /**\n     * 将二维的Float32Array的Array转为可解析的一维ArrayBuffer\n     * 要求每个Float32Array的长度相同\n     * @param {Array<Float32Array>} Float32Mat 支持仅有length的对象\n     * @returns {ArrayBuffer} 二进制数组 开头有两个Uint32的长度信息, 用于保存每个Float32Array的长度和Float32Mat的长度\n     */\n    Float32Mat2Buffer(Float32Mat) {\n        // 先保存两个维度的长度: 每个Float32Array的长度和Float32Mat的长度\n        const lengthArray = new Uint32Array([Float32Mat[0]?.length ?? 0, Float32Mat.length]);\n        let bn = Float32Mat[0]?.byteLength ?? 0;\n        if (bn === 0) return lengthArray.buffer;\n        let offset = lengthArray.byteLength;\n        const finalArrayBuffer = new ArrayBuffer(offset + bn * Float32Mat.length);\n        new Uint32Array(finalArrayBuffer, 0, 2).set(lengthArray);\n        // 再将每个Float32Array的数据拷贝到finalArrayBuffer中\n        for (const floatArray of Float32Mat) {\n            new Float32Array(finalArrayBuffer, offset).set(floatArray);\n            offset += bn;\n        } return finalArrayBuffer;\n    },\n    /**\n     * 解析Float32Mat2Buffer得到的二进制数组为二维的Float32Array的Array\n     * @param {ArrayBuffer} arrayBuffer 待解析的二进制数组\n     * @param {number} offset 读取的byte偏移量\n     * @returns {[Array<Float32Array>, Number]} 解析后的二维Float32Array数组和读取结束后的byte偏移量\n     */\n    Buffer2Float32Mat(arrayBuffer, offset = 0) {\n        offset = Math.ceil(offset / 4) << 2;    // offset变为4的倍数\n        let lengthArray = new Uint32Array(arrayBuffer, offset, 2);\n        offset += lengthArray.byteLength;\n        let [n, N] = lengthArray;\n        const Float32Mat = new Array(N);\n        if (n === 0) return [Float32Mat, offset];\n        const mergedFloatArray = Float32Mat.raw = new Float32Array(arrayBuffer, offset, n * N);\n        for (let i = 0, j = 0; i < N; i++, j += n) {\n            Float32Mat[i] = mergedFloatArray.subarray(j, j + n);\n        } return [Float32Mat, offset + mergedFloatArray.byteLength];\n    },\n    /**\n     * 将字符串转为可解析的二进制数组\n     * @param {string} str 字符串\n     * @returns {ArrayBuffer} 二进制数组 开头有一个Uint32的长度信息记录BinaryData的长度\n     */\n    String2Buffer(str) {\n        const jsonBinaryData = new TextEncoder().encode(str);\n        // 用一个Uint32Array保存jsonBinaryData的长度\n        const lengthArray = new Uint32Array([jsonBinaryData.byteLength]);\n        const finalArrayBuffer = new ArrayBuffer(lengthArray.byteLength + jsonBinaryData.byteLength);\n        new Uint32Array(finalArrayBuffer, 0, 1).set(lengthArray);\n        new Uint8Array(finalArrayBuffer, lengthArray.byteLength).set(new Uint8Array(jsonBinaryData));\n        return finalArrayBuffer;\n    },\n    /**\n     * 解析String2Buffer得到的二进制数组为字符串\n     * @param {ArrayBuffer} arrayBuffer 待解析的二进制数组\n     * @param {number} offset 读取的byte偏移量\n     * @returns {[String, Number]} 解析后的对象和读取结束后的byte偏移量\n     */\n    Buffer2String(arrayBuffer, offset = 0) {\n        offset = Math.ceil(offset / 4) << 2;    // offset变为4的倍数\n        const lengthArray = new Uint32Array(arrayBuffer, offset, 1);\n        offset += lengthArray.byteLength;\n        const strBinaryData = new Uint8Array(arrayBuffer, offset, lengthArray[0]);\n        const str = new TextDecoder().decode(strBinaryData);\n        return [str, offset + strBinaryData.byteLength];\n    },\n    /**\n     * 将一个可以被JSON.stringify的对象转为可解析的二进制数组\n     * @param {Object} obj 可以被JSON.stringify的对象\n     * @returns {ArrayBuffer} 二进制数组 开头有一个Uint32的长度信息记录jsonBinaryData的长度\n     */\n    Object2Buffer(obj) {\n        return this.String2Buffer(JSON.stringify(obj));\n    },\n    /**\n     * 解析Object2Buffer得到的二进制数组为一个可以被JSON.stringify的对象\n     * @param {ArrayBuffer} arrayBuffer 待解析的二进制数组\n     * @param {number} offset 读取的byte偏移量\n     * @returns {[Object, Number]} 解析后的对象和读取结束后的byte偏移量\n     */\n    Buffer2Object(arrayBuffer, offset = 0) {\n        let [jsonString, o] = this.Buffer2String(arrayBuffer, offset);\n        return [JSON.parse(jsonString), o];\n    },\n    /**\n     * 合并多个ArrayBuffer为一个ArrayBuffer\n     * 会按4byte对齐每一个ArrayBuffer的起始位置\n     * @param {Array<ArrayBuffer>} arrayBuffers ArrayBuffer的数组\n     * @returns {ArrayBuffer} 合并后的ArrayBuffer\n     */\n    combineArrayBuffers(arrayBuffers) {\n        let totalByteLength = 0;\n        const lengthArray = arrayBuffers.map((arrayBuffer) => {\n            // 用4字节对齐，因为开头是Uint32的长度信息: start offset of Uint32Array should be a multiple of 4\n            let len4 = Math.ceil(arrayBuffer.byteLength / 4) << 2;\n            totalByteLength += len4;\n            return len4;\n        });\n        const combinedArrayBuffer = new ArrayBuffer(totalByteLength);\n        for(let i = 0, offset = 0; i < arrayBuffers.length; i++) {\n            new Uint8Array(combinedArrayBuffer, offset).set(new Uint8Array(arrayBuffers[i]));\n            offset += lengthArray[i];\n        } return combinedArrayBuffer;\n    },\n    /**\n     * 将二进制数组保存为文件\n     * @param {ArrayBuffer} arrayBuffer 待保存的二进制数组\n     * @param {string} filename 保存的文件名\n     */\n    saveArrayBuffer(arrayBuffer, filename) {\n        // 创建一个 Blob 对象，将合并后的 ArrayBuffer 保存为二进制文件\n        const blob = new Blob([arrayBuffer], { type: 'application/octet-stream' });\n        // 创建一个临时 URL，用于下载文件\n        const downloadUrl = URL.createObjectURL(blob);\n        // 创建一个虚拟的下载链接并触发点击事件\n        const downloadLink = document.createElement('a');\n        downloadLink.href = downloadUrl;\n        downloadLink.download = filename;\n        downloadLink.click();\n        // 释放临时 URL 对象\n        URL.revokeObjectURL(downloadUrl);\n    },\n    // 读取文件为ArrayBuffer\n    readBinary(file, callback) {\n        const fileReader = new FileReader();\n        fileReader.onload = (e) => {\n            callback(e.target.result);\n        }; fileReader.readAsArrayBuffer(file);\n    }\n};"
  },
  {
    "path": "lib/snapshot.js",
    "content": "// 基于快照的撤销重做数据结构\n// 为了不改变数组大小减小开销，使用循环队列\nclass Snapshot extends Array {\n    /**\n     * 新建快照栈\n     * @param {number} maxLen 快照历史数\n     * @param {*} iniState 初始状态\n     */\n    constructor(maxLen, iniState = '') {\n        super(maxLen);\n        // 模型位置 从1开始计数\n        this.now = 1;\n        this.size = 1;\n        this[0] = iniState;\n        // 实际位置\n        this.pointer = 0;\n    }\n    /**\n     * 增加快照。在当前时间点上延展新的分支，并抛弃老的分支\n     * @param {*} snapshot 快照 建议是JSON字符串\n     */\n    add(snapshot) {\n        if (this.now < this.length) this.size = ++this.now; // 没满\n        this.pointer = (this.pointer + 1) % this.length;    // 目标位置，直接覆盖\n        this[this.pointer] = snapshot;\n    }\n    /**\n     * 回到上一个快照状态，相当于撤销\n     * @returns 上一刻的快照。如果无法回退则返回null\n     */\n    undo() {\n        if (this.now <= 1) return null;\n        this.now--;\n        this.pointer = (this.pointer + this.length - 1) % this.length;\n        return this[this.pointer];\n    }\n    /**\n     * 重新回到下一个状态，相当于重做\n     * @returns 下一刻的快照。如果下一状态则返回null\n     */\n    redo() {\n        if (this.now >= this.size) return null;\n        this.now++;\n        this.pointer = (this.pointer + 1) % this.length;\n        return this[this.pointer];\n    }\n    /**\n     * 查看上一个快照状态，相当于撤销但不改变当前状态\n     * @returns 上一个状态的快照。如果无法回退则返回null\n     */\n    lastState() {\n        if (this.now <= 1) return null;\n        return this[(this.pointer + this.length - 1) % this.length];\n    }\n    /**\n     * 查看下一个快照状态，相当于重做但不改变当前状态\n     * @returns 下一个状态的快照。如果下一状态则返回null\n     */\n    nextState() {\n        if (this.now >= this.size) return null;\n        return this[(this.pointer + 1) % this.length]; \n    }\n    nowState() {\n        return this[this.pointer];\n    }\n}"
  },
  {
    "path": "lib/tinySynth.js",
    "content": "// 是https://github.com/g200kg/webaudio-tinysynth的精简版\nclass TinySynth {\n    static soundFont = {};    // 最终是填补了默认值的TinySynth.wave\n    static defaultWave = { g: 0, w: \"sine\", t: 1, f: 0, v: 0.5, a: 0, h: 0.01, d: 0.01, s: 0, r: 0.05, p: 1, q: 1, k: 0 };\n    static instrument = [\n/* 1-8 : Piano */\t\"Acoustic Grand Piano\", \"Bright Acoustic Piano\", \"Electric Grand Piano\", \"Honky-tonk Piano\", \"Electric Piano 1\", \"Electric Piano 2\", \"Harpsichord\", \"Clavi\",\n/* 9-16 : Chromatic Perc */\t\"Celesta\", \"Glockenspiel\", \"Music Box\", \"Vibraphone\", \"Marimba\", \"Xylophone\", \"Tubular Bells\", \"Dulcimer\",\n/* 17-24 : Organ */\t\"Drawbar Organ\", \"Percussive Organ\", \"Rock Organ\", \"Church Organ\", \"Reed Organ\", \"Accordion\", \"Harmonica\", \"Tango Accordion\",\n/* 25-32 : Guitar */\t\"Acoustic Guitar (nylon)\", \"Acoustic Guitar (steel)\", \"Electric Guitar (jazz)\", \"Electric Guitar (clean)\", \"Electric Guitar (muted)\", \"Overdriven Guitar\", \"Distortion Guitar\", \"Guitar harmonics\",\n/* 33-40 : Bass */\t\"Acoustic Bass\", \"Electric Bass (finger)\", \"Electric Bass (pick)\", \"Fretless Bass\", \"Slap Bass 1\", \"Slap Bass 2\", \"Synth Bass 1\", \"Synth Bass 2\",\n/* 41-48 : Strings */\t\"Violin\", \"Viola\", \"Cello\", \"Contrabass\", \"Tremolo Strings\", \"Pizzicato Strings\", \"Orchestral Harp\", \"Timpani\",\n/* 49-56 : Ensamble */\t\"String Ensemble 1\", \"String Ensemble 2\", \"SynthStrings 1\", \"SynthStrings 2\", \"Choir Aahs\", \"Voice Oohs\", \"Synth Voice\", \"Orchestra Hit\",\n/* 57-64 : Brass */\t\"Trumpet\", \"Trombone\", \"Tuba\", \"Muted Trumpet\", \"French Horn\", \"Brass Section\", \"SynthBrass 1\", \"SynthBrass 2\",\n/* 65-72 : Reed */\t\"Soprano Sax\", \"Alto Sax\", \"Tenor Sax\", \"Baritone Sax\", \"Oboe\", \"English Horn\", \"Bassoon\", \"Clarinet\",\n/* 73-80 : Pipe */\t\"Piccolo\", \"Flute\", \"Recorder\", \"Pan Flute\", \"Blown Bottle\", \"Shakuhachi\", \"Whistle\", \"Ocarina\",\n/* 81-88 : SynthLead */\t\"Lead 1 (square)\", \"Lead 2 (sawtooth)\", \"Lead 3 (calliope)\", \"Lead 4 (chiff)\", \"Lead 5 (charang)\", \"Lead 6 (voice)\", \"Lead 7 (fifths)\", \"Lead 8 (bass + lead)\",\n/* 89-96 : SynthPad */\t\"Pad 1 (new age)\", \"Pad 2 (warm)\", \"Pad 3 (polysynth)\", \"Pad 4 (choir)\", \"Pad 5 (bowed)\", \"Pad 6 (metallic)\", \"Pad 7 (halo)\", \"Pad 8 (sweep)\",\n/* 97-104 : FX */\t\"FX 1 (rain)\", \"FX 2 (soundtrack)\", \"FX 3 (crystal)\", \"FX 4 (atmosphere)\", \"FX 5 (brightness)\", \"FX 6 (goblins)\", \"FX 7 (echoes)\", \"FX 8 (sci-fi)\",\n/* 105-112 : Ethnic */\t\"Sitar\", \"Banjo\", \"Shamisen\", \"Koto\", \"Kalimba\", \"Bag pipe\", \"Fiddle\", \"Shanai\",\n/* 113-120 : Percussive */\t\"Tinkle Bell\", \"Agogo\", \"Steel Drums\", \"Woodblock\", \"Taiko Drum\", \"Melodic Tom\", \"Synth Drum\", \"Reverse Cymbal\",\n/* 121-128 : SE */\t\"Guitar Fret Noise\", \"Breath Noise\", \"Seashore\", \"Bird Tweet\", \"Telephone Ring\", \"Helicopter\", \"Applause\", \"Gunshot\",\n    ];\n    static wave = [\n        /* 1-8 : Piano */\n        [{ w: \"sine\", v: .4, d: 0.7, r: 0.1 }, { w: \"triangle\", v: 3, d: 0.7, s: 0.1, g: 1, a: 0.01, k: -1.2 }],\n        [{ w: \"triangle\", v: 0.4, d: 0.7, r: 0.1 }, { w: \"triangle\", v: 4, t: 3, d: 0.4, s: 0.1, g: 1, k: -1, a: 0.01 }],\n        [{ w: \"sine\", d: 0.7, r: 0.1 }, { w: \"triangle\", v: 4, f: 2, d: 0.5, s: 0.5, g: 1, k: -1 }],\n        [{ w: \"sine\", d: 0.7, v: 0.2 }, { w: \"triangle\", v: 4, t: 3, f: 2, d: 0.3, g: 1, k: -1, a: 0.01, s: 0.5 }],\n        [{ w: \"sine\", v: 0.35, d: 0.7 }, { w: \"sine\", v: 3, t: 7, f: 1, d: 1, s: 1, g: 1, k: -.7 }],\n        [{ w: \"sine\", v: 0.35, d: 0.7 }, { w: \"sine\", v: 8, t: 7, f: 1, d: 0.5, s: 1, g: 1, k: -.7 }],\n        [{ w: \"sawtooth\", v: 0.34, d: 2 }, { w: \"sine\", v: 8, f: 0.1, d: 2, s: 1, r: 2, g: 1 }],\n        [{ w: \"triangle\", v: 0.34, d: 1.5 }, { w: \"square\", v: 6, f: 0.1, d: 1.5, s: 0.5, r: 2, g: 1 }],\n        /* 9-16 : Chromatic Perc*/\n        [{ w: \"sine\", d: 0.3, r: 0.3 }, { w: \"sine\", v: 7, t: 11, d: 0.03, g: 1 }],\n        [{ w: \"sine\", d: 0.3, r: 0.3 }, { w: \"sine\", v: 11, t: 6, d: 0.2, s: 0.4, g: 1 }],\n        [{ w: \"sine\", v: 0.2, d: 0.3, r: 0.3 }, { w: \"sine\", v: 11, t: 5, d: 0.1, s: 0.4, g: 1 }],\n        [{ w: \"sine\", v: 0.2, d: 0.6, r: 0.6 }, { w: \"triangle\", v: 11, t: 5, f: 1, s: 0.5, g: 1 }],\n        [{ w: \"sine\", v: 0.3, d: 0.2, r: 0.2 }, { w: \"sine\", v: 6, t: 5, d: 0.02, g: 1 }],\n        [{ w: \"sine\", v: 0.3, d: 0.2, r: 0.2 }, { w: \"sine\", v: 7, t: 11, d: 0.03, g: 1 }],\n        [{ w: \"sine\", v: 0.2, d: 1, r: 1 }, { w: \"sine\", v: 11, t: 3.5, d: 1, r: 1, g: 1 }],\n        [{ w: \"triangle\", v: 0.2, d: 0.5, r: 0.2 }, { w: \"sine\", v: 6, t: 2.5, d: 0.2, s: 0.1, r: 0.2, g: 1 }],\n        /* 17-24 : Organ */\n        [{ w: \"w9999\", v: 0.22, s: 0.9 }, { w: \"w9999\", v: 0.22, t: 2, f: 2, s: 0.9 }],\n        [{ w: \"w9999\", v: 0.2, s: 1 }, { w: \"sine\", v: 11, t: 6, f: 2, s: 0.1, g: 1, h: 0.006, r: 0.002, d: 0.002 }, { w: \"w9999\", v: 0.2, t: 2, f: 1, h: 0, s: 1 }],\n        [{ w: \"w9999\", v: 0.2, d: 0.1, s: 0.9 }, { w: \"w9999\", v: 0.25, t: 4, f: 2, s: 0.5 }],\n        [{ w: \"w9999\", v: 0.3, a: 0.04, s: 0.9 }, { w: \"w9999\", v: 0.2, t: 8, f: 2, a: 0.04, s: 0.9 }],\n        [{ w: \"sine\", v: 0.2, a: 0.02, d: 0.05, s: 1 }, { w: \"sine\", v: 6, t: 3, f: 1, a: 0.02, d: 0.05, s: 1, g: 1 }],\n        [{ w: \"triangle\", v: 0.2, a: 0.02, d: 0.05, s: 0.8 }, { w: \"square\", v: 7, t: 3, f: 1, d: 0.05, s: 1.5, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 0.2, s: 0.5 }, { w: \"square\", v: 1, d: 0.03, s: 2, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 0.1, s: 0.8 }, { w: \"square\", v: 1, a: 0.3, d: 0.1, s: 2, g: 1 }],\n        /* 25-32 : Guitar */\n        [{ w: \"sine\", v: 0.3, d: 0.5, f: 1 }, { w: \"triangle\", v: 5, t: 3, f: -1, d: 1, s: 0.1, g: 1 }],\n        [{ w: \"sine\", v: 0.4, d: 0.6, f: 1 }, { w: \"triangle\", v: 12, t: 3, d: 0.6, s: 0.1, g: 1, f: -1 }],\n        [{ w: \"triangle\", v: 0.3, d: 1, f: 1 }, { w: \"triangle\", v: 6, f: -1, d: 0.4, s: 0.5, g: 1, t: 3 }],\n        [{ w: \"sine\", v: 0.3, d: 1, f: -1 }, { w: \"triangle\", v: 11, f: 1, d: 0.4, s: 0.5, g: 1, t: 3 }],\n        [{ w: \"sine\", v: 0.4, d: 0.1, r: 0.01 }, { w: \"sine\", v: 7, g: 1 }],\n        [{ w: \"triangle\", v: 0.4, d: 1, f: 1 }, { w: \"square\", v: 4, f: -1, d: 1, s: 0.7, g: 1 }],//[{w:\"triangle\",v:0.35,d:1,f:1,},{w:\"square\",v:7,f:-1,d:0.3,s:0.5,g:1,}],\n        [{ w: \"triangle\", v: 0.35, d: 1, f: 1 }, { w: \"square\", v: 7, f: -1, d: 0.3, s: 0.5, g: 1 }],//[{w:\"triangle\",v:0.4,d:1,f:1,},{w:\"square\",v:4,f:-1,d:1,s:0.7,g:1,}],//[{w:\"triangle\",v:0.4,d:1,},{w:\"square\",v:4,f:2,d:1,s:0.7,g:1,}],\n        [{ w: \"sine\", v: 0.2, t: 1.5, a: 0.005, h: 0.2, d: 0.6 }, { w: \"sine\", v: 11, t: 5, f: 2, d: 1, s: 0.5, g: 1 }],\n        /* 33-40 : Bass */\n        [{ w: \"sine\", d: 0.3 }, { w: \"sine\", v: 4, t: 3, d: 1, s: 1, g: 1 }],\n        [{ w: \"sine\", d: 0.3 }, { w: \"sine\", v: 4, t: 3, d: 1, s: 1, g: 1 }],\n        [{ w: \"w9999\", d: 0.3, v: 0.7, s: 0.5 }, { w: \"sawtooth\", v: 1.2, d: 0.02, s: 0.5, g: 1, h: 0, r: 0.02 }],\n        [{ w: \"sine\", d: 0.3 }, { w: \"sine\", v: 4, t: 3, d: 1, s: 1, g: 1 }],\n        [{ w: \"triangle\", v: 0.3, t: 2, d: 1 }, { w: \"triangle\", v: 15, t: 2.5, d: 0.04, s: 0.1, g: 1 }],\n        [{ w: \"triangle\", v: 0.3, t: 2, d: 1 }, { w: \"triangle\", v: 15, t: 2.5, d: 0.04, s: 0.1, g: 1 }],\n        [{ w: \"triangle\", d: 0.7 }, { w: \"square\", v: 0.4, t: 0.5, f: 1, d: 0.2, s: 10, g: 1 }],\n        [{ w: \"triangle\", d: 0.7 }, { w: \"square\", v: 0.4, t: 0.5, f: 1, d: 0.2, s: 10, g: 1 }],\n        /* 41-48 : Strings */\n        [{ w: \"sawtooth\", v: 0.4, a: 0.1, d: 11 }, { w: \"sine\", v: 5, d: 11, s: 0.2, g: 1 }],\n        [{ w: \"sawtooth\", v: 0.4, a: 0.1, d: 11 }, { w: \"sine\", v: 5, d: 11, s: 0.2, g: 1 }],\n        [{ w: \"sawtooth\", v: 0.4, a: 0.1, d: 11 }, { w: \"sine\", v: 5, t: 0.5, d: 11, s: 0.2, g: 1 }],\n        [{ w: \"sawtooth\", v: 0.4, a: 0.1, d: 11 }, { w: \"sine\", v: 5, t: 0.5, d: 11, s: 0.2, g: 1 }],\n        [{ w: \"sine\", v: 0.4, a: 0.1, d: 11 }, { w: \"sine\", v: 6, f: 2.5, d: 0.05, s: 1.1, g: 1 }],\n        [{ w: \"sine\", v: 0.3, d: 0.1, r: 0.1 }, { w: \"square\", v: 4, t: 3, d: 1, s: 0.2, g: 1 }],\n        [{ w: \"sine\", v: 0.3, d: 0.5, r: 0.5 }, { w: \"sine\", v: 7, t: 2, f: 2, d: 1, r: 1, g: 1 }],\n        [{ w: \"triangle\", v: 0.6, h: 0.03, d: 0.3, r: 0.3, t: 0.5 }, { w: \"n0\", v: 8, t: 1.5, d: 0.08, r: 0.08, g: 1 }],\n        /* 49-56 : Ensamble */\n        [{ w: \"sawtooth\", v: 0.3, a: 0.03, s: 0.5 }, { w: \"sawtooth\", v: 0.2, t: 2, f: 2, d: 1, s: 2 }],\n        [{ w: \"sawtooth\", v: 0.3, f: -2, a: 0.03, s: 0.5 }, { w: \"sawtooth\", v: 0.2, t: 2, f: 2, d: 1, s: 2 }],\n        [{ w: \"sawtooth\", v: 0.2, a: 0.02, s: 1 }, { w: \"sawtooth\", v: 0.2, t: 2, f: 2, a: 1, d: 1, s: 1 }],\n        [{ w: \"sawtooth\", v: 0.2, a: 0.02, s: 1 }, { w: \"sawtooth\", v: 0.2, f: 2, a: 0.02, d: 1, s: 1 }],\n        [{ w: \"triangle\", v: 0.3, a: 0.03, s: 1 }, { w: \"sine\", v: 3, t: 5, f: 1, d: 1, s: 1, g: 1 }],\n        [{ w: \"sine\", v: 0.4, a: 0.03, s: 0.9 }, { w: \"sine\", v: 1, t: 2, f: 3, d: 0.03, s: 0.2, g: 1 }],\n        [{ w: \"triangle\", v: 0.6, a: 0.05, s: 0.5 }, { w: \"sine\", v: 1, f: 0.8, d: 0.2, s: 0.2, g: 1 }],\n        [{ w: \"square\", v: 0.15, a: 0.01, d: 0.2, r: 0.2, t: 0.5, h: 0.03 }, { w: \"square\", v: 4, f: 0.5, d: 0.2, r: 11, a: 0.01, g: 1, h: 0.02 }, { w: \"square\", v: 0.15, t: 4, f: 1, a: 0.02, d: 0.15, r: 0.15, h: 0.03 }, { g: 3, w: \"square\", v: 4, f: -0.5, a: 0.01, h: 0.02, d: 0.15, r: 11 }],\n        /* 57-64 : Brass */\n        [{ w: \"square\", v: 0.2, a: 0.01, d: 1, s: 0.6, r: 0.04 }, { w: \"sine\", v: 1, d: 0.1, s: 4, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 1, s: 0.5, r: 0.08 }, { w: \"sine\", v: 1, d: 0.1, s: 4, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.04, d: 1, s: 0.4, r: 0.08 }, { w: \"sine\", v: 1, d: 0.1, s: 4, g: 1 }],\n        [{ w: \"square\", v: 0.15, a: 0.04, s: 1 }, { w: \"sine\", v: 2, d: 0.1, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 1, s: 0.5, r: 0.08 }, { w: \"sine\", v: 1, d: 0.1, s: 4, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 1, s: 0.6, r: 0.08 }, { w: \"sine\", v: 1, f: 0.2, d: 0.1, s: 4, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 0.5, s: 0.7, r: 0.08 }, { w: \"sine\", v: 1, d: 0.1, s: 4, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 1, s: 0.5, r: 0.08 }, { w: \"sine\", v: 1, d: 0.1, s: 4, g: 1 }],\n        /* 65-72 : Reed */\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 2, s: 0.6 }, { w: \"sine\", v: 2, d: 1, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 2, s: 0.6 }, { w: \"sine\", v: 2, d: 1, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 1, s: 0.6 }, { w: \"sine\", v: 2, d: 1, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.02, d: 1, s: 0.6 }, { w: \"sine\", v: 2, d: 1, g: 1 }],\n        [{ w: \"sine\", v: 0.4, a: 0.02, d: 0.7, s: 0.5 }, { w: \"square\", v: 5, t: 2, d: 0.2, s: 0.5, g: 1 }],\n        [{ w: \"sine\", v: 0.3, a: 0.05, d: 0.2, s: 0.8 }, { w: \"sawtooth\", v: 6, f: 0.1, d: 0.1, s: 0.3, g: 1 }],\n        [{ w: \"sine\", v: 0.3, a: 0.03, d: 0.2, s: 0.4 }, { w: \"square\", v: 7, f: 0.2, d: 1, s: 0.1, g: 1 }],\n        [{ w: \"square\", v: 0.2, a: 0.05, d: 0.1, s: 0.8 }, { w: \"square\", v: 4, d: 0.1, s: 1.1, g: 1 }],\n        /* 73-80 : Pipe */\n        [{ w: \"sine\", a: 0.02, d: 2 }, { w: \"sine\", v: 6, t: 2, d: 0.04, g: 1 }],\n        [{ w: \"sine\", v: 0.7, a: 0.03, d: 0.4, s: 0.4 }, { w: \"sine\", v: 4, t: 2, f: 0.2, d: 0.4, g: 1 }],\n        [{ w: \"sine\", v: 0.7, a: 0.02, d: 0.4, s: 0.6 }, { w: \"sine\", v: 3, t: 2, d: 0, s: 1, g: 1 }],\n        [{ w: \"sine\", v: 0.4, a: 0.06, d: 0.3, s: 0.3 }, { w: \"sine\", v: 7, t: 2, d: 0.2, s: 0.2, g: 1 }],\n        [{ w: \"sine\", a: 0.02, d: 0.3, s: 0.3 }, { w: \"sawtooth\", v: 3, t: 2, d: 0.3, g: 1 }],\n        [{ w: \"sine\", v: 0.4, a: 0.02, d: 2, s: 0.1 }, { w: \"sawtooth\", v: 8, t: 2, f: 1, d: 0.5, g: 1 }],\n        [{ w: \"sine\", v: 0.7, a: 0.03, d: 0.5, s: 0.3 }, { w: \"sine\", v: 0.003, t: 0, f: 4, d: 0.1, s: 0.002, g: 1 }],\n        [{ w: \"sine\", v: 0.7, a: 0.02, d: 2 }, { w: \"sine\", v: 1, t: 2, f: 1, d: 0.02, g: 1 }],\n        /* 81-88 : SynthLead */\n        [{ w: \"square\", v: 0.3, d: 1, s: 0.5 }, { w: \"square\", v: 1, f: 0.2, d: 1, s: 0.5, g: 1 }],\n        [{ w: \"sawtooth\", v: 0.3, d: 2, s: 0.5 }, { w: \"square\", v: 2, f: 0.1, s: 0.5, g: 1 }],\n        [{ w: \"triangle\", v: 0.5, a: 0.05, d: 2, s: 0.6 }, { w: \"sine\", v: 4, t: 2, g: 1 }],\n        [{ w: \"triangle\", v: 0.3, a: 0.01, d: 2, s: 0.3 }, { w: \"sine\", v: 22, t: 2, f: 1, d: 0.03, s: 0.2, g: 1 }],\n        [{ w: \"sawtooth\", v: 0.3, d: 1, s: 0.5 }, { w: \"sine\", v: 11, t: 11, a: 0.2, d: 0.05, s: 0.3, g: 1 }],\n        [{ w: \"sine\", v: 0.3, a: 0.06, d: 1, s: 0.5 }, { w: \"sine\", v: 7, f: 1, d: 1, s: 0.2, g: 1 }],\n        [{ w: \"sawtooth\", v: 0.3, a: 0.03, d: 0.7, s: 0.3, r: 0.2 }, { w: \"sawtooth\", v: 0.3, t: 0.75, d: 0.7, a: 0.1, s: 0.3, r: 0.2 }],\n        [{ w: \"triangle\", v: 0.3, a: 0.01, d: 0.7, s: 0.5 }, { w: \"square\", v: 5, t: 0.5, d: 0.7, s: 0.5, g: 1 }],\n        /* 89-96 : SynthPad */\n        [{ w: \"triangle\", v: 0.3, a: 0.02, d: 0.3, s: 0.3, r: 0.3 }, { w: \"square\", v: 3, t: 4, f: 1, a: 0.02, d: 0.1, s: 1, g: 1 }, { w: \"triangle\", v: 0.08, t: 0.5, a: 0.1, h: 0, d: 0.1, s: 0.5, r: 0.1, b: 0, c: 0 }],\n        [{ w: \"sine\", v: 0.3, a: 0.05, d: 1, s: 0.7, r: 0.3 }, { w: \"sine\", v: 2, f: 1, d: 0.3, s: 1, g: 1 }],\n        [{ w: \"square\", v: 0.3, a: 0.03, d: 0.5, s: 0.3, r: 0.1 }, { w: \"square\", v: 4, f: 1, a: 0.03, d: 0.1, g: 1 }],\n        [{ w: \"triangle\", v: 0.3, a: 0.08, d: 1, s: 0.3, r: 0.1 }, { w: \"square\", v: 2, f: 1, d: 0.3, s: 0.3, g: 1, t: 4, a: 0.08 }],\n        [{ w: \"sine\", v: 0.3, a: 0.05, d: 1, s: 0.3, r: 0.1 }, { w: \"sine\", v: 0.1, t: 2.001, f: 1, d: 1, s: 50, g: 1 }],\n        [{ w: \"triangle\", v: 0.3, a: 0.03, d: 0.7, s: 0.3, r: 0.2 }, { w: \"sine\", v: 12, t: 7, f: 1, d: 0.5, s: 1.7, g: 1 }],\n        [{ w: \"sine\", v: 0.3, a: 0.05, d: 1, s: 0.3, r: 0.1 }, { w: \"sawtooth\", v: 22, t: 6, d: 0.06, s: 0.3, g: 1 }],\n        [{ w: \"triangle\", v: 0.3, a: 0.05, d: 11, r: 0.3 }, { w: \"triangle\", v: 1, d: 1, s: 8, g: 1 }],\n        /* 97-104 : FX */\n        [{ w: \"sawtooth\", v: 0.3, d: 4, s: 0.8, r: 0.1 }, { w: \"square\", v: 1, t: 2, f: 8, a: 1, d: 1, s: 1, r: 0.1, g: 1 }],\n        [{ w: \"triangle\", v: 0.3, d: 1, s: 0.5, t: 0.8, a: 0.2, p: 1.25, q: 0.2 }, { w: \"sawtooth\", v: 0.2, a: 0.2, d: 0.3, s: 1, t: 1.2, p: 1.25, q: 0.2 }],\n        [{ w: \"sine\", v: 0.3, d: 1, s: 0.3 }, { w: \"square\", v: 22, t: 11, d: 0.5, s: 0.1, g: 1 }],\n        [{ w: \"sawtooth\", v: 0.3, a: 0.04, d: 1, s: 0.8, r: 0.1 }, { w: \"square\", v: 1, t: 0.5, d: 1, s: 2, g: 1 }],\n        [{ w: \"triangle\", v: 0.3, d: 1, s: 0.3 }, { w: \"sine\", v: 22, t: 6, d: 0.6, s: 0.05, g: 1 }],\n        [{ w: \"sine\", v: 0.6, a: 0.1, d: 0.05, s: 0.4 }, { w: \"sine\", v: 5, t: 5, f: 1, d: 0.05, s: 0.3, g: 1 }],\n        [{ w: \"sine\", a: 0.1, d: 0.05, s: 0.4, v: 0.8 }, { w: \"sine\", v: 5, t: 5, f: 1, d: 0.05, s: 0.3, g: 1 }],\n        [{ w: \"square\", v: 0.3, a: 0.1, d: 0.1, s: 0.4 }, { w: \"square\", v: 1, f: 1, d: 0.3, s: 0.1, g: 1 }],\n        /* 105-112 : Ethnic */\n        [{ w: \"sawtooth\", v: 0.3, d: 0.5, r: 0.5 }, { w: \"sawtooth\", v: 11, t: 5, d: 0.05, g: 1 }],\n        [{ w: \"square\", v: 0.3, d: 0.2, r: 0.2 }, { w: \"square\", v: 7, t: 3, d: 0.05, g: 1 }],\n        [{ w: \"triangle\", d: 0.2, r: 0.2 }, { w: \"square\", v: 9, t: 3, d: 0.1, r: 0.1, g: 1 }],\n        [{ w: \"triangle\", d: 0.3, r: 0.3 }, { w: \"square\", v: 6, t: 3, d: 1, r: 1, g: 1 }],\n        [{ w: \"triangle\", v: 0.4, d: 0.2, r: 0.2 }, { w: \"square\", v: 22, t: 12, d: 0.1, r: 0.1, g: 1 }],\n        [{ w: \"sine\", v: 0.25, a: 0.02, d: 0.05, s: 0.8 }, { w: \"square\", v: 1, t: 2, d: 0.03, s: 11, g: 1 }],\n        [{ w: \"sine\", v: 0.3, a: 0.05, d: 11 }, { w: \"square\", v: 7, t: 3, f: 1, s: 0.7, g: 1 }],\n        [{ w: \"square\", v: 0.3, a: 0.05, d: 0.1, s: 0.8 }, { w: \"square\", v: 4, d: 0.1, s: 1.1, g: 1 }],\n        /* 113-120 : Percussive */\n        [{ w: \"sine\", v: 0.4, d: 0.3, r: 0.3 }, { w: \"sine\", v: 7, t: 9, d: 0.1, r: 0.1, g: 1 }],\n        [{ w: \"sine\", v: 0.7, d: 0.1, r: 0.1 }, { w: \"sine\", v: 22, t: 7, d: 0.05, g: 1 }],\n        [{ w: \"sine\", v: 0.6, d: 0.15, r: 0.15 }, { w: \"square\", v: 11, t: 3.2, d: 0.1, r: 0.1, g: 1 }],\n        [{ w: \"sine\", v: 0.8, d: 0.07, r: 0.07 }, { w: \"square\", v: 11, t: 7, r: 0.01, g: 1 }],\n        [{ w: \"triangle\", v: 0.7, t: 0.5, d: 0.2, r: 0.2, p: 0.95 }, { w: \"n0\", v: 9, g: 1, d: 0.2, r: 0.2 }],\n        [{ w: \"sine\", v: 0.7, d: 0.1, r: 0.1, p: 0.9 }, { w: \"square\", v: 14, t: 2, d: 0.005, r: 0.005, g: 1 }],\n        [{ w: \"square\", d: 0.15, r: 0.15, p: 0.5 }, { w: \"square\", v: 4, t: 5, d: 0.001, r: 0.001, g: 1 }],\n        [{ w: \"n1\", v: 0.3, a: 1, s: 1, d: 0.15, r: 0, t: 0.5 }],\n        /* 121-128 : SE */\n        [{ w: \"sine\", t: 12.5, d: 0, r: 0, p: 0.5, v: 0.3, h: 0.2, q: 0.5 }, { g: 1, w: \"sine\", v: 1, t: 2, d: 0, r: 0, s: 1 }, { g: 1, w: \"n0\", v: 0.2, t: 2, a: 0.6, h: 0, d: 0.1, r: 0.1, b: 0, c: 0 }],\n        [{ w: \"n0\", v: 0.2, a: 0.05, h: 0.02, d: 0.02, r: 0.02 }],\n        [{ w: \"n0\", v: 0.4, a: 1, d: 1, t: 0.25 }],\n        [{ w: \"sine\", v: 0.3, a: 0.1, d: 1, s: 0.5 }, { w: \"sine\", v: 4, t: 0, f: 1.5, d: 1, s: 1, r: 0.1, g: 1 }, { g: 1, w: \"sine\", v: 4, t: 0, f: 2, a: 0.6, h: 0, d: 0.1, s: 1, r: 0.1, b: 0, c: 0 }],\n        [{ w: \"square\", v: 0.3, t: 0.25, d: 11, s: 1 }, { w: \"square\", v: 12, t: 0, f: 8, d: 1, s: 1, r: 11, g: 1 }],\n        [{ w: \"n0\", v: 0.4, t: 0.5, a: 1, d: 11, s: 1, r: 0.5 }, { w: \"square\", v: 1, t: 0, f: 14, d: 1, s: 1, r: 11, g: 1 }],\n        [{ w: \"sine\", t: 0, f: 1221, a: 0.2, d: 1, r: 0.25, s: 1 }, { g: 1, w: \"n0\", v: 3, t: 0.5, d: 1, s: 1, r: 1 }],\n        [{ w: \"sine\", d: 0.4, r: 0.4, p: 0.1, t: 2.5, v: 1 }, { w: \"n0\", v: 12, t: 2, d: 1, r: 1, g: 1 }],\n    ];\n    /**\n     * 填充音色默认参数\n     * @param {Object} options 配置选项\n     * @param {number} [options.g=0] - output destination 0=final output / n=FM to specified osc即将FM效果应用在第几个osc上\n     * @param {string} [options.w=\"sine\"] - wave type 波形类型 sine/square/sawtooth/triangle/w9999\n     * @param {number} [options.t=1] - tune factor according to note#\n     * @param {number} [options.f=0] - delta频率 在基频上面加的 f' = f0*t+f\n     * @param {number} [options.v=0.5] - volume 音量 0~1\n     * @param {number} [options.a=0] - attack time in seconds\n     * @param {number} [options.h=0.01] - hold time in seconds\n     * @param {number} [options.d=0.01] - decay time in seconds\n     * @param {number} [options.s=0] - sustain level 声音在按键持续按下期间的音量\n     * @param {number} [options.r=0.05] - release time in seconds\n     * @param {number} [options.p=1] - pitch bend 频率变化因数(乘)\n     * @param {number} [options.q=1] - pitch bend speed factor in seconds 从freq到freq*p所需秒数\n     * @param {number} [options.k=0] - volume key tracking factor 在真实的乐器中，音量往往会随着音高的变化而变化\n     */\n    static initSoundFont({ g, w, t, f, v, a, h, d, s, r, p, q, k } = TinySynth.defaultWave) {\n        // 默认的波形参数，用于填充每个基本波中缺失的默认参数\n        const defp = { g: g, w: w, t: t, f: f, v: v, a: a, h: h, d: d, s: s, r: r, p: p, q: q, k: k };\n        for (let i = 0; i < TinySynth.instrument.length; i++) {\n            // 用的是复制，目的是防止修改TinySynth.wave。此函数可多次调用，改变全局音色\n            TinySynth.soundFont[TinySynth.instrument[i]] = Array.from(TinySynth.wave[i], (v) => Object.assign({}, defp, v));\n        } console.log(\"音色库初始化完毕\");\n    }\n    static initOneSoundFont(id, { g, w, t, f, v, a, h, d, s, r, p, q, k } = TinySynth.defaultWave) {\n        const defp = { g: g, w: w, t: t, f: f, v: v, a: a, h: h, d: d, s: s, r: r, p: p, q: q, k: k };\n        TinySynth.soundFont[TinySynth.instrument[id]] = Array.from(TinySynth.wave[id], (v) => Object.assign({}, defp, v));\n    }\n    static midi_instrument(id) {\n        return TinySynth.soundFont[TinySynth.instrument[id]];\n    }\n    constructor(actx = new AudioContext(), loadAll = false) {\n        if (loadAll) {\n            TinySynth.initSoundFont();\n            Object.defineProperty(this, \"instrument\", {\n                set: function (id) { this._instrument = id; },\n                get: function () { return this._instrument; }\n            }); console.log(\"模式: 初始化所有音色\");\n        } else {\n            Object.defineProperty(this, \"instrument\", {\n                set: function (id) {\n                    const name = TinySynth.instrument[id];\n                    if (!TinySynth.soundFont[name]) TinySynth.initOneSoundFont(id);\n                    this._instrument = id;\n                },\n                get: function () { return this._instrument; }\n            }); console.log(\"模式: 运行时加载音色\");    // 初始时大约能小3M运行内存\n        }\n        this.channel = [];  // 维护一个数组，用于存放所有的channel。如果要改变顺序需要外部更改\n        this.notes = [];    // 存放所有正在playing的note\n        this.instrument = 0;\n        this.audioContext = actx;\n        const check = () => {\n            this.checkStop();\n            window.requestAnimationFrame(check);\n        }\n        window.requestAnimationFrame(check);\n    }\n    get audioContext() {\n        return this.actx;\n    }\n    set audioContext(actx) {\n        this.actx = actx;\n        this.out = this.actx.createGain();    // 总音量\n        this.comp = this.actx.createDynamicsCompressor();\n        this.out.connect(this.comp);\n        this.comp.connect(actx.destination);\n        for (const ch of this.channel) {\n            ch.out = actx.createGain();\n        }\n        // 不在默认波形中的波形集合\n        this.wave = { \"w9999\": actx.createPeriodicWave(new Float32Array(5), new Float32Array([0, 9, 9, 9, 9])) };\n        // 噪声\n        var blen = this.actx.sampleRate >> 1;\n        this.noiseBuf = {\n            n0: this.actx.createBuffer(1, blen, this.actx.sampleRate),\n            n1: this.actx.createBuffer(1, blen, this.actx.sampleRate)\n        };\n        let dn = this.noiseBuf.n0.getChannelData(0);\n        let dr = this.noiseBuf.n1.getChannelData(0);\n        for (let i = 0; i < blen; i++) {\n            dn[i] = Math.random() * 2 - 1;// 范围[-1, 1]，白噪声\n        }\n        // 生成一个包含64*2个不同频率的正弦波的音频缓冲区\n        for (let jj = 0; jj < 64; ++jj) {\n            const r1 = Math.random() * 10 + 1;\n            const r2 = Math.random() * 10 + 1;\n            for (let i = 0; i < blen; ++i) {\n                // 频率是r1和r2\n                let dd = Math.sin((i / blen) * 2 * Math.PI * 440 * r1) * Math.sin((i / blen) * 2 * Math.PI * 440 * r2);\n                dr[i] += dd / 8;\n            }\n        }\n    }\n    /**\n     * 平方律，根据增益获取音量，正常范围0~127\n     */\n    get volume() {\n        return Math.round(Math.sqrt(this.out.gain.value * 16129));\n    }\n    /**\n     * 平方律，根据音量设置增益\n     * @param {number} v 自然数音量\n     */\n    set volume(v) {\n        this.out.gain.value = v * v / 16129;\n    }\n    /**\n     * 创建一个节点\n     * @param {number} at 插入在native channel的位置，undefined表示最后，负数表示倒数\n     * @returns {Object} {out: GainNode}\n     */\n    addChannel(at = this.channel.length, instrument = 0, gain = 1) {\n        if (!this.channel) return null;   // 防止此函数返回的obj调用\n        const out = this.actx.createGain();\n        const ch = {out: out};\n        out.gain.value = gain;\n        out.connect(this.out);\n        Object.setPrototypeOf(ch, this);\n        ch.instrument = instrument; // 触发setter\n        this.channel.splice(at, 0, ch);\n        return ch;\n    }\n    /**\n     * 播放声音\n     * @param {Object} options 音符播放参数\n     * @param {number} [options.id] - channel的id，如果不传或违规则用自身 决定了音色\n     * @param {number} [options.f=440] - 发生频率\n     * @param {number} [options.v=127] - 力度，最大127 会按平方律变为音量\n     * @param {number} [options.t=0] - 发声时间(秒) 如果小于零则在this.actx.currentTime基础上加其绝对值\n     * @param {number} [options.last=9999] - 持续时间(秒)\n     * @returns {Object} note = {ch, end, gain, release}\n     */\n    play({ id, f = 440, v = 127, t = 0, last = 9999 } = {}) {\n        if (last <= 0) return;\n        const ch = id === void 0 ? this : (this.channel && this.channel[id] ? this.channel[id] : this);\n        const instrument = TinySynth.soundFont[TinySynth.instrument[ch.instrument]];\n        const osc = new Array(instrument.length);\n        const gain = new Array(instrument.length);\n        const freq = new Array(instrument.length);\n        const release = new Array(instrument.length);\n        if (t < 0) t = this.actx.currentTime - t;\n        else t = t < this.actx.currentTime ? this.actx.currentTime : t;\n        // 共用的变量\n        let out, A_rate, volume, o;\n        for (let i = 0; i < instrument.length; i++) {\n            const p = instrument[i];\n            if (p.g == 0) {  // 0表明是发声的\n                out = ch.out;\n                A_rate = v * v / 16129;     // 平方律设置归一化振幅\n                freq[i] = f * p.t + p.f;\n            } else if (p.g > 0) {   // FM调制\n                if (osc[p.g - 1].frequency) {\n                    out = osc[p.g - 1].frequency;\n                    A_rate = freq[p.g - 1];\n                } else {    // 如果是噪声，则osc是一个bufferSource，没有frequency属性\n                    out = osc[p.g - 1].playbackRate;\n                    A_rate = freq[p.g - 1] / 440;\n                }\n                freq[i] = freq[p.g - 1] * p.t + p.f;\n            } else {                // AM调制\n                out = gain[-p.g - 1].gain;\n                A_rate = 1;\n                freq[i] = freq[p.g - 1] * p.t + p.f;\n            }\n            // 振荡器 波形\n            if (p.w[0] == 'n') {    // 噪声\n                o = this.actx.createBufferSource();\n                o.buffer = this.noiseBuf[p.w];\n                o.loop = true;\n                o.playbackRate.value = freq[i] / 440;\n                if (p.p != 1) o.playbackRate.setTargetAtTime(freq[i] * p.p / 440, t, p.q);\n            } else {\n                o = this.actx.createOscillator();\n                o.frequency.value = freq[i];\n                if (p.p != 1) o.frequency.setTargetAtTime(freq[i] * p.p, t, p.q)\n                if (p.w[0] == 'w') o.setPeriodicWave(this.wave[p.w]);\n                else o.type = p.w;\n            } osc[i] = o;\n\n            volume = A_rate * p.v;\n            if (p.k) volume *= Math.pow(f / 261.6, p.k);   // 261.6是中央C的频率 k一般是负数，表示音越高，音量越小\n            release[i] = p.r;\n\n            const g = this.actx.createGain();\n            if (p.a) {   // 包络的A\n                g.gain.value = 0;\n                g.gain.setValueAtTime(0, t);\n                g.gain.linearRampToValueAtTime(volume, t + p.a);\n            } else g.gain.setValueAtTime(volume, t);\n            // 包络的H、D和S\n            g.gain.setTargetAtTime(p.s * volume, t + p.a + p.h, p.d);\n            gain[i] = g;\n\n            o.connect(g); g.connect(out); o.start(t);\n        }\n        const note = {   // 用于停止\n            ch: ch,\n            end: t + last,  // end表示结束时间，恒大于零，如果小于零表示已经停止(手动停止)，不需要再次停止\n            gain: gain, osc: osc,\n            release: release\n        };\n        this.notes.push(note);\n        return note;\n    }\n    stop(nt, t = 0) {\n        if (t < 0) t = this.actx.currentTime - t;\n        else t = t < this.actx.currentTime ? this.actx.currentTime : t;\n        let promises = nt.osc.map((osc, i) => {\n            return new Promise(resolve => {\n                osc.onended = resolve;\n                nt.gain[i].gain.cancelScheduledValues(t);\n                // 包络的R\n                nt.gain[i].gain.setTargetAtTime(0, t, nt.release[i]);\n                // setTargetAtTime 只会逼近不会到0 多等一会\n                osc.stop(t + nt.release[i] * 2);\n                nt.gain[i].gain.cancelScheduledValues(t + nt.release[i] * 2);\n            });\n        });\n        Promise.all(promises).then(() => {\n            nt.end = -1;    // 标记为已经停止\n            // 断开连接以GC\n            for (let i = 0; i < nt.osc.length; i++) {\n                nt.osc[i].disconnect();\n                nt.gain[i].disconnect();\n            }\n        });   // 在所有osc都结束后的操作\n    }\n    checkStop() {   // 自动回收 一直开启\n        const t = this.actx.currentTime;\n        for (let i = this.notes.length - 1; i >= 0; i--) {\n            const nt = this.notes[i];\n            if (nt.end < t) {\n                if (nt.end > 0) this.stop(nt);  // 手动停止则end<0但仍然留在notes中，不需要再次停止，直接删除\n                this.notes.splice(i, 1);\n            }\n        }\n    }\n    stopAll() {\n        for (let i = this.notes.length - 1; i >= 0; i--) {\n            this.stop(this.notes[i]);\n        } this.notes.length = 0;\n    }\n}"
  },
  {
    "path": "plugins/chordEst.js",
    "content": "window.plugins ??= [];\nwindow.plugins.push(function (app) {\n    // 和弦识别\n    var chords = null;\n    const chordEst = () => {\n        let hasHarmonic = !!app.Spectrogram.harmonic;\n        console.time(\"和弦分析\");\n        const chordest = new ChordEst(hasHarmonic ? 0.3 : 0.1, 0.1, Math.pow(0.82, app.dt / 1000)); // 1s后切换和弦的概率是0.82\n        const buffer = new Float32Array(12);\n        let buffer2 = hasHarmonic ? new Float32Array(84) : null;\n        for (let t = 0; t < app.Spectrogram.spectrogram.length; t++) {\n            let spec = app.Spectrogram.spectrogram[t];\n            if (hasHarmonic) {\n                for (let i = 0; i < spec.length; i++) buffer2[i] = Math.max(0, spec[i] - app.Spectrogram.harmonic[t][i]);\n                spec = buffer2;\n            }\n            chordest.step(chordest.chroma([spec], buffer));\n        }\n        const c = chordest.decode();\n        const results = [];\n        let lastChord = null;\n        for (let i = 0; i < c.length; i++) {\n            if (c[i] !== lastChord) {\n                results.push({ at: i, chord: c[i] });\n                lastChord = c[i];\n            }\n        }\n        console.timeEnd(\"和弦分析\");\n        ChordEst.octaveW = null;\n        chords = results;\n        app.makeActDirty();\n    };\n    const render = (canvas) => {\n        if (!chords) return;\n        const ctx = canvas.ctx;\n        let x = 0; {\n            let left = 0, right = chords.length - 1;\n            while (left <= right) {\n                const mid = Math.floor((left + right) / 2);\n                if (chords[mid].at < app.idXstart) {\n                    x = mid;\n                    left = mid + 1;\n                } else right = mid - 1;\n            }\n        }\n        const fill1Start = [], fill2Start = [];\n        for (; x < chords.length && chords[x].at < app.idXend; x++) {\n            if (chords[x].chord === 'N') continue;\n            let f = x & 1 ? fill1Start : fill2Start;\n            let xstart = Math.max(0, chords[x].at * app._width - app.scrollX);\n            let xend = Math.min(canvas.width, (chords[x + 1]?.at ?? app.xnum) * app._width - app.scrollX);\n            f.push({ xstart, xend, chord: chords[x].chord });\n        }\n        let ystart = canvas.height - app._height;\n        ctx.fillStyle = '#8400ff55';\n        for (const { xstart, xend, chord } of fill1Start)\n            ctx.fillRect(xstart, ystart, xend - xstart, app._height);\n        ctx.fillStyle = '#dd00ff55';\n        for (const { xstart, xend, chord } of fill2Start)\n            ctx.fillRect(xstart, ystart, xend - xstart, app._height);\n        ctx.fillStyle = 'black';\n        ystart = canvas.height - 1;\n        for (const { xstart, xend, chord } of fill1Start)\n            ctx.fillText(chord, xstart, ystart);\n        for (const { xstart, xend, chord } of fill2Start)\n            ctx.fillText(chord, xstart, ystart);\n    };\n    // 注册\n    const tgtLabel = \"分析\";\n    for (const t of window.menu.tabs) {\n        if (t.dataset.name != tgtLabel) continue;\n        const ul = t.item;\n        const li = document.createElement('li');\n        li.classList.add('pointer');\n        li.innerText = \"和弦分析\";\n        // 插入到“去除谐波”之后\n        let inserted = false;\n        for (let i = 0; i < ul.children.length; i++) {\n            if (ul.children[i].innerText && ul.children[i].innerText.includes('去除谐波')) {\n                if (ul.children[i].nextSibling)\n                    ul.insertBefore(li, ul.children[i].nextSibling);\n                else ul.appendChild(li);\n                inserted = true;\n                break;\n            }\n        } !inserted && ul.appendChild(li);\n        li.onclick = function (e) {\n            if (!app.Spectrogram._spectrogram || app.midiMode) {\n                alert(\"请先导入音频！\");\n                return;\n            }\n            chordEst();\n            e.stopPropagation();\n            e.target.blur();\n        }; break;\n    }\n    window.app.layers.action.register(render);\n    console.log('plugin \"chordEst\" loaded');\n});\nif (window.app) {\n    window.plugins.forEach(plugin => plugin(window.app));\n    window.plugins = null;\n}\n\n/**\n * @abstract 和弦识别类\n * 参考NNLS-Chroma这个Vamp插件,并做了简化(删去了NNLS&白化)与增强(乐理规则的转移概率调整)\n * 单帧和弦识别使用Chorma向量的余弦匹配(声学模型); 多帧使用HMM(语言模型)\n */\nclass ChordEst {\n    /**\n     * 和弦字典 包含和弦名称、和弦模板向量\n     * @type {Array<{name: string, vec: Float32Array}>} with .raw as the raw buffer of all chord vecs concatenated together\n     */\n    chordDict; // [{name, chroma}]\n    logPriorP; // 先验概率\n    logTransP; // 转移概率\n    states = []; // {scores: Float32Array, ptrs: Int16Array}\n    /**\n     * 构建和弦模板 转移概率\n     * @param {number} harmonicDecay 谐波拟合的衰减\n     * @param {number} P_N 无和弦的相对概率\n     * @param {number} P_keep 保持当前和弦的概率\n     */\n    constructor(harmonicDecay = 0.3, P_N = 0.1, P_keep = 0.98) {\n        class ChordPattern {\n            static MIDI_NOTES = [0, 2, 4, 5, 7, 9, 11];\n            static getMidi(je) {\n                let base = 0, acci = 0;\n                for (let char of je) {\n                    if (char === 'b') acci -= 1;\n                    else if (char === '#') acci += 1;\n                    else base = ChordPattern.MIDI_NOTES[(parseInt(char) - 1) % 7] || 0;\n                } return (base + acci + 12) % 12;\n            }\n            constructor(pattern, prob = 1.) {\n                // this.pattern: [0, 4, 7]\n                this.pattern = pattern.map(ChordPattern.getMidi);\n                this.prob = prob;\n            }\n        }\n        // 构建和弦字典\n        const patternDict = {\n            \"\": new ChordPattern(['1', '3', '5'], 1),    // 大三和弦 - 基础\n            \"m\": new ChordPattern(['1', 'b3', '5'], 0.9),  // 小三和弦 - 基础\n            \"dim\": new ChordPattern(['1', 'b3', 'b5'], 0.1),      // 减三 - 过渡性\n            \"aug\": new ChordPattern(['1', '3', '#5'], 0.1),       // 增三 - 罕见色彩\n            \"sus4\": new ChordPattern(['1', '4', '5'], 0.04),        // 挂四 - 过渡性和弦\n            \"sus2\": new ChordPattern(['1', '2', '5'], 0.04),        // 挂二 - 现代流行\n            \"7\": new ChordPattern(['1', '3', '5', 'b7'], 0.01),     // 属七 - 功能性强\n            \"m7\": new ChordPattern(['1', 'b3', '5', 'b7'], 0.01),   // 小七 - 爵士/R&B常见\n            \"maj7\": new ChordPattern(['1', '3', '5', '7'], 0.005),   // 大七 - 色彩性\n            \"dim7\": new ChordPattern(['1', 'b3', 'b5', 'bb7'], 0.004),   // 减七 - 古典/爵士过渡\n            \"m7b5\": new ChordPattern(['1', 'b3', 'b5', 'b7'], 0.003),   // 半减七 - 爵士ii级\n            \"add9\": new ChordPattern(['1', '3', '5', '9'], 0.003),   // 加九 - 色彩性\n            \"mM7\": new ChordPattern(['1', 'b3', '5', '7'], 0.001),  // 小大七 - 极罕见\n            \"maj9\": new ChordPattern(['1', '3', '5', '7', '9'], 0.0002), // 大九 - 复杂\n        };\n        {   // 归一化概率\n            let sum = 0;\n            for (const ptn in patternDict) sum += patternDict[ptn].prob;\n            sum = (1 - P_N) / (sum * 12);\n            for (const ptn in patternDict) patternDict[ptn].prob *= sum;\n        }\n        const ptnKey = Object.keys(patternDict);\n        const numPtn = ptnKey.length;\n        const validChordNum = numPtn * 12;\n        const chordNum = validChordNum + 1; // 包含无和弦\n\n        [this.chordDict, this.logPriorP] = (() => {\n            function initHarmonicTemplate(s = 0.6, harmonics = 9) {\n                const a = new Float32Array(12);\n                for (let h = 1, w = 1; h <= harmonics; h++, w *= s) {\n                    let bin = Math.log2(h) * 12;\n                    let l = Math.floor(bin);\n                    let r = Math.ceil(bin);\n                    let frac = bin - l;\n                    a[l % 12] += w * (1 - frac);\n                    a[r % 12] += w * frac;\n                } return a;\n            }\n            const tmpl = initHarmonicTemplate(harmonicDecay);\n            const Chord = (name, ptn, buf, amp = 1) => {\n                // 施加谐波模板\n                let sum = 0;\n                for (let i = 0; i < 12; i++) {\n                    for (let j = 0; j < 12; j++)\n                        buf[i] += ptn[j] * tmpl[(i - j + 12) % 12];\n                    sum += buf[i] * buf[i];\n                }\n                // 归一化\n                sum = amp / Math.sqrt(sum);\n                for (let i = 0; i < 12; i++) buf[i] *= sum;\n                return { name, vec: buf };\n            }\n\n            const Roots = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B'];\n            const vec = new Float32Array(12);\n            const result = Array(chordNum);\n            const buffer = result.raw = new Float32Array(chordNum * 12);\n            const priorP = new Float32Array(chordNum);\n            const normAmp = { 4: 0.98, 5: 0.95, 6: 0.93 };\n            let i = 0;\n            // 存储结构: 相同模式的放一起\n            for (const suffix of ptnKey) {\n                const pattern = patternDict[suffix];\n                priorP.fill(Math.log(pattern.prob), i, i + 12);\n                const amp = normAmp[pattern.pattern.length];\n                for (let root = 0; root < 12; root++) {\n                    vec.fill(0);\n                    for (const interval of pattern.pattern)\n                        vec[(root + interval) % 12] = 1;\n                    result[i] = Chord(Roots[root] + suffix, vec, buffer.subarray(i * 12, (i + 1) * 12), amp);\n                    i++;\n                }\n            }\n            // 无和弦\n            result[i] = Chord(\"N\", vec.fill(1), buffer.subarray(i * 12, (i + 1) * 12), 0.8);\n            priorP[i] = Math.log(P_N);\n            return [result, priorP];\n        })();\n\n        // 转移概率\n        this.logTransP = ((P_STAY = P_keep) => {\n            const getIdFromName = (nameList) => nameList.map(name => ptnKey.indexOf(name));\n            const STABLE = getIdFromName([\"\", \"m\", \"m7\", \"maj7\", \"add9\", \"maj9\"]);\n            const TENSION = getIdFromName([\"7\", \"dim\", \"m7b5\", \"dim7\", \"aug\", \"mM7\"]);\n            const SUSPENSE = getIdFromName([\"sus4\", \"sus2\"]);\n\n            const pMat = Array(chordNum);\n            const lt = pMat.raw = new Float32Array(chordNum * chordNum);\n\n            for (let i = 0; i < chordNum; i++) {\n                const row = pMat[i] = lt.subarray(i * chordNum, (i + 1) * chordNum);\n                if (i === validChordNum) {  // 从无和弦切换到别的状态\n                    row.set(this.logPriorP);\n                    this.logPriorP = row; // 复用\n                    continue;\n                }\n                let sumScore = 0;\n                let r1 = i % 12, p1 = i / 12 | 0;// 根音 模式\n                // 遍历每一个转移的可能\n                for (let j = 0; j < chordNum; j++) {\n                    if (i === j) continue; // 自转移单独处理\n                    let r2, p2, score;\n                    if (j < validChordNum) {\n                        r2 = j % 12;\n                        p2 = j / 12 | 0;\n                        score = patternDict[ptnKey[p2]].prob;\n                    } else {\n                        r2 = p2 = -1;\n                        score = P_N; // 进入N状态的概率\n                    }\n                    if (r1 !== -1 && r2 !== -1) {\n                        const interval = (r2 - r1 + 12) % 12;\n                        // --- 乐理规则增强 ---\n                        // 强功能进行：上行纯四度 (+5)\n                        if (interval === 5) {\n                            score *= 5.0;\n                            if (TENSION.includes(p1) && STABLE.includes(p2)) score *= 2.0; // V7 -> I 逻辑\n                        }\n                        // 下行三度进行：(-3 或 -4)\n                        else if (interval === 8 || interval === 9) {\n                            score *= 3.0; // I -> vi 或 I -> iii\n                        }\n                        // 上行二度：(+2) \n                        else if (interval === 2) {\n                            score *= 2.5; // IV -> V 逻辑\n                        }\n                        // 挂留解决：同根音\n                        else if (interval === 0 && SUSPENSE.includes(p1) && STABLE.includes(p2)) {\n                            score *= 10.0; // sus -> Major/Minor 极高概率\n                        }\n                        // 减/增和弦倾向解决\n                        else if (interval === 1 && ptnKey[p1] === \"dim7\") { // dim7 -> 半音上行\n                            score *= 4.0;\n                        }\n                        // 惩罚：避免无意义的频繁模式切换（根音不变时）\n                        else if (interval === 0 && p1 !== p2) {\n                            const n1 = patternDict[ptnKey[p1]].pattern.length;\n                            const n2 = patternDict[ptnKey[p2]].pattern.length;\n                            if (n2 < n1) score *= 0.9; // 变向更简单的和弦，惩罚极小\n                            else score *= 0.1; // 变向更复杂的和弦，保持高惩罚\n                        }\n                    }\n                    row[j] = score;\n                    sumScore += score;\n                }\n                // 归一化并取 Log\n                const scale = (1 - P_STAY) / sumScore;\n                for (let j = 0; j < chordNum; j++) {\n                    row[j] = Math.log(i === j ? P_STAY : row[j] * scale);\n                }\n            } return pMat;\n        })();\n        ChordEst.initOctaveW();\n    }\n    /**\n     * Viterbi 单步处理\n     * @param {Float32Array} obs 长度为12的观测Chroma向量 (应先归一化)\n     */\n    step(obs) {\n        const n = this.chordDict.length;\n        const likelihood = new Float32Array(n);\n        const ptrs = new Uint16Array(n);\n        // 发射概率\n        let p_sum = 0;\n        for (let i = 0; i < n; i++) {\n            let dot = 0;\n            const v = this.chordDict[i].vec;\n            for (let k = 0; k < 12; k++) dot += obs[k] * v[k];\n            if (dot < 0) dot = 0;\n            let p = Math.pow(dot, 5);   // 使用高次幂拉开差距\n            p_sum += p;\n            likelihood[i] = p == 0 ? -Infinity : Math.log(p);\n        }\n        if (p_sum < 1e-4) {\n            // 如果所有和弦的似然都很小，则认为是无和弦状态\n            likelihood.fill(-Infinity);\n            likelihood[this.chordDict.length - 1] = 0;\n        } else {\n            // 否则正常归一化似然\n            p_sum = Math.log(p_sum);\n            for (let i = 0; i < n; i++) {\n                if (likelihood[i] > -Infinity) likelihood[i] -= p_sum;\n            }\n        }\n\n        if (this.states.length === 0) {\n            // 第一帧使用先验\n            for (let i = 0; i < n; i++) likelihood[i] += this.logPriorP[i];\n        } else {\n            const prevScores = this.states[this.states.length - 1].scores;\n            for (let j = 0; j < n; j++) {\n                let maxS = -Infinity;\n                let maxIdx = 0;\n                // 遍历上一帧所有状态 i 转移到当前状态 j\n                for (let i = 0; i < n; i++) {\n                    const s = prevScores[i] + this.logTransP[i][j];\n                    if (s > maxS) maxS = s, maxIdx = i;\n                }\n                likelihood[j] += maxS;\n                ptrs[j] = maxIdx;\n            }\n        }\n        this.states.push({ scores: likelihood, ptrs });\n    }\n    /**\n     * 回溯得到最终和弦序列\n     * @returns {Array<string>} 和弦名称序列\n     */\n    decode() {\n        if (this.states.length === 0) return [];\n        const n = this.chordDict.length;\n        const T = this.states.length;\n        const result = new Array(T);\n        // 找到最后一帧得分最高的\n        let lastScores = this.states[T - 1].scores;\n        let curr = 0, maxS = -Infinity;\n        for (let i = 0; i < n; i++) {\n            if (lastScores[i] > maxS) maxS = lastScores[i], curr = i;\n        }\n        // 回溯\n        for (let t = T - 1; t >= 0; t--) {\n            result[t] = this.chordDict[curr].name;\n            curr = this.states[t].ptrs[curr];\n        }\n        // 清理状态以便下次识别\n        this.states = [];\n        return result;\n    }\n\n    // 频谱到chroma的权重\n    static octaveW;\n    static initOctaveW() {\n        if (ChordEst.octaveW) return;\n        const W = this.octaveW = new Float32Array(84);\n        const T = 84;\n        // const T = 84 * 6 / 5;\n        let w = 2 * Math.PI / T;\n        // let b = -Math.PI * 2 / 3;\n        let b = -Math.PI;\n        for (let i = 0; i < 84; i++) {\n            // 往低频靠近\n            W[i] = (Math.cos(w * i + b) + 1) / Math.pow(2, i / 24);\n        }\n        let sum = 0;\n        for (let c of W) sum += c;\n        sum = 12 / sum;\n        for (let i = 0; i < W.length; i++) W[i] *= sum;\n    }\n    /**\n     * 从频谱中得到Chroma能量向量\n     * @param {Array<Float32Array>} spect84 多个长84的 幅度\n     * @param {Float32Array} buffer 长12\n     * @return {Float32Array} 长度为12的Chroma向量\n     */\n    chroma(spect84, buffer = null) {\n        if (buffer == null) buffer = new Float32Array(12);\n        else buffer.fill(0);\n        const W = ChordEst.octaveW;\n        for (const f of spect84) {\n            for (let k = 0; k < 84; k++) {\n                buffer[k % 12] += f[k] * f[k] * W[k];\n            }\n        }\n        for (let i = 0; i < 12; i++) buffer[i] = buffer[i] / spect84.length;\n        return buffer;\n    }\n}"
  },
  {
    "path": "plugins/pitchName.js",
    "content": "window.plugins ??= [];\nwindow.plugins.push(function (app) {\n    // 显示音高\n    var pitchName = null;\n    const showPitchName = (ifshow) => {\n        if (ifshow) {\n            app.layerContainer.addEventListener('mousemove', app._trackMouseX);\n            pitchName = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'];\n        } else {\n            app.layerContainer.removeEventListener('mousemove', app._trackMouseX);\n            pitchName = null;\n        }\n    };\n    const render = ({ctx}) => {\n        let h = app.Keyboard.highlight;\n        if (pitchName && h >= 0) {\n            ctx.fillStyle = 'black';\n            ctx.fillText(\n                `${pitchName[h % 12]}${Math.floor(h / 12) - 1}`,\n                app._mouseX - app._height * 1.5,\n                app.layers.height - (h - 24) * app._height + app.scrollY - (app._height >> 3)\n            );\n        }\n    };\n    // 注册UI和绘制\n    const tgtLabel = \"设置\";\n    for (const t of window.menu.tabs) {\n        if (t.dataset.name != tgtLabel) continue;\n        const ul = t.item;\n        const li = document.createElement('li');\n        li.innerHTML = `<label>显示音名&nbsp;<input type=\"checkbox\"></label>`;\n        ul.appendChild(li);\n        li.querySelector('input').onchange = function (e) {\n            showPitchName(this.checked);\n            e.stopPropagation();\n            e.target.blur();\n        }; break;\n    }\n    window.app.layers.action.register(render);\n    console.log('plugin \"pitchName\" loaded');\n});\nif (window.app) {\n    window.plugins.forEach(plugin => plugin(window.app));\n    window.plugins = null;\n}"
  },
  {
    "path": "style/askUI.css",
    "content": "/* 依赖：style.css中的.card和.hvCenter*/\n.request-cover {\n    position: fixed;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    background-color: #6c6c6c78;\n    z-index: 99;\n    opacity: 1;\n    transition: opacity 0.2s ease-in-out;\n}\n\n.request-cover .card {\n    position: fixed;\n    width: auto;\n    height: auto;\n    background-color: rgb(37, 38, 45);;\n    padding: 1em;\n    overflow: hidden;\n    color: rgb(235, 235, 235);\n}\n\n.request-cover .title {\n    font-size: 1.2em;\n    font-weight: bold;\n    color: white;\n}\n/* 无特殊情况用label，特殊情况用span */\n.request-cover span.title {\n    overflow: hidden;\n    display: inline-block;\n    max-width: 11em;\n    min-width: 8em;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    vertical-align: middle;\n}\n.request-cover span.title:hover {\n    overflow: visible;\n    white-space: normal;\n    z-index: 100;\n    max-width: none;\n}\n\n.card.hvCenter .layout {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    padding: 5px 8px 5px 8px;\n    margin: 0.2em;\n    background: inherit;\n    color: inherit;\n}\n\n.card.hvCenter .layout-first {\n    margin-top: calc(0.2em + 5px);\n}\n\n.request-cover .card.hvCenter button {\n    margin: 0 0.25em;\n    border: none;\n    border-radius: 0.2em;\n    padding: 0.5em 1em;\n    cursor: pointer;\n    outline: none;\n    color: inherit;\n}\n.request-cover .ui-confirm {\n    flex: 1;\n    background: rgb(60, 87, 221);\n    color: white;\n}\n.request-cover .ui-cancel {\n    flex: 1;\n    background-color: #2e3039;\n    color: white;\n}\n\n.card.hvCenter input,\n.card.hvCenter select {\n    flex: 1;\n    background: inherit;\n    border: 1px solid rgb(54, 58, 69);\n    border-radius: 0.25em;\n    color: inherit;\n    margin: 0 0.8em;\n    padding-left: 0.6em;\n    padding: 0.35em 0em 0.3em 0.5em;\n}\n\n/* 进度条 */\n.porgress-track {\n    display: block;\n    width: 16em;\n    height: 1em;\n    border-radius: 2em;\n    background-color: #1e1f24;\n    overflow: hidden;\n}\n\n.porgress-value {\n    width: 0;\n    height: inherit;\n    background-color: #761fc8;\n}"
  },
  {
    "path": "style/channelDiv.css",
    "content": "/* 可拖拽的列表 */\n.drag_list {\n    --bg-color: var(--theme-middle);\n    --li-hover: var(--theme-light);\n}\n.drag_list .takeplace {\n    height: 8em;\n}\n/* 列表本体 */\nul.drag_list {\n    height: 100%;\n    list-style: none;\n    background-color: var(--bg-color);\n    padding: 0;\n    margin: 0;\n    overflow: auto;\n}\nul.drag_list::-webkit-scrollbar {\n    width: 12px;\n}\nul.drag_list::-webkit-scrollbar-thumb {\n    background-color: rgb(50, 53, 62);\n    border: 3px solid rgb(37, 38, 45);\n    border-radius: 6px;\n}\nul.drag_list::-webkit-scrollbar-track, ::-webkit-scrollbar-corner {\n    background-color: rgb(37, 38, 45);\n}\n\nul.drag_list li.drag_list-item {\n    width: 100%;\n    transition: 0.3s;\n}\nul.drag_list li.moving {\n    position: relative;\n}\nul.drag_list li.moving::before {\n    content: \"\";\n    position: absolute;\n    z-index: 2;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: var(--bg-color);\n    border: 0.125em dashed #ccc;\n    border-radius: 0.3em;   /* 和列表项保持一致 */\n    margin: 0 0.6em;\n}\n\n/* 列表项 */\n.channel-Container {\n    position: relative;\n    background-color: transparent;\n    border-radius: 0.32em;\n    margin: 0.6em;\n    border-left: 0.5em solid;\n    border-color: var(--tab-color);\n    padding: 0.4em;\n}\n.channel-Container:hover {\n    background-color: var(--li-hover);\n}\n.channel-Container.selected {\n    background-color: var(--li-hover);\n}\n/* 序号 */\n.channel-Container::after {\n    content: attr(data-tab-index);\n    position: absolute;\n    bottom: 0.32em;\n    right: 0.32em;\n    background-color: transparent;\n    font-size: 0.5em;\n    color: #a5abba;\n    z-index: 1;\n}\n.channel-Container .upper {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n}\n/* 音轨名 */\n.channel-Name {\n    overflow: hidden;       /* 隐藏超出容器的内容 */\n    white-space: nowrap;    /* 不换行 */\n    text-overflow: ellipsis;/* 超出部分用省略号表示 */\n    flex: 1;\n    font-size: 1em;\n    font-weight: bold;\n    color: white;\n    cursor: pointer;\n}\n/* 快捷按钮 */\n.channel-Tab {\n    display: flex;  /* 消除子block之间的间隙 */\n    flex: 0 1 auto;\n}\n.upper .tab {\n    border-radius: 50%;\n    width: 1.8em;\n    height: 1.8em;\n    text-align: center;\n    display: inline;\n    background-color: transparent;\n    border: none;\n    color: var(--tab-color);\n}\n.channel-Container .tab:hover {\n    background-color: #363944;\n}\n/* 乐器选择 */\n.channel-Instrument {\n    display: inline-block;\n    font-size: 0.9em;\n    color: white;\n    overflow: hidden;\n}"
  },
  {
    "path": "style/contextMenu.css",
    "content": ".contextMenuCard {\n    min-width: 100px;\n    padding: 3px 5px;\n    margin: 2px;\n    background-color: #ffffff;\n    border: 1px solid #dadce0;\n    border-radius: 4px;\n    box-shadow: 1px 1px 2px #878787;\n    position: fixed;\n    user-select: none;\n    z-index: 100;\n}\n\n.contextMenuCard:focus {\n    outline: none;\n}\n\n.contextMenuCard li {\n    list-style: none;\n    margin: 2px 0px;\n    cursor: pointer;\n    min-height: 26px;\n    padding: 0px 8px;\n    color: black;\n}\n\n.contextMenuCard li:hover {\n    background-color: #f5f5f5;\n}"
  },
  {
    "path": "style/icon/iconfont.css",
    "content": "@font-face {\n  font-family: \"iconfont\"; /* Project id 4420000 */\n  src: url('iconfont.woff2?t=1774196575181') format('woff2'),\n       url('iconfont.woff?t=1774196575181') format('woff'),\n       url('iconfont.ttf?t=1774196575181') format('truetype');\n}\n\n.iconfont {\n  font-family: \"iconfont\" !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-xifu:before {\n  content: \"\\e614\";\n}\n\n.icon-xifu1:before {\n  content: \"\\e730\";\n}\n\n.icon-lock:before {\n  content: \"\\e76f\";\n}\n\n.icon-unlock:before {\n  content: \"\\e879\";\n}\n\n.icon-file:before {\n  content: \"\\e63d\";\n}\n\n.icon-analysis:before {\n  content: \"\\e600\";\n}\n\n.icon-pageTurns:before {\n  content: \"\\e6d5\";\n}\n\n.icon-repeat:before {\n  content: \"\\e628\";\n}\n\n.icon-mixer:before {\n  content: \"\\e660\";\n}\n\n.icon-setting:before {\n  content: \"\\e673\";\n}\n\n.icon-list:before {\n  content: \"\\e603\";\n}\n\n.icon-pen-l:before {\n  content: \"\\e64d\";\n}\n\n.icon-select:before {\n  content: \"\\ea60\";\n}\n\n.icon-range:before {\n  content: \"\\e63c\";\n}\n\n.icon-eyeslash-fill:before {\n  content: \"\\e7aa\";\n}\n\n.icon-eye-fill:before {\n  content: \"\\e7ab\";\n}\n\n.icon-close_volume:before {\n  content: \"\\e6a0\";\n}\n\n.icon-volume:before {\n  content: \"\\e6a3\";\n}\n\n"
  },
  {
    "path": "style/myRange.css",
    "content": ".myrange {\n    margin: 0;\n    padding: 0;\n    box-sizing: border-box;\n    display: inline-flex;\n    align-items: center;\n    color: inherit;\n}\n\n.myrange span {\n    color: inherit;\n    cursor: pointer;\n    user-select: none;\n}\n\n/* === 各浏览器中统一滑动条 === */\n.myrange input[type=\"range\"] {\n    -webkit-appearance: none;\n    appearance: none;\n    margin: 0 5px 0 0;\n    padding: 0;\n    outline: none;\n    border: none;\n    background: rgb(60, 87, 221);\n    height: 6px;\n    border-radius: 10px;\n    transform: translateY(1px);\n}\n\n.myrange input[type=\"range\"]::-webkit-slider-thumb {\n    -webkit-appearance: none;\n    background: rgb(60, 87, 221);\n    width: 16px;\n    height: 16px;\n    border: none;\n    border-radius: 50%;\n    box-shadow: 0px 3px 6px 0px rgba(255, 255, 255, 0.15);\n}\n\n.myrange input[type=\"range\"]::-moz-range-thumb {\n    background: rgb(60, 87, 221);\n    width: 16px;\n    height: 16px;\n    border: none;\n    border-radius: 50%;\n    box-shadow: 0px 3px 6px 0px rgba(255, 255, 255, 0.15);\n}\n/* 解决Firefox中虚线显示在周围的问题 */\n.myrange input[type=\"range\"]::-moz-focus-outer {\n    border: 0;\n}\n\n.myrange input[type=\"range\"]:active::-webkit-slider-thumb {\n    box-shadow: 0px 5px 10px -2px rgba(0, 0, 0, 0.3);\n}\n/* === 滑动条end === */\n\n/* 隐藏数值的滑动条 */\n.hidelabelrange {\n    position: relative;\n}\n\n.hidelabelrange span.thelabel {\n    position: absolute;\n    z-index: 1;\n    padding: 3px 6px;\n    background-color: #373943;\n    box-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.15);\n    color: white;\n    font-size: 12px;\n    border-radius: 4px;\n    top: 7px;\n    transform: translateX(-50%) translateY(50%);\n}\n\n.hidelabelrange span.thelabel::after {\n    content: '';\n    position: absolute;\n    z-index: -1;\n    width: 10px;\n    height: 10px;\n    background-color: #373943;\n    top: -3px;\n    left: 50%;\n    transform: translateX(-50%) rotate(45deg);\n}\n\n.fullRange {\n    flex: 1;\n    width: 100%;\n    input {\n        width: 100%;\n    }\n}"
  },
  {
    "path": "style/siderMenu.css",
    "content": ".siderTabs {\n    --tab-width: 48px;\n    width: var(--tab-width);\n    height: 100%;\n    background-color: var(--theme-dark);\n    position: relative;\n    z-index: 1;\n}\n\n.siderTab {\n    color: var(--theme-text);\n    width: var(--tab-width);\n    height: var(--tab-width);\n    position: relative;\n    cursor: pointer;\n}\n\n/* 图标位置与大小 */\n.siderTab::before {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    font-size: calc(var(--tab-width) * 0.5);\n}\n\n.siderTab.selected {\n    color: white;\n    background-color: var(--theme-middle);\n    border-left: white solid 2px;\n}\n.siderTab.selected {\n    color: white;\n    background-color: var(--theme-middle);\n    border-left: white solid 2px;\n}\n\n\n.siderTab:hover {\n    color: white;\n}\n\n.siderTab::after {\n    content: attr(data-name);\n    font-size: calc(var(--tab-width) * 0.25);\n    color: var(--theme-text);\n    background-color: var(--theme-light);\n    white-space: nowrap;\n    padding: 4px 8px;\n    position: absolute;\n    z-index: 3;\n    top: calc(var(--tab-width) * 0.5);\n    left: calc(var(--tab-width) + 2px);\n    transform: translateY(-50%);\n    border-radius: 4px;\n    border: var(--theme-dark) solid 2px;\n    display: none;\n}\n.siderTab:hover::after {\n    display: block;\n}\n\n/* 展示内容 */\n.siderContent {\n    background-color: transparent;\n    width: 206px;\n    height: 100%;\n    overflow: hidden;\n}\n\n.siderBar {\n    opacity: 0;\n    transition: 0.3s;\n    width: 4px;\n    margin-left: -2px;\n    margin-right: -2px;\n    height: 100%;\n    background-color: royalblue;\n    cursor: ew-resize;\n    user-select: none;\n    position: relative;\n    z-index: 2;\n}\n\n.siderBar:hover {\n    opacity: 1;\n}\n\n.siderContent .siderItem {\n    background-color: var(--theme-middle);\n    width: 100%;\n    height: 100%;\n}\n\n/* siderItem不提供内边距，用paddingbox类实现 */\n.paddingbox {\n    box-sizing: border-box;\n    padding: 0.4em 0.8em;\n    overflow: auto;\n}\n\n.siderItem h3 {\n    margin: 0;\n    padding: 0;\n}"
  },
  {
    "path": "style/style.css",
    "content": ":root {\n    --theme-light: #2e3039;\n    --theme-middle: #25262d;\n    --theme-dark: #1e1f24;\n    --theme-text: #8e95a6;\n}\n\n* {\n    margin: 0;\n    padding: 0;\n    user-select: none;\n}\n\nhtml,\nbody {\n    height: 100%;\n    font-size: 16px;\n    color: var(--theme-text);\n    background-color: var(--theme-dark);\n    overflow: hidden;\n}\n\n@media (max-width: 1084px) {\n    .logo3 {\n        display: none !important;\n    }\n}\n\n@media (max-width: 1036px) {\n    .logo2 {\n        display: none !important;\n    }\n}\n\n@media (max-width: 983px) {\n    .logo1 {\n        display: none !important;\n    }\n    .tools {\n        justify-content: space-around !important;\n    }\n}\n\n@media (max-width: 792px) {\n    .rangeBox:has(#speedControl) {\n        display: none;\n    }\n}\n\ncanvas {\n    display: block;\n    margin: 0;\n    border: none;\n}\n\nul {\n    list-style: none;\n}\n\nbutton {\n    background-color: var(--theme-dark);\n    border: none;\n    cursor: pointer;\n    color: var(--theme-text);\n    font-size: 16px;\n}\n\n/* flex */\n.f {\n    display: flex;\n}\n\n.fc {\n    display: flex;\n    flex-direction: column;\n}\n\n.fr {\n    display: flex;\n    flex-direction: row;\n}\n\n/* width full */\n.wf {\n    width: 100%;\n}\n\n.dragIn::before {\n    content: \"Drag and drop your file here\";\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    position: absolute;\n    z-index: 98;\n    width: 100%;\n    height: 100%;\n    background-color: #1e1f24bb;\n    border: var(--theme-text) 3px dashed;\n    box-sizing: border-box;\n    font-size: 2em;\n}\n\n.card {\n    box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n    border-radius: 10px;\n}\n\n.hvCenter {\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n}\n\n#scrollbar-track {\n    margin: 0;\n    padding: 0;\n    border: none;\n    position: relative;\n    height: 1em;\n    background-color: rgb(37, 38, 45);\n}\n\n#scrollbar-thumb {\n    margin: 0;\n    padding: 0;\n    border: none;\n    position: absolute;\n    height: 100%;\n    width: 50px;\n    background-color: rgb(69, 72, 81);\n    cursor: ew-resize;\n}\n\n#play-btn {\n    background-color: var(--theme-middle);\n    color: var(--theme-text);\n    border: none;\n    border-right: var(--theme-dark) solid 3px;\n    position: relative;\n    font-size: 0.8em;\n    cursor: pointer;\n}\n\n.flexfull {\n    flex: 1;\n    /* 下面这行必须加 不然被画布撑开了就缩不回去了 */\n    overflow: hidden;\n}\n\n#main-layers {\n    position: relative;\n    canvas {\n        position: absolute;\n        top: 0;\n        left: 0;\n    }\n}\n\n.tools {\n    background-color: transparent;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    padding: 2px;\n    position: relative;\n    z-index: 1;\n}\n\n.top-logo {\n    height: 36px;\n    padding: 0 8px;\n    cursor: pointer;\n}\n\n/* 可以套在外面的盒子，盒子中可以放属性名 */\n.rangeBox {\n    height: 1em;\n    line-height: 1em;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: left;\n    margin: 0.25em;\n}\n\n/* 工具选择 */\n.switch-bar {\n    display: inline-block;\n    background-color: transparent;\n    /* 消除因为换行和缩进带来的间隔 */\n    white-space: nowrap;\n    font-size: 0;\n}\n\n.switch-bar button {\n    color: white;\n    padding: 0.5em 0.6em;\n    border-radius: 0;\n    background: rgb(50, 53, 62);\n    position: relative;\n    z-index: 0;\n    /* 恢复默认大小 */\n    font-size: 16px;\n}\n\n.switch-bar button:first-child {\n    border-top-left-radius: 5px;\n    border-bottom-left-radius: 5px;\n}\n\n.switch-bar button:last-child {\n    border-top-right-radius: 5px;\n    border-bottom-right-radius: 5px;\n}\n\n.switch-bar .selected {\n    background-color: rgb(60, 87, 221);\n}\n/* 下方标签 */\n.labeled {\n    position: relative;\n}\n.labeled::after {\n    content: attr(data-tooltip);\n    font-size: 12px;\n    color: var(--theme-text);\n    background-color: var(--theme-light);\n    white-space: pre;\n    padding: 4px 8px;\n    position: absolute;\n    z-index: 2;\n    bottom: 0;\n    left: 50%;\n    transform: translateY(105%) translateX(-50%);\n    border-radius: 4px;\n    border: var(--theme-dark) solid 2px;\n    display: none;\n}\n.labeled:hover::after {\n    display: block;\n}\n\n/* 用列表组织的菜单 */\n.btn-ul li {\n    margin: 0 -0.3em;\n    padding: 0.6em;\n    border-radius: 4px;\n}\n.btn-ul li:hover {\n    background-color: var(--theme-light) !important;\n    color: white !important;\n}\n.btn-ul button {\n    padding: 0.25em 0.6em;\n    margin-bottom: 0.3em;\n    border-radius: 6px;\n    border: black solid 2px;\n}\n.btn-ul button:hover {\n    color: white;\n}\n.btn-ul button:active {\n    background-color: black;\n}\ntextarea {\n    width: calc(100% - 0.5em);\n    height: 100%;\n    padding: 0.3em;\n    border: none;\n    border-radius: 6px;\n    background-color: var(--theme-dark);\n    color: var(--theme-text);\n    resize: vertical;\n}\n\n/* EQ控制面板 */\n#EQcontrol {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    margin-bottom: 1em;\n}\n#EQcontrol h5 { /* 频率值 */\n    margin: 0.4em 0 0 0;\n    padding: 0;\n}\n#EQcontrol .myrange {\n    width: 100%;\n    margin: 0 0 0.3em 0;\n}\n#EQcontrol input {\n    width: 100%;\n}\n\n/* 漂亮的滑动条 */\n.niceScroll {\n    overflow: auto;\n}\n.niceScroll::-webkit-scrollbar {\n    width: 12px;\n}\n.niceScroll::-webkit-scrollbar-thumb {\n    background-color: rgb(50, 53, 62);\n    border: 3px solid rgb(37, 38, 45);\n    border-radius: 6px;\n}\n.niceScroll::-webkit-scrollbar-track, ::-webkit-scrollbar-corner {\n    background-color: rgb(37, 38, 45);\n}\n\n/* 分析面板 */\n.tonalityResult {\n    width: 100%;\n    border-left: white 1px solid;\n}\n\n.tonalityResult div {\n    color: var(--theme-dark);\n    height: 1em;\n    font-size: 1em;\n    line-height: 1em;\n    border-top-right-radius: 4px;\n    border-bottom-right-radius: 4px;\n}\n\n/* 设置面板 */\n#settingPannel button {\n    margin: 0;\n}\n#settingPannel li {\n    display: flex;\n    flex-direction: row;\n    justify-content: center;\n    align-items: center;\n    flex-wrap: wrap;\n    position: relative;\n}\n#settingPannel li::after {\n    content: attr(data-value);\n    position: absolute;\n    right: 0;\n    bottom: 0;\n    font-size: 10px;\n}\n#settingPannel li button:first-of-type {\n    font-family: monospace;\n    margin-right: 0.2em;\n}\n#settingPannel li button:last-of-type {\n    font-family: monospace;\n    margin-left: 0.2em;\n}\n#repeatRange {\n    display: flex;\n    flex-wrap: nowrap;\n    align-items: center;\n    justify-content: center;\n    width: 100%;\n    margin: 0.4em 0;\n}\n#repeatRange input[type=\"text\"] {\n    width: 46%;\n    border-radius: 4px;\n    padding-left: 4px;\n    border: none;\n    border: black solid 1px;\n    font-size: 0.9em;\n    color: var(--theme-text);\n    background: var(--theme-dark);\n}\n#repeatRange input[type=\"text\"]:focus {\n    color: white;\n}\n\ncanvas.selecting {\n    cursor: ew-resize;\n}\n\n.pointer {\n    cursor: pointer;\n}\n\n.dim-text {\n    color: var(--theme-text) !important;\n}"
  },
  {
    "path": "ui/channelDiv.js",
    "content": "/**\n * 可拖动列表\n * @param {*} takeplace 占位符是否起作用，用于拖拽到最后还留有一段空间\n * @returns {HTMLDivElement} 一个可以拖动元素的ul\n */\nfunction dragList(takeplace = true) {\n    let list = document.createElement('ul');\n    list.classList.add('drag_list');\n\n    // 为了编写方便，占位符一直存在\n    list.innerHTML = `<div ${takeplace ? \"class='takeplace'\" : \"style='display:none;'\"}></div>`;\n    // 由于占位的存在，所以不能用原来的children获取li。对外屏蔽这个占位\n    Object.defineProperty(list, 'children', {\n        get: function () {  // querySelectorAll 方法返回的是一个 NodeList 对象，而不是一个真正的数组\n            return Array.from(this.querySelectorAll('li'));\n        }\n    });\n\n    let dragging = null;\n    list.ondragstart = (e) => {\n        dragging = e.target;\n        setTimeout(() => {  // 为了让拖拽的dom还保持原有样式，所以延迟添加moving样式\n            e.target.classList.add('moving');\n        }, 0);\n        e.dataTransfer.effectAllowed = 'move';\n    };\n    // 以下两个事件使用addEventListener，用于后续添加新的事件\n    list.addEventListener('dragover', (e) => {\n        e.preventDefault();\n        let target = e.target;\n        // 防止因为拖拽到li的子元素而判断为不是拖拽到li\n        while (target.nodeName !== 'LI') {\n            target = target.parentNode;\n            if (!target) return;\n        }\n        if (target != dragging) {\n            const rect = target.getBoundingClientRect()\n            let rectHalfPosition = rect.y + (rect.height >> 1);    // 计算目标的中间在屏幕中的坐标\n            if (e.clientY > rectHalfPosition) { // 在目标元素下方插入\n                list.insertBefore(dragging, target.nextElementSibling);    // 从下向上拖动\n            } else {    // 在目标元素上方插入\n                list.insertBefore(dragging, target);\n            }\n        }\n    });\n    list.addEventListener('dragend', (e) => {\n        e.target.classList.remove('moving');\n    });\n    // 添加元素将用li包裹\n    list.appendChild = function (node, at = -1) {\n        let ITEM = document.createElement('li');\n        ITEM.draggable = true;\n        ITEM.classList.add('drag_list-item');\n        ITEM.appendChild(node);\n        if (at < 0) {\n            this.insertBefore(ITEM, this.lastElementChild);\n        } else {    // 只关注li\n            const liElements = this.querySelectorAll('li');\n            if (at >= 0 && at < liElements.length) {\n                this.insertBefore(ITEM, liElements[at]);\n            } else {\n                this.insertBefore(ITEM, this.lastElementChild);\n            }\n        }\n    };\n    list.clear = function () {\n        const takeplace = this.lastElementChild;\n        this.innerHTML = '';\n        Node.prototype.appendChild.call(this, takeplace);\n    }\n    // 动画的原理是，先用translate变到之前的位置，然后通过设置translate=none变回来。但是涉及动画时反复触发的问题，所以没做\n    // transtition的时候获取的坐标是最终值，所以也不能中途转向\n    return list;\n}\n\n// 为了可读性、隔离性、模块化，使用此类包裹HTMLDivElement\n// 会抛出事件: lock visible mute 在三个值被set时触发\nclass ChannelItem extends HTMLDivElement {\n    /**\n     * 实际并不使用构造函数 此函数只是表明有哪些属性可用\n     */\n    constructor() {\n        super();\n        this.nameDiv = null;\n        this.instrumentDiv = null;\n        this.lockButton = null;\n        this.visibleButton = null;\n        this.muteButton = null;\n        // 用ChannelList.addChannel添加时会注入ch属性，存储了对应的合成器音轨 因为合成器是ChannelList的成员\n        this.ch = null;\n    }\n    /**\n     * 通过更改原型链实现构造\n     * @param {string} name \n     * @param {string} color \n     * @returns {ChannelItem}\n     */\n    static new(name = \"channel\", color = \"red\", instrument = \"Piano\", visible = true, mute = false, lock = false) {\n        let tempDiv = document.createElement('div');\n        tempDiv.innerHTML = `\n        <div class=\"channel-Container\" style=\"--tab-color: ${color};\" data-tab-index=\"1\">\n            <div class=\"upper\">\n                <div class=\"channel-Name\">${name}</div>\n                <div class=\"channel-Tab\">\n                    <button class=\"tab iconfont icon-unlock\" data-state=\"unlock\"></button>\n                    <button class=\"tab iconfont icon-eye-fill\" data-state=\"visible\"></button>\n                    <button class=\"tab iconfont icon-volume\" data-state=\"nomute\"></button>\n                </div>\n            </div> <div class=\"channel-Instrument\">${instrument}</div>\n        </div>`;    // 可以通过设置style的--tab-color改颜色；data-tab-index用于显示序号\n        let container = tempDiv.firstElementChild;  // 不能用firstChild因为获取的是文本节点\n        container.nameDiv = tempDiv.querySelector('.channel-Name');\n        container.instrumentDiv = tempDiv.querySelector('.channel-Instrument');\n        const buttons = tempDiv.querySelectorAll('.tab');\n        container.lockButton = buttons[0];\n        container.visibleButton = buttons[1];\n        container.muteButton = buttons[2];\n        container.lockButton.addEventListener('click', (e) => {\n            e.stopPropagation();\n            container.lock = !container.lock;\n            container.lockButton.blur();\n        });\n        container.visibleButton.addEventListener('click', (e) => {\n            e.stopPropagation();\n            container.visible = !container.visible;\n            container.lock = !container.visible;    // 先执行本函数的目的再联动lock\n            container.visibleButton.blur();\n        });\n        container.muteButton.addEventListener('click', (e) => {\n            e.stopPropagation();\n            container.mute = !container.mute;\n            container.muteButton.blur();\n        });\n        // 设置原型链为ChannelItem\n        Object.setPrototypeOf(container, ChannelItem.prototype);\n        container.lock = lock;\n        container.visible = visible;\n        container.mute = mute;\n        return container;\n    }\n    get name() {\n        return this.nameDiv.innerHTML;\n    }\n    set name(channelName) {\n        this.nameDiv.innerHTML = channelName;\n    }\n    get instrument() {\n        return this.instrumentDiv.innerHTML;\n    }\n    set instrument(instrument) {\n        this.instrumentDiv.innerHTML = instrument;\n    }\n    get color() {\n        return this.style.getPropertyValue('--tab-color');\n    }\n    set color(color) {\n        this.style.setProperty('--tab-color', color);\n    }\n    get lock() {\n        return this.lockButton.dataset.state === 'lock';\n    }\n    set lock(lock) {\n        if (typeof lock !== 'boolean') lock = lock === \"lock\";\n        if (lock) {\n            this.lockButton.dataset.state = 'lock';\n            this.lockButton.classList.remove('icon-unlock');\n            this.lockButton.classList.add('icon-lock');\n        } else {\n            this.lockButton.dataset.state = 'unlock';\n            this.lockButton.classList.remove('icon-lock');\n            this.lockButton.classList.add('icon-unlock');\n        }\n        this.dispatchEvent(new Event('lock', { bubbles: true }));\n    }\n    get visible() { // true为可见\n        return this.visibleButton.dataset.state === 'visible';\n    }\n    set visible(visible) {\n        if (typeof visible !== 'boolean') visible = visible === \"visible\";\n        if (visible) {\n            this.visibleButton.dataset.state = 'visible';\n            this.visibleButton.classList.remove('icon-eyeslash-fill');\n            this.visibleButton.classList.add('icon-eye-fill');\n        } else {\n            this.visibleButton.dataset.state = 'invisible';\n            this.visibleButton.classList.remove('icon-eye-fill');\n            this.visibleButton.classList.add('icon-eyeslash-fill');\n        }\n        this.dispatchEvent(new Event('visible', { bubbles: true }));\n    }\n    get mute() { // true为静音\n        return this.muteButton.dataset.state === 'mute';\n    }\n    set mute(mute) {\n        if (typeof mute !== 'boolean') mute = mute === \"mute\";\n        if (mute) {\n            this.muteButton.dataset.state = 'mute';\n            this.muteButton.classList.remove('icon-volume');\n            this.muteButton.classList.add('icon-close_volume');\n        } else {\n            this.muteButton.dataset.state = 'nomute';\n            this.muteButton.classList.remove('icon-close_volume');\n            this.muteButton.classList.add('icon-volume');\n        }\n        this.dispatchEvent(new Event('mute', { bubbles: true }));\n    }\n    /**\n     * 从0开始，表示第几项；但显示时从1开始。需要外部维护\n     */\n    get index() {\n        return parseInt(this.dataset.tabIndex) - 1;\n    }\n    set index(index) {\n        this.dataset.tabIndex = index + 1;\n    }\n    toJSON() {  // 用于序列化，以实现撤销\n        return {\n            name: this.name,\n            color: this.color,\n            instrument: this.instrument,\n            lock: this.lock,\n            visible: this.visible,\n            mute: this.mute\n        };\n    }\n}\n\n/**\n * 依赖：contextMenu dragList ChannelItem tinySynth\n * 事件：（按发生的顺序排）\n * remove(detail)：发生于删除之前、归还颜色之后\n * reorder(detail)：发生于有序号变化时，最后一个ChannelItem的删除和新增不会触发\n * \n * setted: 通过UI修改了channel属性后触发\n */\nclass ChannelList extends EventTarget {\n    // 颜色是对通道的特异性标识\n    static colorList = [\n        \"#FF4500\", /*橙红色*/ \"#FFD700\", /*金色*/ \"#32CD32\", /*酸橙绿*/ \"#00BFFF\", /*深天蓝色*/\n        \"#FF6347\", /*番茄色*/ \"#FF1493\", /*深粉红色*/ \"#7FFF00\", /*查特酸橙绿*/ \"#1E90FF\", /*道奇蓝*/\n        \"#FFA500\", /*橙色*/ \"#EE82EE\", /*紫罗兰*/ \"#ADFF2F\", /*绿黄色*/ \"#87CEFA\", /*亮天蓝色*/\n        \"#FF69B4\", /*热情粉红色*/ \"#00FA9A\", /*中春绿色*/ \"#FFB6C1\", /*浅粉红色*/ \"#20B2AA\", /*浅海洋绿*/\n\n        \"#FF8C00\", /*深橙色*/ \"#BA55D3\", /*中紫罗兰色*/ \"#9ACD32\", /*黄绿色*/ \"#4682B4\", /*钢蓝色*/\n        \"#8A2BE2\", /*蓝紫色*/ \"#5F9EA0\", /*军蓝色*/ \"#D2691E\", /*巧克力色*/ \"#6495ED\", /*矢车菊蓝*/ \n        \"#DC143C\", /*猩红色*/ \"#00FFFF\", /*青色*/ \"#00008B\", /*深蓝色*/ \"#FF7F50\" /*珊瑚色*/\n    ];\n    /**\n     * 判断是否点击在channelItem上\n     * 必须被<li>包裹才能生效 因此耦合了dragList和dom结构\n     * @param {HTMLElement} target 一般是e.target\n     * @returns 如果点击在channelItem上，返回channelItem的container，否则返回null\n     */\n    static whichItem(target) {\n        const li = target.tagName === 'LI' ? target : target.closest('li');\n        if (li && li.firstElementChild.classList.contains('channel-Container')) {\n            return li.firstElementChild;\n        } else return null;\n    }\n    static judgeClick(e) { return ChannelList.whichItem(e.target); }\n    /**\n     * 初始画可拖拽音轨列表\n     * @param {HTMLDivElement} div \n     * @param {TinySynth} synthesizer 合成器实例\n     */\n    constructor(div, synthesizer) {\n        super();\n        this.synthesizer = synthesizer;\n        this.colorMask = 0; // 用于表示哪些颜色已经被占用\n        for (let i = 0; i < ChannelList.colorList.length; i++) {\n            this.colorMask |= (1 << i);\n        }\n        const list = dragList();\n        list.addEventListener('dragend', this.updateRange.bind(this));\n        this.selected = null;\n        list.addEventListener('click', e => { this.selectChannel(e.target); });\n        this.container = list;\n        this.channel = [];  // 由updateRange维护 作用是根据id快速定位ChannelItem 屏蔽了li的包裹\n        this.addChannel();  // 默认有一个\n        div.appendChild(list);\n        // 右键菜单\n        this.contextMenu = new ContextMenu([\n            // 在空白部分右击\n            {\n                name: '添加音轨', callback: () => {\n                    this.addChannel();\n                }, onshow: e => !ChannelList.whichItem(e.target) && this.colorMask\n            }, {\n                name: '全部隐藏', callback: () => {\n                    this.channel.forEach(ch => ch.visible = false);\n                }, onshow: e => !ChannelList.whichItem(e.target),\n            }, {\n                name: '全部显示', callback: () => {\n                    this.channel.forEach(ch => ch.visible = true);\n                }, onshow: e => !ChannelList.whichItem(e.target),\n            },\n            {\n                name: '全部静音', callback: () => {\n                    this.channel.forEach(ch => ch.mute = true);\n                }, onshow: e => !ChannelList.whichItem(e.target),\n            },\n            {\n                name: '全部发声', callback: () => {\n                    this.channel.forEach(ch => ch.mute = false);\n                }, onshow: e => !ChannelList.whichItem(e.target),\n            },\n            // 在列表项上点击\n            {\n                name: '属性设置', callback: (e) => {\n                    let id = parseInt(ChannelList.whichItem(e.target).dataset.tabIndex) - 1;\n                    this.selectChannel(id); // 传id计算量小一点\n                    this.settingPannel(id);\n                }, onshow: ChannelList.judgeClick\n            }, {\n                name: '在上方插入音轨', callback: (e) => {\n                    let id = parseInt(ChannelList.whichItem(e.target).dataset.tabIndex) - 1;\n                    this.addChannel(id);\n                }, onshow: ChannelList.judgeClick\n            }, {\n                name: '在下方插入音轨', callback: (e) => {\n                    let id = parseInt(ChannelList.whichItem(e.target).dataset.tabIndex);\n                    this.addChannel(id);\n                }, onshow: ChannelList.judgeClick\n            }, {\n                name: '<span style=\"color: red;\">删除该轨</span>', callback: (e) => {\n                    this.removeChannel(ChannelList.whichItem(e.target));\n                }, onshow: ChannelList.judgeClick\n            }\n        ]);\n        list.addEventListener('contextmenu', (e) => {\n            e.preventDefault();\n            this.contextMenu.show(e);\n        });\n        ChannelItem.prototype.toJSON = this._toJSON;\n    }\n    /**\n     * 根据ui维护this.channel和channelItem.dataset.tabIndex\n     * 如果发生变化会触发事件：reorder，detail为老顺序->新顺序的变换关系，类似状态转移矩阵\n     * “新增在最后一个”和“删除最后一个”不会触发reorder\n     */\n    updateRange() {\n        let change = false;\n        let children = Array.from(this.container.children);\n        let indexMap = new Array(children.length + 1);  // 防止重新分配空间 加一是为了兼容删除一个后的reorder\n        this.synthesizer.channel = new Array(children.length);\n        this.channel = new Array(children.length);\n        for (let i = 0; i < children.length; i++) {\n            const channel = children[i].firstElementChild;\n            let oldIndex = channel.index;\n            indexMap[oldIndex] = i;     // 如果在at插入了新的ChannelItem，由于其序号已经对应好，所以不会触发change；且原来在at的元素被推到了(at+1)，会覆盖其对indexMap[at]的更改\n            if (oldIndex !== i) change = true;\n            channel.dataset.tabIndex = i + 1;\n            this.channel[i] = channel;\n            this.synthesizer.channel[i] = channel.ch;\n        }\n        if (change) this.dispatchEvent(new CustomEvent(\"reorder\", {\n            detail: indexMap\n        }));\n    }\n\n    /* 颜色管理 begin */\n    borrowColor() {\n        for (let i = 0; i < ChannelList.colorList.length; i++) {\n            if (this.colorMask & (1 << i)) {\n                this.colorMask ^= (1 << i);\n                return ChannelList.colorList[i];\n            }\n        } return null;\n    }\n    borrowTheColor(color) {\n        for (let i = 0; i < ChannelList.colorList.length; i++) {\n            if (ChannelList.colorList[i] === color) {\n                if (this.colorMask & (1 << i)) {\n                    this.colorMask ^= (1 << i);\n                    return color;\n                } else return null;\n            }\n        } return null;\n    }\n    returnColor(color) {\n        for (let i = 0; i < ChannelList.colorList.length; i++) {\n            if (ChannelList.colorList[i] === color) {\n                this.colorMask |= (1 << i);\n                return;\n            }\n        }\n    }\n    /* 颜色管理 end */\n    /**\n     * 增加一个channel，触发add事件，发生于插入之后\n     * 然后可能会触发reorder事件，取决于是否插入最后一个\n     * 最后触发added事件\n     * @param {number} at 插入音轨的序号\n     * @returns {ChannelItem}\n     */\n    addChannel(at = this.channel.length) {    // 用于一个个添加\n        if (!this.colorMask) {\n            alert(`最多只能添加${ChannelList.colorList.length}个轨道！`);\n            return;\n        }\n        const ch = ChannelItem.new('某音轨', this.borrowColor(), TinySynth.instrument[0]);\n        ch.index = at;\n        ch.ch = this.synthesizer.addChannel(at);\n        this.container.appendChild(ch, at);\n        ch.click();\n        this.dispatchEvent(new CustomEvent(\"add\", {\n            detail: ch\n        }));\n        this.updateRange();\n        this.dispatchEvent(new Event(\"added\"));\n        return ch;\n    }\n    /**\n     * 删除一个channel，触发remove事件，发生于删除之前、归还颜色之后\n     * 然后可能会触发reorder事件，取决于是否删除最后一个\n     * 最后触发removed事件\n     * remove事件必须在reorder之前，因为reorder会触发重新映射，之后就不能根据原有的索引删除音符了\n     * 此外由于reorder的不稳定触发（会触发存档操作），使用时需要提前清除reorder的回调\n     * @param {ChannelItem || Number} node 节点的序号或者节点或其子元素\n     */\n    removeChannel(node) {\n        const channel = typeof node === 'number' ? this.channel[node] : ChannelList.whichItem(node);\n        if (!channel) return;\n        this.returnColor(channel.color);\n        this.dispatchEvent(new CustomEvent(\"remove\", {\n            detail: channel\n        }));\n        this.synthesizer.channel.splice(channel.index, 1);\n        if (this.selected === channel) this.selected = null;\n        // 之所以要parentNode是因为dragList中添加项会用<li>包裹\n        // 而this.channel[node]是channelItem（在上一次的updateRange中根据container.children赋值，赋值时使用了firstElementChild）\n        channel.parentNode.remove();\n        this.updateRange()  // 可能会触发reorder事件\n        this.dispatchEvent(new Event(\"removed\"));\n    }\n    /**\n     * 设置选中的channel的样式\n     * @param {ChannelItem || Number} node 节点的序号或者节点或其子元素\n     * @returns {ChannelItem} 如果无该项则返回null\n     */\n    selectChannel(node) {\n        const channel = typeof node === 'number' ? this.channel[node] : ChannelList.whichItem(node);\n        if (channel && channel !== this.selected) {\n            if (this.selected) this.selected.classList.remove('selected');\n            this.selected = channel;\n            channel.classList.add('selected');\n            return channel;\n        } return null;\n    }\n    /**\n     * 打开ch的设置面板\n     * @param {number} chid 音轨序号\n     */\n    settingPannel(chid) {\n        const ch = this.channel[chid];\n        const originConfig = JSON.stringify(ch);\n        let tempDiv = document.createElement('div');\n        tempDiv.innerHTML = `\n        <div class=\"request-cover\">\n            <div class=\"card hvCenter\"><label class=\"title\">音轨${ch.dataset.tabIndex}设置</label>\n                <div class=\"layout layout-first\"><span>音轨名:</span><input type=\"text\" name=\"ui-ask\"></div>\n                <div class=\"layout\"><span>音量：&nbsp;</span><input type=\"number\" name=\"ui-ask\" value=\"100\" step=\"1\" min=\"0\" max=\"127\"></div>\n                <div class=\"layout\"><span>音色：&nbsp;</span><select name=\"ui-ask\"></select></div>\n                <div class=\"layout\"><button class=\"ui-cancel\">取消</button><button class=\"ui-confirm\">确定</button></div>\n            </div>\n        </div>`;\n        const card = tempDiv.firstElementChild;\n        const btns = card.getElementsByTagName('button');\n        card.addEventListener('keydown', (e) => {\n            if (e.keyCode === 13) btns[1].click();  // 回车则点击btns[1]\n        });\n        const close = () => {   // 渐变消失\n            card.style.opacity = 0;\n            setTimeout(()=>card.remove(), 200);\n            // 如果有修改则触发事件以存档\n            const newConfig = JSON.stringify(ch);\n            if (originConfig !== newConfig) this.dispatchEvent(new Event('setted'));\n        }\n        btns[0].addEventListener('click', close);\n        btns[1].addEventListener('click', () => {\n            ch.name = inputs[0].value;\n            ch.ch.volume = parseInt(inputs[1].value);\n            let inst = parseInt(inputs[2].value);\n            ch.ch.instrument = inst;\n            ch.instrument = TinySynth.instrument[inst];\n            close();\n        });\n        const inputs = card.querySelectorAll('[name=\"ui-ask\"]');\n        inputs[0].value = ch.name;\n        inputs[1].value = ch.ch.volume;\n        // 给select添加选项\n        for (let i = 0; i < 128; i++) {\n            const option = document.createElement('option');\n            option.value = i;\n            option.innerHTML = TinySynth.instrument[i];\n            if (ch.ch.instrument === i) option.selected = true;\n            inputs[2].appendChild(option);\n        }\n        document.body.insertBefore(card, document.body.firstChild);\n        card.tabIndex = 0;\n        card.focus();\n    }\n    _toJSON() {\n        return {    // 篡改ChannelItem的原型方法，使保存的乐器是序号，并能保存音量\n            name: this.name,\n            color: this.color,\n            lock: this.lock,\n            visible: this.visible,\n            mute: this.mute,\n            instrument: this.ch.instrument,\n            volume: Math.round(Math.sqrt(this.ch.out.gain.value * 16129)),\n            selected: this.classList.contains('selected') ? 1 : undefined\n        };\n    }\n    /**\n     * 从数组中创建列表，用于撤销 不会(不能)调用updateRange\n     * @param {Array} array \n     */\n    fromArray(array) {\n        let len = array.length;\n        if (len > ChannelList.colorList.length) {\n            console.warn(`轨道数超过最大值${ChannelList.colorList.length}！将忽略多余的轨道。`);\n            len = ChannelList.colorList.length;\n        }\n        this.synthesizer.channel.length = 0;\n        this.container.clear();\n        this.channel = new Array(len);\n        this.colorMask = 0xFFFF;\n        let failed = 0x0000;\n        for (let i = 0; i < len; i++) {\n            const item = array[i];\n            let color = this.borrowTheColor(item.color);\n            if (!color) {\n                color = '';\n                failed &= (1 << i);\n            }\n            const ch = ChannelItem.new(item.name, color, TinySynth.instrument[item.instrument], item.visible, item.mute, item.lock);\n            ch.ch = this.synthesizer.addChannel(i, item.instrument, item.volume * item.volume / 16129);\n            this.channel[i] = ch;\n            ch.dataset.tabIndex = i + 1;\n            if (item.selected) ch.click();\n            this.container.appendChild(ch);\n        }\n        if (failed) {\n            console.warn('颜色冲突或超出范围！将自动分配违规颜色。');\n            for (let i = 0; i < len; i++) {\n                if (failed & (1 << i)) {\n                    this.channel[i].color = this.borrowColor();\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "ui/contextMenu.js",
    "content": "class ContextMenu {\n    /**\n     * 创建菜单\n     * @param {Array} items [{\n     *   name: \"菜单项\",\n     *   callback: (e_father, e_self) => {  // 点击菜单项时调用的函数，传参是(触发右键菜单的事件,点击本项的事件)\n     *      return false/true;\n     *   }, // 返回false（或不返回）表示删除菜单，返回true表示不删除菜单\n     *   onshow: function (e) { // 在菜单项显示前调用，传参是触发右键菜单的事件\n     *      // this指向菜单项对象，可以修改其属性\n     *      return true/false;\n     *   }, // 返回true/false控制本项是否显示\n     *   event: \"click\" // 确认触发本项的事件，默认是click\n     * },...]\n     * @param {boolean} mustShow 如果菜单项为空，是否显示\n     */\n    constructor(items = [], mustShow = false) {\n        this.items = items;\n        this.mustShow = mustShow;\n    }\n\n    addItem(name, callback, onshow = null, event = \"click\") {\n        let existingItem = this.items.find(item => item.name === name);\n        if (existingItem) existingItem.callback = callback;\n        else this.items.push({ name: name, callback: callback, onshow: onshow, event: event });\n    }\n    removeItem(name) {\n        for (let i = 0; i < this.items.length; i++) {\n            if (this.items[i].name === name) {\n                this.items.splice(i, 1);\n                break;\n            }\n        }\n    }\n\n    show(e) {\n        const contextMenuCard = document.createElement('ul');\n        contextMenuCard.classList.add('contextMenuCard');\n        contextMenuCard.oncontextmenu = () => false; // 禁用右键菜单\n        this.items.forEach(item => {\n            if (item.onshow) if (!item.onshow(e)) return;\n            const listItem = document.createElement('li');\n            listItem.innerHTML = item.name; // 从textContent改为innerHTML，可以使用html标签嵌套\n            listItem.addEventListener(item.event || 'click', (e_self) => {\n                if (!item.callback(e, e_self)) {\n                    contextMenuCard.onblur = null;  // 如果没有这行，onblur会在contextMenuCard被item删除后再次触发删除，引发报错\n                    contextMenuCard.remove();\n                }\n            });\n            contextMenuCard.appendChild(listItem);\n        });\n        if (contextMenuCard.children.length === 0 && !this.mustShow) return;\n\n        contextMenuCard.style.top = `${e.clientY}px`;\n        contextMenuCard.style.left = `${e.clientX}px`;\n\n        // 添加blur事件监听器\n        contextMenuCard.tabIndex = -1; // 使元素可以接收焦点\n        contextMenuCard.onblur = (e) => {\n            // 如果在contextMenuCard内部点击，就不删除contextMenuCard\n            if (e.relatedTarget && e.relatedTarget.classList.contains('contextMenuCard')) {\n                e.stopPropagation();\n                return;\n            }\n            contextMenuCard.remove();\n        }\n        setTimeout(() => {\n            document.body.appendChild(contextMenuCard);\n            // 使元素立即获取焦点(要设置css:focue属性：outline:none;)\n            contextMenuCard.focus();\n        }, 0);  // 延时是因为让show可以被mousedown事件调用（否则mousedown触发后再触发contextmenu将导致菜单消失）\n    }\n}\n"
  },
  {
    "path": "ui/myRange.js",
    "content": "class myRange extends HTMLInputElement {\n    /**\n     * 设置原型并初始化\n     * @param {HTMLInputElement} ele \n     * @returns {myRange}\n     */\n    static new(ele) {\n        Object.setPrototypeOf(ele, myRange.prototype);\n        myRange.prototype.init.call(ele);\n        return ele;\n    }\n    /**\n     * 设置一个容器\n     * 执行了构造函数的内容\n     */\n    init() {\n        this.default = super.value; // 默认值在html中设置\n        this.container = document.createElement('div');\n        this.container.classList.add('myrange');\n        this.insertAdjacentElement('beforebegin', this.container);\n        // 将当前元素插入到容器中\n        this.container.appendChild(this);\n        this.addEventListener('click', this.blur);  // 极速取消焦点 防止空格触发\n    }\n    set value(v) {\n        super.value = v;\n        this.dispatchEvent(new Event('input'));\n    }\n    get value() {\n        return super.value;\n    }\n    reset() {\n        this.value = this.default;\n        return this;    // 可以链式调用，比如let r = myRange.new(document.querySelector('input')).reset();\n    }\n}\n\nclass LableRange extends myRange {\n    static new(ele) {\n        Object.setPrototypeOf(ele, LableRange.prototype);\n        LableRange.prototype.init.call(ele);\n        return ele;\n    }\n    /**\n     * 添加一个容器、标签\n     */\n    init() {\n        super.init();\n        this.container.classList.add('labelrange');\n        // 设置标签显示当前值\n        this.label = document.createElement('span');\n        this.label.className = \"thelabel\";\n        this.insertAdjacentElement('afterend', this.label);\n        // 设置label的宽度固定为range的最大值的宽度\n        if (!this.max) this.max = 100;\n        let maxStepStr = (this.max - this.step).toFixed(10).replace(/\\.?0+$/, ''); // 限制小数位数并去除末尾的零\n        let len = Math.max(this.max.toString().length, maxStepStr.length);\n        this.label.style.width = `${len}ch`;\n        this.addEventListener('input', () => {\n            this.updateLabel(); // 【不直接传函数，可以篡改this.updateLabel】\n        });\n        // 标签的另一个作用：重置range的值\n        this.label.addEventListener('click', this.reset.bind(this));\n        // 【没有初始化label，需要用户手动调用reset()】\n    }\n    updateLabel() {\n        this.label.textContent = super.value;\n    }\n}\n\nclass hideLableRange extends myRange {\n    static _expand = 16;    // 和css有关 滑块的宽度\n    static new(ele) {\n        Object.setPrototypeOf(ele, hideLableRange.prototype);\n        hideLableRange.prototype.init.call(ele);\n        return ele;\n    }\n    /**\n     * 添加一个容器、标签\n     */\n    init() {\n        super.init();\n        this.container.classList.add('hidelabelrange');\n        // 设置标签显示当前值\n        this.label = document.createElement('span');\n        this.label.className = \"thelabel\";\n        this.insertAdjacentElement('afterend', this.label);\n        this.addEventListener('input', () => {\n            this.updateLabel(); // 【不直接传函数，可以篡改this.updateLabel】\n        });\n        // 标签的另一个作用：重置range的值\n        this.label.addEventListener('click', this.reset.bind(this));\n        // 【没有初始化label，需要用户手动调用reset()】\n        // 滑动时显示label\n        this.label.style.display = 'none';\n        this.addEventListener('focus', function () {\n            this.label.style.display = 'block';\n        });\n        this.addEventListener('blur', function () {\n            this.label.style.display = 'none';\n        });\n        this.addEventListener('input', this.labelPosition);\n    }\n    updateLabel() {\n        this.label.textContent = super.value;\n    }\n    labelPosition() {\n        let rangeRect = this.getBoundingClientRect();\n        let rangeWidth = rangeRect.width - hideLableRange._expand;\n        this.label.style.left = `${((this.value - this.min) / (this.max - this.min)) * rangeWidth + (hideLableRange._expand >> 1)}px`;\n    }\n}"
  },
  {
    "path": "ui/siderMenu.js",
    "content": "class SiderContent extends HTMLDivElement {\n    static new(ele, minWidth) {\n        Object.setPrototypeOf(ele, SiderContent.prototype);\n        SiderContent.prototype.init.call(ele, minWidth);\n        return ele;\n    }\n    init(minWidth) {\n        this.resize = this._resize.bind(this);\n        this.mouseup = this._mouseup.bind(this);\n        this.mousedown = this._mousedown.bind(this);\n\n        this.classList.add('siderContent');\n        this.minWidth = minWidth;\n        this.judge = (minWidth >> 1) + this.getBoundingClientRect().left;\n        this.style.width = minWidth + 'px';\n\n        const bar = document.createElement('div');\n        bar.className = 'siderBar';\n        this.insertAdjacentElement('afterend', bar);\n        bar.addEventListener('mousedown', this.mousedown);\n        this.bar = bar;\n    }\n    _mousedown(e) {\n        if (e.button) return;\n        document.addEventListener('mousemove', this.resize);\n        document.addEventListener('mouseup', this.mouseup);\n    }\n    _resize(e) {\n        if (e.clientX < this.judge) this.display = 'none';\n        else {\n            let rect = this.getBoundingClientRect();\n            let w = e.clientX - rect.left;\n            if (w < this.minWidth) return;\n            // 触发刷新\n            this.width = w + 'px';\n            this.display = 'block';\n        }\n    }\n    _mouseup() {\n        document.removeEventListener('mousemove', this.resize);\n        document.removeEventListener('mouseup', this.mouseup);\n        this.bar.blur();\n        window.dispatchEvent(new Event(\"resize\"));  // 触发app.resize\n    }\n    get display() {\n        return this.style.display;\n    }\n    // 设置display可以触发刷新 因为app.resize绑定在window.onresize上\n    set display(state) {\n        if (this.style.display != state) {\n            this.style.display = state;\n            window.dispatchEvent(new Event(\"resize\"));\n        }\n    }\n    get width() {\n        return this.style.width;\n    }\n    set width(w) {\n        if (this.style.width != w) {\n            this.style.width = w;\n            window.dispatchEvent(new Event(\"resize\"));\n        }\n    }\n}\n\nclass SiderMenu extends HTMLDivElement {\n    /**\n     * 构造tabMenu和container\n     * @param {HTMLDivElement} menu 存放tab的 样式: .siderTabs 每一个tab: .siderTab\n     * @param {HTMLDivElement} container 展示具体内容的 样式: .siderContent 拖动条: .siderBar 每一个子内容都会加上siderItem类\n     * @param {number} minWidth 展示具体内容的最小宽度\n     * @returns {SiderMenu} 构造好的SiderMenu\n     */\n    static new(menu, container, minWidth) {\n        Object.setPrototypeOf(menu, SiderMenu.prototype);\n        SiderMenu.prototype.init.call(menu, container, minWidth);\n        return menu;\n    }\n    init(box, minWidth) {\n        this.classList.add('siderTabs');\n        this.container = SiderContent.new(box, minWidth);\n        box.display = 'none';\n        this.tabClick = this._tabClick.bind(this);\n        this.tabs = [];\n    }\n    /**\n     * 添加一个菜单项及其内容\n     * @param {string} name tab的名字\n     * @param {string} tabClass tab的类名 用空格分隔\n     * @param {HTMLElement} dom tab对应的内容\n     * @param {boolean} selected 是否默认选中\n     * @returns {HTMLDivElement} 添加的tab .item是dom .dataset.name是名称\n     */\n    add(name, tabClass, dom, selected = false) {\n        const tab = document.createElement('div');\n        tab.className = 'siderTab';\n        tab.classList.add(...tabClass.split(' '));\n        tab.dataset.name = name;\n\n        this.container.appendChild(dom);\n        dom.classList.add('siderItem');\n        dom.style.display = 'none';\n        tab.item = dom;\n\n        tab.addEventListener('click', this.tabClick);\n        this.appendChild(tab);\n        if (this.tabs.push(tab) == 1) {\n            tab.classList.add('selected');\n            dom.style.display = 'block';\n        } else if (selected) this.select(tab);\n        return tab;\n    }\n    /**\n     * 选中一个标签\n     * @param {HTMLDivElement || Number} tab \n     * @returns {HTMLDivElement} 选择的标签\n     */\n    select(tab) {\n        if (typeof tab == 'number') tab = this.tabs[tab];\n        if (!tab) return;\n        for (const t of this.tabs) {\n            t.classList.remove('selected');\n            t.item.style.display = 'none';\n        }\n        tab.classList.add('selected');\n        tab.item.style.display = 'block';\n        return tab;\n    }\n    /**\n     * 控制面板的显示\n     * @param {boolean} ifshow 是否显示面板\n     */\n    show(ifshow = true) {\n        this.container.display = ifshow ? 'block' : 'none';\n    }\n    // 绑定给tab用，不应该用户被调用\n    _tabClick(e) {\n        const tab = e.target;\n        if (tab.classList.contains('selected')) {    // 如果显示的就是tab的，则隐藏\n            // 用style.dispaly是读取，用.display = 是为了刷新\n            this.container.display = this.container.style.display == 'none' ? 'block' : 'none';\n        } else {    // 否则只显示tab的\n            for (const t of this.tabs) {\n                t.classList.remove('selected');\n                t.item.style.display = 'none';\n            }\n            tab.classList.add('selected');\n            this.container.display = 'block';\n        }\n        tab.item.style.display = 'block';\n        tab.blur();\n    }\n}"
  }
]