{"action":"created","comment":{"url":"https://api.github.com/repos/symfony/symfony/pulls/comments/68067523","id":68067523,"diff_hunk":"@@ -0,0 +1,204 @@\n+<?php\n+\n+/*\n+ * This file is part of the Symfony package.\n+ *\n+ * (c) Fabien Potencier <fabien@symfony.com>\n+ *\n+ * For the full copyright and license information, please view the LICENSE\n+ * file that was distributed with this source code.\n+ */\n+\n+namespace Symfony\\Component\\Workflow\\Dumper;\n+\n+use Symfony\\Component\\Workflow\\Definition;\n+use Symfony\\Component\\Workflow\\Marking;\n+use Symfony\\Component\\Workflow\\Transition;\n+\n+/**\n+ * GraphvizDumper dumps a workflow as a graphviz file.\n+ *\n+ * You can convert the generated dot file with the dot utility (http://www.graphviz.org/):\n+ *\n+ *   dot -Tpng workflow.dot > workflow.png\n+ *\n+ * @author Fabien Potencier <fabien@symfony.com>\n+ * @author Grégoire Pineau <lyrixx@lyrixx.info>\n+ */\n+class GraphvizDumper implements DumperInterface\n+{\n+    private static $defaultOptions = array(\n+        'graph' => array('ratio' => 'compress', 'rankdir' => 'LR'),\n+        'node' => array('fontsize' => 9, 'fontname' => 'Arial', 'color' => '#333333', 'fillcolor' => 'lightblue', 'fixedsize' => true, 'width' => 1),\n+        'edge' => array('fontsize' => 9, 'fontname' => 'Arial', 'color' => '#333333', 'arrowhead' => 'normal', 'arrowsize' => 0.5),\n+    );\n+\n+    /**\n+     * Dumps the workflow as a graphviz graph.\n+     *\n+     * Available options:\n+     *\n+     *  * graph: The default options for the whole graph\n+     *  * node: The default options for nodes (places + transitions)\n+     *  * edge: The default options for edges\n+     *\n+     * {@inheritdoc}\n+     */\n+    public function dump(Definition $definition, Marking $marking = null, array $options = array())\n+    {\n+        $places = $this->findPlaces($definition, $marking);\n+        $transitions = $this->findTransitions($definition);\n+        $edges = $this->findEdges($definition);\n+\n+        $options = array_replace_recursive(self::$defaultOptions, $options);\n+\n+        return $this->startDot($options)\n+            .$this->addPlaces($places)\n+            .$this->addTransitions($transitions)\n+            .$this->addEdges($edges)\n+            .$this->endDot();\n+    }\n+\n+    private function findPlaces(Definition $definition, Marking $marking = null)\n+    {\n+        $places = array();\n+\n+        foreach ($definition->getPlaces() as $place) {\n+            $attributes = [];","path":"src/Symfony/Component/Workflow/Dumper/GraphvizDumper.php","position":null,"original_position":67,"commit_id":"7606fa9691e57aa1e837c450d841a8aa0ec090b5","original_commit_id":"2c1867ec4c1a628b48666f163d768b4c483a3c87","user":{"login":"dosten","id":510842,"avatar_url":"https://avatars.githubusercontent.com/u/510842?v=3","gravatar_id":"","url":"https://api.github.com/users/dosten","html_url":"https://github.com/dosten","followers_url":"https://api.github.com/users/dosten/followers","following_url":"https://api.github.com/users/dosten/following{/other_user}","gists_url":"https://api.github.com/users/dosten/gists{/gist_id}","starred_url":"https://api.github.com/users/dosten/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dosten/subscriptions","organizations_url":"https://api.github.com/users/dosten/orgs","repos_url":"https://api.github.com/users/dosten/repos","events_url":"https://api.github.com/users/dosten/events{/privacy}","received_events_url":"https://api.github.com/users/dosten/received_events","type":"User","site_admin":false},"body":"Since this PR is going to be merged into 3.2 which requires PHP >=5.5 we can use the short syntax.","created_at":"2016-06-22T14:52:04Z","updated_at":"2016-06-22T14:52:04Z","html_url":"https://github.com/symfony/symfony/pull/11882#discussion_r68067523","pull_request_url":"https://api.github.com/repos/symfony/symfony/pulls/11882","_links":{"self":{"href":"https://api.github.com/repos/symfony/symfony/pulls/comments/68067523"},"html":{"href":"https://github.com/symfony/symfony/pull/11882#discussion_r68067523"},"pull_request":{"href":"https://api.github.com/repos/symfony/symfony/pulls/11882"}}},"pull_request":{"url":"https://api.github.com/repos/symfony/symfony/pulls/11882","id":20902492,"html_url":"https://github.com/symfony/symfony/pull/11882","diff_url":"https://github.com/symfony/symfony/pull/11882.diff","patch_url":"https://github.com/symfony/symfony/pull/11882.patch","issue_url":"https://api.github.com/repos/symfony/symfony/issues/11882","number":11882,"state":"open","locked":false,"title":"[Workflow] Introducing the workflow component","user":{"login":"lyrixx","id":408368,"avatar_url":"https://avatars.githubusercontent.com/u/408368?v=3","gravatar_id":"","url":"https://api.github.com/users/lyrixx","html_url":"https://github.com/lyrixx","followers_url":"https://api.github.com/users/lyrixx/followers","following_url":"https://api.github.com/users/lyrixx/following{/other_user}","gists_url":"https://api.github.com/users/lyrixx/gists{/gist_id}","starred_url":"https://api.github.com/users/lyrixx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lyrixx/subscriptions","organizations_url":"https://api.github.com/users/lyrixx/orgs","repos_url":"https://api.github.com/users/lyrixx/repos","events_url":"https://api.github.com/users/lyrixx/events{/privacy}","received_events_url":"https://api.github.com/users/lyrixx/received_events","type":"User","site_admin":false},"body":"| Q             | A\r\n| ------------- | ---\r\n| Bug fix?      | no\r\n| New feature?  | yes\r\n| BC breaks?    | no\r\n| Deprecations? | no\r\n| Tests pass?   | not yet\r\n| Fixed tickets | n/a\r\n| License       | MIT\r\n| Doc PR        | n/a\r\n\r\nTODO:\r\n\r\n* [x] Add tests\r\n* [x] Add PHP doc\r\n* [x] Add Symfony fullstack integration (Config, DIC, command to dump the state-machine into graphiz format)\r\n\r\nSo why another component?\r\n\r\nThis component take another approach that what you can find on [Packagist](https://packagist.org/search/?q=state%20machine).\r\n\r\nHere, the workflow component is not tied to a specific object like with [Finite](https://github.com/yohang/Finite). It means that the component workflow is stateless and can be a symfony service.\r\n\r\nSome code:\r\n\r\n```php\r\n#!/usr/bin/env php\r\n<?php\r\n\r\nrequire __DIR__.'/vendor/autoload.php';\r\n\r\nuse Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher;\r\nuse Symfony\\Component\\EventDispatcher\\EventDispatcher;\r\nuse Symfony\\Component\\Stopwatch\\Stopwatch;\r\nuse Symfony\\Component\\Workflow\\Definition;\r\nuse Symfony\\Component\\Workflow\\Dumper\\GraphvizDumper;\r\nuse Symfony\\Component\\Workflow\\Marking;\r\nuse Symfony\\Component\\Workflow\\MarkingStore\\PropertyAccessorMarkingStore;\r\nuse Symfony\\Component\\Workflow\\MarkingStore\\ScalarMarkingStore;\r\nuse Symfony\\Component\\Workflow\\Transition;\r\nuse Symfony\\Component\\Workflow\\Workflow;\r\n\r\nclass Foo\r\n{\r\n    public $marking;\r\n\r\n    public function __construct($init = 'a')\r\n    {\r\n        $this->marking = $init;\r\n        $this->marking = [$init => true];\r\n    }\r\n}\r\n\r\n$fooDefinition = new Definition(Foo::class);\r\n$fooDefinition->addPlaces([\r\n    'a', 'b', 'c', 'd', 'e', 'f', 'g',\r\n]);\r\n\r\n//                                           name  from        to\r\n$fooDefinition->addTransition(new Transition('t1', 'a',        ['b', 'c']));\r\n$fooDefinition->addTransition(new Transition('t2', ['b', 'c'],  'd'));\r\n$fooDefinition->addTransition(new Transition('t3', 'd',         'e'));\r\n$fooDefinition->addTransition(new Transition('t4', 'd',         'f'));\r\n$fooDefinition->addTransition(new Transition('t5', 'e',         'g'));\r\n$fooDefinition->addTransition(new Transition('t6', 'f',         'g'));\r\n\r\n$graph = (new GraphvizDumper())->dump($fooDefinition);\r\n\r\n$ed = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch(), new \\Monolog\\Logger('app'));\r\n\r\n// $workflow = new Workflow($fooDefinition, new ScalarMarkingStore(), $ed);\r\n$workflow = new Workflow($fooDefinition, new PropertyAccessorMarkingStore(), $ed);\r\n\r\n$foo = new Foo(isset($argv[1]) ? $argv[1] : 'a');\r\n\r\n$graph = (new GraphvizDumper())->dump($fooDefinition, $workflow->getMarking($foo));\r\n\r\ndump([\r\n    'AvailableTransitions' => $workflow->getAvailableTransitions($foo),\r\n    'CurrentMarking' => clone $workflow->getMarking($foo),\r\n    'can validate t1' => $workflow->can($foo, 't1'),\r\n    'can validate t3' => $workflow->can($foo, 't3'),\r\n    'can validate t6' => $workflow->can($foo, 't6'),\r\n    'apply t1' => clone $workflow->apply($foo, 't1'),\r\n    'can validate t2' => $workflow->can($foo, 't2'),\r\n    'apply t2' => clone $workflow->apply($foo, 't2'),\r\n    'can validate t1 bis' => $workflow->can($foo, 't1'),\r\n    'can validate t3 bis' => $workflow->can($foo, 't3'),\r\n    'can validate t6 bis' => $workflow->can($foo, 't6'),\r\n]);\r\n\r\n```\r\n\r\nThe workflown:\r\n\r\n![workflow](https://cloud.githubusercontent.com/assets/408368/14183999/4a43483c-f773-11e5-9c8b-7f157e0cb75f.png)\r\n\r\nThe output:\r\n\r\n```\r\narray:10 [\r\n  \"AvailableTransitions\" => array:1 [\r\n    0 => Symfony\\Component\\Workflow\\Transition {#4\r\n      -name: \"t1\"\r\n      -froms: array:1 [\r\n        0 => \"a\"\r\n      ]\r\n      -tos: array:2 [\r\n        0 => \"b\"\r\n        1 => \"c\"\r\n      ]\r\n    }\r\n  ]\r\n  \"CurrentMarking\" => Symfony\\Component\\Workflow\\Marking {#19\r\n    -places: array:1 [\r\n      \"a\" => true\r\n    ]\r\n  }\r\n  \"can validate t1\" => true\r\n  \"can validate t3\" => false\r\n  \"can validate t6\" => false\r\n  \"apply t1\" => Symfony\\Component\\Workflow\\Marking {#22\r\n    -places: array:2 [\r\n      \"b\" => true\r\n      \"c\" => true\r\n    ]\r\n  }\r\n  \"apply t2\" => Symfony\\Component\\Workflow\\Marking {#47\r\n    -places: array:1 [\r\n      \"d\" => true\r\n    ]\r\n  }\r\n  \"can validate t1 bis\" => false\r\n  \"can validate t3 bis\" => true\r\n  \"can validate t6 bis\" => false\r\n]\r\n```","created_at":"2014-09-08T16:55:24Z","updated_at":"2016-06-22T14:52:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f878abeeed5ed6afc4c48ebe4d6e76d878044f1d","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/symfony/symfony/pulls/11882/commits","review_comments_url":"https://api.github.com/repos/symfony/symfony/pulls/11882/comments","review_comment_url":"https://api.github.com/repos/symfony/symfony/pulls/comments{/number}","comments_url":"https://api.github.com/repos/symfony/symfony/issues/11882/comments","statuses_url":"https://api.github.com/repos/symfony/symfony/statuses/7606fa9691e57aa1e837c450d841a8aa0ec090b5","head":{"label":"lyrixx:component-workflow","ref":"component-workflow","sha":"7606fa9691e57aa1e837c450d841a8aa0ec090b5","user":{"login":"lyrixx","id":408368,"avatar_url":"https://avatars.githubusercontent.com/u/408368?v=3","gravatar_id":"","url":"https://api.github.com/users/lyrixx","html_url":"https://github.com/lyrixx","followers_url":"https://api.github.com/users/lyrixx/followers","following_url":"https://api.github.com/users/lyrixx/following{/other_user}","gists_url":"https://api.github.com/users/lyrixx/gists{/gist_id}","starred_url":"https://api.github.com/users/lyrixx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lyrixx/subscriptions","organizations_url":"https://api.github.com/users/lyrixx/orgs","repos_url":"https://api.github.com/users/lyrixx/repos","events_url":"https://api.github.com/users/lyrixx/events{/privacy}","received_events_url":"https://api.github.com/users/lyrixx/received_events","type":"User","site_admin":false},"repo":{"id":3148495,"name":"symfony","full_name":"lyrixx/symfony","owner":{"login":"lyrixx","id":408368,"avatar_url":"https://avatars.githubusercontent.com/u/408368?v=3","gravatar_id":"","url":"https://api.github.com/users/lyrixx","html_url":"https://github.com/lyrixx","followers_url":"https://api.github.com/users/lyrixx/followers","following_url":"https://api.github.com/users/lyrixx/following{/other_user}","gists_url":"https://api.github.com/users/lyrixx/gists{/gist_id}","starred_url":"https://api.github.com/users/lyrixx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lyrixx/subscriptions","organizations_url":"https://api.github.com/users/lyrixx/orgs","repos_url":"https://api.github.com/users/lyrixx/repos","events_url":"https://api.github.com/users/lyrixx/events{/privacy}","received_events_url":"https://api.github.com/users/lyrixx/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/lyrixx/symfony","description":"The Symfony2 PHP framework","fork":true,"url":"https://api.github.com/repos/lyrixx/symfony","forks_url":"https://api.github.com/repos/lyrixx/symfony/forks","keys_url":"https://api.github.com/repos/lyrixx/symfony/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lyrixx/symfony/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lyrixx/symfony/teams","hooks_url":"https://api.github.com/repos/lyrixx/symfony/hooks","issue_events_url":"https://api.github.com/repos/lyrixx/symfony/issues/events{/number}","events_url":"https://api.github.com/repos/lyrixx/symfony/events","assignees_url":"https://api.github.com/repos/lyrixx/symfony/assignees{/user}","branches_url":"https://api.github.com/repos/lyrixx/symfony/branches{/branch}","tags_url":"https://api.github.com/repos/lyrixx/symfony/tags","blobs_url":"https://api.github.com/repos/lyrixx/symfony/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lyrixx/symfony/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lyrixx/symfony/git/refs{/sha}","trees_url":"https://api.github.com/repos/lyrixx/symfony/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lyrixx/symfony/statuses/{sha}","languages_url":"https://api.github.com/repos/lyrixx/symfony/languages","stargazers_url":"https://api.github.com/repos/lyrixx/symfony/stargazers","contributors_url":"https://api.github.com/repos/lyrixx/symfony/contributors","subscribers_url":"https://api.github.com/repos/lyrixx/symfony/subscribers","subscription_url":"https://api.github.com/repos/lyrixx/symfony/subscription","commits_url":"https://api.github.com/repos/lyrixx/symfony/commits{/sha}","git_commits_url":"https://api.github.com/repos/lyrixx/symfony/git/commits{/sha}","comments_url":"https://api.github.com/repos/lyrixx/symfony/comments{/number}","issue_comment_url":"https://api.github.com/repos/lyrixx/symfony/issues/comments{/number}","contents_url":"https://api.github.com/repos/lyrixx/symfony/contents/{+path}","compare_url":"https://api.github.com/repos/lyrixx/symfony/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lyrixx/symfony/merges","archive_url":"https://api.github.com/repos/lyrixx/symfony/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lyrixx/symfony/downloads","issues_url":"https://api.github.com/repos/lyrixx/symfony/issues{/number}","pulls_url":"https://api.github.com/repos/lyrixx/symfony/pulls{/number}","milestones_url":"https://api.github.com/repos/lyrixx/symfony/milestones{/number}","notifications_url":"https://api.github.com/repos/lyrixx/symfony/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lyrixx/symfony/labels{/name}","releases_url":"https://api.github.com/repos/lyrixx/symfony/releases{/id}","deployments_url":"https://api.github.com/repos/lyrixx/symfony/deployments","created_at":"2012-01-10T20:46:58Z","updated_at":"2015-02-12T12:35:28Z","pushed_at":"2016-06-22T14:46:44Z","git_url":"git://github.com/lyrixx/symfony.git","ssh_url":"git@github.com:lyrixx/symfony.git","clone_url":"https://github.com/lyrixx/symfony.git","svn_url":"https://github.com/lyrixx/symfony","homepage":"symfony.com","size":72804,"stargazers_count":2,"watchers_count":2,"language":"PHP","has_issues":false,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":0,"forks":4,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"symfony:master","ref":"master","sha":"1298ce51cb08b6cf780784056e723fd542db84cc","user":{"login":"symfony","id":143937,"avatar_url":"https://avatars.githubusercontent.com/u/143937?v=3","gravatar_id":"","url":"https://api.github.com/users/symfony","html_url":"https://github.com/symfony","followers_url":"https://api.github.com/users/symfony/followers","following_url":"https://api.github.com/users/symfony/following{/other_user}","gists_url":"https://api.github.com/users/symfony/gists{/gist_id}","starred_url":"https://api.github.com/users/symfony/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/symfony/subscriptions","organizations_url":"https://api.github.com/users/symfony/orgs","repos_url":"https://api.github.com/users/symfony/repos","events_url":"https://api.github.com/users/symfony/events{/privacy}","received_events_url":"https://api.github.com/users/symfony/received_events","type":"Organization","site_admin":false},"repo":{"id":458058,"name":"symfony","full_name":"symfony/symfony","owner":{"login":"symfony","id":143937,"avatar_url":"https://avatars.githubusercontent.com/u/143937?v=3","gravatar_id":"","url":"https://api.github.com/users/symfony","html_url":"https://github.com/symfony","followers_url":"https://api.github.com/users/symfony/followers","following_url":"https://api.github.com/users/symfony/following{/other_user}","gists_url":"https://api.github.com/users/symfony/gists{/gist_id}","starred_url":"https://api.github.com/users/symfony/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/symfony/subscriptions","organizations_url":"https://api.github.com/users/symfony/orgs","repos_url":"https://api.github.com/users/symfony/repos","events_url":"https://api.github.com/users/symfony/events{/privacy}","received_events_url":"https://api.github.com/users/symfony/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/symfony/symfony","description":"The Symfony PHP framework","fork":false,"url":"https://api.github.com/repos/symfony/symfony","forks_url":"https://api.github.com/repos/symfony/symfony/forks","keys_url":"https://api.github.com/repos/symfony/symfony/keys{/key_id}","collaborators_url":"https://api.github.com/repos/symfony/symfony/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/symfony/symfony/teams","hooks_url":"https://api.github.com/repos/symfony/symfony/hooks","issue_events_url":"https://api.github.com/repos/symfony/symfony/issues/events{/number}","events_url":"https://api.github.com/repos/symfony/symfony/events","assignees_url":"https://api.github.com/repos/symfony/symfony/assignees{/user}","branches_url":"https://api.github.com/repos/symfony/symfony/branches{/branch}","tags_url":"https://api.github.com/repos/symfony/symfony/tags","blobs_url":"https://api.github.com/repos/symfony/symfony/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/symfony/symfony/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/symfony/symfony/git/refs{/sha}","trees_url":"https://api.github.com/repos/symfony/symfony/git/trees{/sha}","statuses_url":"https://api.github.com/repos/symfony/symfony/statuses/{sha}","languages_url":"https://api.github.com/repos/symfony/symfony/languages","stargazers_url":"https://api.github.com/repos/symfony/symfony/stargazers","contributors_url":"https://api.github.com/repos/symfony/symfony/contributors","subscribers_url":"https://api.github.com/repos/symfony/symfony/subscribers","subscription_url":"https://api.github.com/repos/symfony/symfony/subscription","commits_url":"https://api.github.com/repos/symfony/symfony/commits{/sha}","git_commits_url":"https://api.github.com/repos/symfony/symfony/git/commits{/sha}","comments_url":"https://api.github.com/repos/symfony/symfony/comments{/number}","issue_comment_url":"https://api.github.com/repos/symfony/symfony/issues/comments{/number}","contents_url":"https://api.github.com/repos/symfony/symfony/contents/{+path}","compare_url":"https://api.github.com/repos/symfony/symfony/compare/{base}...{head}","merges_url":"https://api.github.com/repos/symfony/symfony/merges","archive_url":"https://api.github.com/repos/symfony/symfony/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/symfony/symfony/downloads","issues_url":"https://api.github.com/repos/symfony/symfony/issues{/number}","pulls_url":"https://api.github.com/repos/symfony/symfony/pulls{/number}","milestones_url":"https://api.github.com/repos/symfony/symfony/milestones{/number}","notifications_url":"https://api.github.com/repos/symfony/symfony/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/symfony/symfony/labels{/name}","releases_url":"https://api.github.com/repos/symfony/symfony/releases{/id}","deployments_url":"https://api.github.com/repos/symfony/symfony/deployments","created_at":"2010-01-04T14:21:21Z","updated_at":"2016-06-22T12:54:31Z","pushed_at":"2016-06-22T14:46:46Z","git_url":"git://github.com/symfony/symfony.git","ssh_url":"git@github.com:symfony/symfony.git","clone_url":"https://github.com/symfony/symfony.git","svn_url":"https://github.com/symfony/symfony","homepage":"symfony.com","size":133940,"stargazers_count":12533,"watchers_count":12533,"language":"PHP","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":4896,"mirror_url":null,"open_issues_count":686,"forks":4896,"open_issues":686,"watchers":12533,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/symfony/symfony/pulls/11882"},"html":{"href":"https://github.com/symfony/symfony/pull/11882"},"issue":{"href":"https://api.github.com/repos/symfony/symfony/issues/11882"},"comments":{"href":"https://api.github.com/repos/symfony/symfony/issues/11882/comments"},"review_comments":{"href":"https://api.github.com/repos/symfony/symfony/pulls/11882/comments"},"review_comment":{"href":"https://api.github.com/repos/symfony/symfony/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/symfony/symfony/pulls/11882/commits"},"statuses":{"href":"https://api.github.com/repos/symfony/symfony/statuses/7606fa9691e57aa1e837c450d841a8aa0ec090b5"}}}}
{"actor":{"display_login":"dosten"}}