{"action":"created","comment":{"url":"https://api.github.com/repos/lsst/meas_algorithms/pulls/comments/62069704","id":62069704,"diff_hunk":"@@ -0,0 +1,260 @@\n+#\n+# LSST Data Management System\n+# Copyright 2008-2016 AURA/LSST.\n+#\n+# This product includes software developed by the\n+# LSST Project (http://www.lsst.org/).\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 LSST License Statement and\n+# the GNU General Public License along with this program.  If not,\n+# see <https://www.lsstcorp.org/LegalNotices/>.\n+#\n+import numpy\n+\n+import lsstDebug\n+import lsst.afw.display.ds9 as ds9\n+import lsst.afw.image as afwImage\n+import lsst.afw.math as afwMath\n+import lsst.pex.config as pexConfig\n+import lsst.pipe.base as pipeBase\n+\n+__all__ = (\"SubtractBackgroundConfig\", \"SubtractBackgroundTask\")\n+\n+class SubtractBackgroundConfig(pexConfig.Config):\n+    \"\"\"!Config for SubtractBackgroundTask and lsst::afw::math::makeBackground\n+\n+    @warning This config is automatically converted to an lsst::afw::math::BackgroundControl\n+    for lsst::afw::math::makeBackground, so do not change the field names or types.\n+    \"\"\"\n+    statisticsProperty = pexConfig.ChoiceField(\n+        doc=\"type of statistic to use for grid points\",\n+        dtype=str, default=\"MEANCLIP\",\n+        allowed={\n+            \"MEANCLIP\": \"clipped mean\",\n+            \"MEAN\": \"unclipped mean\",\n+            \"MEDIAN\": \"median\",\n+            }\n+    )\n+    undersampleStyle = pexConfig.ChoiceField(\n+        doc=\"behaviour if there are too few points in grid for requested interpolation style\",\n+        dtype=str, default=\"REDUCE_INTERP_ORDER\",\n+        allowed={\n+            \"THROW_EXCEPTION\": \"throw an exception if there are too few points\",\n+            \"REDUCE_INTERP_ORDER\": \"use an interpolation style with a lower order.\",\n+            \"INCREASE_NXNYSAMPLE\": \"Increase the number of samples used to make the interpolation grid.\",\n+            },\n+    )\n+    binSize = pexConfig.RangeField(\n+        doc=\"how large a region of the sky should be used for each background point\",\n+        dtype=int, default=256, min=10,\n+    )\n+    algorithm = pexConfig.ChoiceField(\n+        doc=\"how to interpolate the background values. This maps to an enum; see afw::math::Background\",\n+        dtype=str, default=\"NATURAL_SPLINE\", optional=True,\n+        allowed={\n+            \"CONSTANT\" : \"Use a single constant value\",\n+            \"LINEAR\" : \"Use linear interpolation\",\n+            \"NATURAL_SPLINE\" : \"cubic spline with zero second derivative at endpoints\",\n+            \"AKIMA_SPLINE\": \"higher-level nonlinear spline that is more robust to outliers\",\n+            \"NONE\": \"No background estimation is to be attempted\",\n+            },\n+    )\n+    ignoredPixelMask = pexConfig.ListField(\n+        doc=\"Names of mask planes to ignore while estimating the background\",\n+        dtype=str, default = [\"BAD\", \"EDGE\", \"DETECTED\", \"DETECTED_NEGATIVE\", \"NO_DATA\",],\n+        itemCheck = lambda x: x in afwImage.MaskU().getMaskPlaneDict().keys(),\n+    )\n+    isNanSafe = pexConfig.Field(\n+        doc=\"Ignore NaNs when estimating the background\",\n+        dtype=bool, default=False,\n+    )\n+\n+    useApprox = pexConfig.Field(\n+        doc=\"Use Approximate (Chebyshev) to model background.\",\n+        dtype=bool, default=False,\n+    )\n+    approxOrderX = pexConfig.Field(\n+        doc=\"Approximation order in X for background Chebyshev (valid only with useApprox=True)\",\n+        dtype=int, default=6,\n+    )\n+    # Note: Currently X- and Y-orders must be equal due to a limitation in math::Chebyshev1Function2\n+    # The following is being added so that the weighting attribute can also be configurable for the\n+    # call to afwMath.ApproximateControl\n+    approxOrderY = pexConfig.Field(\n+        doc=\"Approximation order in Y for background Chebyshev (valid only with useApprox=True)\",\n+        dtype=int, default=-1,\n+    )\n+    weighting = pexConfig.Field(\n+        doc=\"Use inverse variance weighting in calculation (valid only with useApprox=True)\",\n+        dtype=bool, default=True,\n+    )\n+\n+    def validate(self):\n+        pexConfig.Config.validate(self)\n+        # Allow None to be used as an equivalent for \"NONE\", even though C++ expects the latter.\n+        if self.algorithm is None:\n+            self.algorithm = \"NONE\"\n+\n+class SubtractBackgroundTask(pipeBase.Task):\n+    ConfigClass = SubtractBackgroundConfig\n+    _DefaultName = \"subtractBackground\"\n+\n+    def run(self, exposure, background=None, stats=True, statsKeys=None):\n+        \"\"\"!Fit and subtract the background of an exposure\n+\n+        @param[in,out] exposure  exposure whose background is to be subtracted\n+        @param[in,out] background  initial background model already subtracted from exposure\n+            (an lsst.afw.math.BackgroundList). May be None if no background has been subtracted.\n+        @param[in] stats  if True then measure the mean and variance of the full background model\n+                        and record the results in the exposure's metadata\n+        @param[in] statsKeys  key names used to store the mean and variance of the background\n+            in the exposure's metadata (a pair of strings); if None then use (\"BGMEAN\", \"BGVAR\");\n+            ignored if stats is false\n+\n+        @return an lsst.pipe.base.Struct containing:\n+        - background  full background model (initial model with changes), an lsst.afw.math.BackgroundList\n+\n+        @throw RuntimeError if fitBackground returns a background of None\n+        \"\"\"\n+        displayBackground = lsstDebug.Info(__name__).displayBackground\n+\n+        if background is None:\n+            background = afwMath.BackgroundList()\n+\n+        maskedImage = exposure.getMaskedImage()\n+\n+        fitBg = self.fitBackground(maskedImage)\n+        if not fitBg:\n+            raise RuntimeError(\"Unable to estimate background for exposure\")\n+\n+        fitBgImg = fitBg.getImageF()\n+        maskedImage -= fitBgImg\n+        background.append(fitBg)\n+        del fitBgImg\n+\n+        if displayBackground > 1 or stats:\n+            netBgImg = background.getImage()\n+\n+        if displayBackground > 1:\n+            ds9.mtv(netBgImg, title=\"background\", frame=3)\n+\n+        # Record statistics of the background in the bgsub exposure metadata.\n+        # (lsst.daf.base.PropertySet)\n+        if stats:\n+            if statsKeys is None:\n+                statsKeys = (\"BGMEAN\", \"BGVAR\")\n+            mnkey, varkey = statsKeys\n+            meta = exposure.getMetadata()\n+            s = afwMath.makeStatistics(netBgImg, afwMath.MEAN | afwMath.VARIANCE)\n+            bgmean = s.getValue(afwMath.MEAN)\n+            bgvar = s.getValue(afwMath.VARIANCE)\n+            meta.addDouble(mnkey, bgmean)\n+            meta.addDouble(varkey, bgvar)\n+\n+        if displayBackground:\n+            ds9.mtv(exposure, title=\"subtracted\")\n+\n+        return pipeBase.Struct(","path":"python/lsst/meas/algorithms/subtractBackground.py","position":259,"original_position":167,"commit_id":"a851c75671570848cdc88284ecc4876a25b8d781","original_commit_id":"5ec1a9ac12b37698c4cee6b9b3eaba04226d7069","user":{"login":"r-owen","id":874176,"avatar_url":"https://avatars.githubusercontent.com/u/874176?v=3","gravatar_id":"","url":"https://api.github.com/users/r-owen","html_url":"https://github.com/r-owen","followers_url":"https://api.github.com/users/r-owen/followers","following_url":"https://api.github.com/users/r-owen/following{/other_user}","gists_url":"https://api.github.com/users/r-owen/gists{/gist_id}","starred_url":"https://api.github.com/users/r-owen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/r-owen/subscriptions","organizations_url":"https://api.github.com/users/r-owen/orgs","repos_url":"https://api.github.com/users/r-owen/repos","events_url":"https://api.github.com/users/r-owen/events{/privacy}","received_events_url":"https://api.github.com/users/r-owen/received_events","type":"User","site_admin":false},"body":"Run methods always return a Struct and it is exactly for being able to return additional items (such as statistics) in the future.","created_at":"2016-05-04T16:22:59Z","updated_at":"2016-05-04T16:22:59Z","html_url":"https://github.com/lsst/meas_algorithms/pull/24#discussion_r62069704","pull_request_url":"https://api.github.com/repos/lsst/meas_algorithms/pulls/24","_links":{"self":{"href":"https://api.github.com/repos/lsst/meas_algorithms/pulls/comments/62069704"},"html":{"href":"https://github.com/lsst/meas_algorithms/pull/24#discussion_r62069704"},"pull_request":{"href":"https://api.github.com/repos/lsst/meas_algorithms/pulls/24"}}},"pull_request":{"url":"https://api.github.com/repos/lsst/meas_algorithms/pulls/24","id":68794960,"html_url":"https://github.com/lsst/meas_algorithms/pull/24","diff_url":"https://github.com/lsst/meas_algorithms/pull/24.diff","patch_url":"https://github.com/lsst/meas_algorithms/pull/24.patch","issue_url":"https://api.github.com/repos/lsst/meas_algorithms/issues/24","number":24,"state":"open","locked":false,"title":"DM-5323","user":{"login":"r-owen","id":874176,"avatar_url":"https://avatars.githubusercontent.com/u/874176?v=3","gravatar_id":"","url":"https://api.github.com/users/r-owen","html_url":"https://github.com/r-owen","followers_url":"https://api.github.com/users/r-owen/followers","following_url":"https://api.github.com/users/r-owen/following{/other_user}","gists_url":"https://api.github.com/users/r-owen/gists{/gist_id}","starred_url":"https://api.github.com/users/r-owen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/r-owen/subscriptions","organizations_url":"https://api.github.com/users/r-owen/orgs","repos_url":"https://api.github.com/users/r-owen/repos","events_url":"https://api.github.com/users/r-owen/events{/privacy}","received_events_url":"https://api.github.com/users/r-owen/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-05-04T00:07:25Z","updated_at":"2016-05-04T16:22:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d9db42c516550fbc7733e47dd32a419b732445eb","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/lsst/meas_algorithms/pulls/24/commits","review_comments_url":"https://api.github.com/repos/lsst/meas_algorithms/pulls/24/comments","review_comment_url":"https://api.github.com/repos/lsst/meas_algorithms/pulls/comments{/number}","comments_url":"https://api.github.com/repos/lsst/meas_algorithms/issues/24/comments","statuses_url":"https://api.github.com/repos/lsst/meas_algorithms/statuses/a851c75671570848cdc88284ecc4876a25b8d781","head":{"label":"lsst:tickets/DM-5323","ref":"tickets/DM-5323","sha":"a851c75671570848cdc88284ecc4876a25b8d781","user":{"login":"lsst","id":1134504,"avatar_url":"https://avatars.githubusercontent.com/u/1134504?v=3","gravatar_id":"","url":"https://api.github.com/users/lsst","html_url":"https://github.com/lsst","followers_url":"https://api.github.com/users/lsst/followers","following_url":"https://api.github.com/users/lsst/following{/other_user}","gists_url":"https://api.github.com/users/lsst/gists{/gist_id}","starred_url":"https://api.github.com/users/lsst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lsst/subscriptions","organizations_url":"https://api.github.com/users/lsst/orgs","repos_url":"https://api.github.com/users/lsst/repos","events_url":"https://api.github.com/users/lsst/events{/privacy}","received_events_url":"https://api.github.com/users/lsst/received_events","type":"Organization","site_admin":false},"repo":{"id":23013343,"name":"meas_algorithms","full_name":"lsst/meas_algorithms","owner":{"login":"lsst","id":1134504,"avatar_url":"https://avatars.githubusercontent.com/u/1134504?v=3","gravatar_id":"","url":"https://api.github.com/users/lsst","html_url":"https://github.com/lsst","followers_url":"https://api.github.com/users/lsst/followers","following_url":"https://api.github.com/users/lsst/following{/other_user}","gists_url":"https://api.github.com/users/lsst/gists{/gist_id}","starred_url":"https://api.github.com/users/lsst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lsst/subscriptions","organizations_url":"https://api.github.com/users/lsst/orgs","repos_url":"https://api.github.com/users/lsst/repos","events_url":"https://api.github.com/users/lsst/events{/privacy}","received_events_url":"https://api.github.com/users/lsst/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/lsst/meas_algorithms","description":"LSST Data Management: astronomical measurement algorithms","fork":false,"url":"https://api.github.com/repos/lsst/meas_algorithms","forks_url":"https://api.github.com/repos/lsst/meas_algorithms/forks","keys_url":"https://api.github.com/repos/lsst/meas_algorithms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lsst/meas_algorithms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lsst/meas_algorithms/teams","hooks_url":"https://api.github.com/repos/lsst/meas_algorithms/hooks","issue_events_url":"https://api.github.com/repos/lsst/meas_algorithms/issues/events{/number}","events_url":"https://api.github.com/repos/lsst/meas_algorithms/events","assignees_url":"https://api.github.com/repos/lsst/meas_algorithms/assignees{/user}","branches_url":"https://api.github.com/repos/lsst/meas_algorithms/branches{/branch}","tags_url":"https://api.github.com/repos/lsst/meas_algorithms/tags","blobs_url":"https://api.github.com/repos/lsst/meas_algorithms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lsst/meas_algorithms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lsst/meas_algorithms/git/refs{/sha}","trees_url":"https://api.github.com/repos/lsst/meas_algorithms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lsst/meas_algorithms/statuses/{sha}","languages_url":"https://api.github.com/repos/lsst/meas_algorithms/languages","stargazers_url":"https://api.github.com/repos/lsst/meas_algorithms/stargazers","contributors_url":"https://api.github.com/repos/lsst/meas_algorithms/contributors","subscribers_url":"https://api.github.com/repos/lsst/meas_algorithms/subscribers","subscription_url":"https://api.github.com/repos/lsst/meas_algorithms/subscription","commits_url":"https://api.github.com/repos/lsst/meas_algorithms/commits{/sha}","git_commits_url":"https://api.github.com/repos/lsst/meas_algorithms/git/commits{/sha}","comments_url":"https://api.github.com/repos/lsst/meas_algorithms/comments{/number}","issue_comment_url":"https://api.github.com/repos/lsst/meas_algorithms/issues/comments{/number}","contents_url":"https://api.github.com/repos/lsst/meas_algorithms/contents/{+path}","compare_url":"https://api.github.com/repos/lsst/meas_algorithms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lsst/meas_algorithms/merges","archive_url":"https://api.github.com/repos/lsst/meas_algorithms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lsst/meas_algorithms/downloads","issues_url":"https://api.github.com/repos/lsst/meas_algorithms/issues{/number}","pulls_url":"https://api.github.com/repos/lsst/meas_algorithms/pulls{/number}","milestones_url":"https://api.github.com/repos/lsst/meas_algorithms/milestones{/number}","notifications_url":"https://api.github.com/repos/lsst/meas_algorithms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lsst/meas_algorithms/labels{/name}","releases_url":"https://api.github.com/repos/lsst/meas_algorithms/releases{/id}","deployments_url":"https://api.github.com/repos/lsst/meas_algorithms/deployments","created_at":"2014-08-16T07:45:05Z","updated_at":"2016-01-19T02:15:54Z","pushed_at":"2016-05-04T15:33:37Z","git_url":"git://github.com/lsst/meas_algorithms.git","ssh_url":"git@github.com:lsst/meas_algorithms.git","clone_url":"https://github.com/lsst/meas_algorithms.git","svn_url":"https://github.com/lsst/meas_algorithms","homepage":"http://dm.lsst.org/","size":10585,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":2,"forks":3,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"lsst:master","ref":"master","sha":"3ec4b9e3e4623eab732d0f124e3e19a42925083e","user":{"login":"lsst","id":1134504,"avatar_url":"https://avatars.githubusercontent.com/u/1134504?v=3","gravatar_id":"","url":"https://api.github.com/users/lsst","html_url":"https://github.com/lsst","followers_url":"https://api.github.com/users/lsst/followers","following_url":"https://api.github.com/users/lsst/following{/other_user}","gists_url":"https://api.github.com/users/lsst/gists{/gist_id}","starred_url":"https://api.github.com/users/lsst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lsst/subscriptions","organizations_url":"https://api.github.com/users/lsst/orgs","repos_url":"https://api.github.com/users/lsst/repos","events_url":"https://api.github.com/users/lsst/events{/privacy}","received_events_url":"https://api.github.com/users/lsst/received_events","type":"Organization","site_admin":false},"repo":{"id":23013343,"name":"meas_algorithms","full_name":"lsst/meas_algorithms","owner":{"login":"lsst","id":1134504,"avatar_url":"https://avatars.githubusercontent.com/u/1134504?v=3","gravatar_id":"","url":"https://api.github.com/users/lsst","html_url":"https://github.com/lsst","followers_url":"https://api.github.com/users/lsst/followers","following_url":"https://api.github.com/users/lsst/following{/other_user}","gists_url":"https://api.github.com/users/lsst/gists{/gist_id}","starred_url":"https://api.github.com/users/lsst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lsst/subscriptions","organizations_url":"https://api.github.com/users/lsst/orgs","repos_url":"https://api.github.com/users/lsst/repos","events_url":"https://api.github.com/users/lsst/events{/privacy}","received_events_url":"https://api.github.com/users/lsst/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/lsst/meas_algorithms","description":"LSST Data Management: astronomical measurement algorithms","fork":false,"url":"https://api.github.com/repos/lsst/meas_algorithms","forks_url":"https://api.github.com/repos/lsst/meas_algorithms/forks","keys_url":"https://api.github.com/repos/lsst/meas_algorithms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lsst/meas_algorithms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lsst/meas_algorithms/teams","hooks_url":"https://api.github.com/repos/lsst/meas_algorithms/hooks","issue_events_url":"https://api.github.com/repos/lsst/meas_algorithms/issues/events{/number}","events_url":"https://api.github.com/repos/lsst/meas_algorithms/events","assignees_url":"https://api.github.com/repos/lsst/meas_algorithms/assignees{/user}","branches_url":"https://api.github.com/repos/lsst/meas_algorithms/branches{/branch}","tags_url":"https://api.github.com/repos/lsst/meas_algorithms/tags","blobs_url":"https://api.github.com/repos/lsst/meas_algorithms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lsst/meas_algorithms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lsst/meas_algorithms/git/refs{/sha}","trees_url":"https://api.github.com/repos/lsst/meas_algorithms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lsst/meas_algorithms/statuses/{sha}","languages_url":"https://api.github.com/repos/lsst/meas_algorithms/languages","stargazers_url":"https://api.github.com/repos/lsst/meas_algorithms/stargazers","contributors_url":"https://api.github.com/repos/lsst/meas_algorithms/contributors","subscribers_url":"https://api.github.com/repos/lsst/meas_algorithms/subscribers","subscription_url":"https://api.github.com/repos/lsst/meas_algorithms/subscription","commits_url":"https://api.github.com/repos/lsst/meas_algorithms/commits{/sha}","git_commits_url":"https://api.github.com/repos/lsst/meas_algorithms/git/commits{/sha}","comments_url":"https://api.github.com/repos/lsst/meas_algorithms/comments{/number}","issue_comment_url":"https://api.github.com/repos/lsst/meas_algorithms/issues/comments{/number}","contents_url":"https://api.github.com/repos/lsst/meas_algorithms/contents/{+path}","compare_url":"https://api.github.com/repos/lsst/meas_algorithms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lsst/meas_algorithms/merges","archive_url":"https://api.github.com/repos/lsst/meas_algorithms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lsst/meas_algorithms/downloads","issues_url":"https://api.github.com/repos/lsst/meas_algorithms/issues{/number}","pulls_url":"https://api.github.com/repos/lsst/meas_algorithms/pulls{/number}","milestones_url":"https://api.github.com/repos/lsst/meas_algorithms/milestones{/number}","notifications_url":"https://api.github.com/repos/lsst/meas_algorithms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lsst/meas_algorithms/labels{/name}","releases_url":"https://api.github.com/repos/lsst/meas_algorithms/releases{/id}","deployments_url":"https://api.github.com/repos/lsst/meas_algorithms/deployments","created_at":"2014-08-16T07:45:05Z","updated_at":"2016-01-19T02:15:54Z","pushed_at":"2016-05-04T15:33:37Z","git_url":"git://github.com/lsst/meas_algorithms.git","ssh_url":"git@github.com:lsst/meas_algorithms.git","clone_url":"https://github.com/lsst/meas_algorithms.git","svn_url":"https://github.com/lsst/meas_algorithms","homepage":"http://dm.lsst.org/","size":10585,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":2,"forks":3,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/lsst/meas_algorithms/pulls/24"},"html":{"href":"https://github.com/lsst/meas_algorithms/pull/24"},"issue":{"href":"https://api.github.com/repos/lsst/meas_algorithms/issues/24"},"comments":{"href":"https://api.github.com/repos/lsst/meas_algorithms/issues/24/comments"},"review_comments":{"href":"https://api.github.com/repos/lsst/meas_algorithms/pulls/24/comments"},"review_comment":{"href":"https://api.github.com/repos/lsst/meas_algorithms/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/lsst/meas_algorithms/pulls/24/commits"},"statuses":{"href":"https://api.github.com/repos/lsst/meas_algorithms/statuses/a851c75671570848cdc88284ecc4876a25b8d781"}}}}